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

Artifact f6d84f3a109d3e43d38089da6a4f131a5ce4c6ef:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  fset);.  sqlite3
0400: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0410: 2d 3e 70 57 69 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pWith);.}../*.
0420: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0430: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0440: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0450: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0460: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0470: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0480: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0490: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
04a0: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
04b0: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
04c0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04d0: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
04e0: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
04f0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0500: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0510: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0520: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0530: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0540: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0550: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0560: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0570: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0580: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0590: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
05a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
05b0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
05c0: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
05d0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
05e0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
05f0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0600: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0610: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0620: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0630: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0640: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0650: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0660: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0670: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0680: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0690: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
06a0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
06b0: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
06c0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
06d0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
06e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
06f0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0700: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0710: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0720: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0730: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0740: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0750: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0760: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0770: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0780: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0790: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
07a0: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
07b0: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07c0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07d0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07f0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0810: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0820: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0830: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0840: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0850: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0860: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0870: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0880: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0890: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
08a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
08b0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08c0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08d0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0900: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0910: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0920: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0930: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0940: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0950: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0960: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0970: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0980: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0990: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
09a0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09c0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09e0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09f0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0a00: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
0a10: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a20: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a30: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
0a40: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
0a50: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
0a60: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
0a70: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
0a80: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
0a90: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
0aa0: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
0ab0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0ac0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0ad0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ae0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0af0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0b00: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  ] = -1;.  if( db
0b10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0b20: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
0b30: 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ct(db, pNew);.  
0b40: 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61    if( pNew!=&sta
0b50: 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62  ndin ) sqlite3Db
0b60: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
0b70: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
0b80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
0b90: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
0ba0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
0bb0: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
0bc0: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
0bd0: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
0be0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0bf0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0c00: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0c10: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0c20: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0c40: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0c50: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0c60: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0c70: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0c80: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0c90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0ca0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0cb0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0cc0: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
0cd0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0ce0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0cf0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0d00: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0d10: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0d20: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0d30: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0d40: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0d50: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0d60: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0d70: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
0d80: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
0d90: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0da0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0db0: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0dc0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0dd0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0de0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0df0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0e00: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0e10: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0e20: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0e30: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0e40: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0e50: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0e60: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0e70: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0e80: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0e90: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
0ea0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0eb0: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0ec0: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0ed0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0ee0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0ef0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0f00: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
0f30: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
0f40: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
0f50: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0f60: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
0f70: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
0f80: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
0f90: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0fa0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
0fb0: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
0fc0: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
0fd0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
0fe0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
0ff0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
1000: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
1010: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
1020: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1030: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1040: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1050: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1060: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1070: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1080: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1090: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
10a0: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
10b0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
10c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
10d0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
10e0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
1110: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
1120: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1130: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1140: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1150: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1160: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1170: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1180: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1190: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
11a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
11b0: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
11c0: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
11d0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
11e0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
11f0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
1200: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
1210: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
1220: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1230: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1240: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1250: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1260: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1270: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1280: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1290: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
12a0: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
12b0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
12c0: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
12d0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
12e0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
12f0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1300: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1310: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1320: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1340: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1350: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1360: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1370: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1380: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1390: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
13a0: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
13b0: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
13c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
13e0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
13f0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1400: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1410: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1420: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1430: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1440: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1450: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1460: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1470: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1480: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1490: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14a0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
14b0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
14c0: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
14d0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
14e0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
14f0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1500: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1510: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1520: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1530: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1540: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1550: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1560: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1570: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1580: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1590: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
15a0: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
15b0: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
15c0: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
15d0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
15e0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
15f0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1600: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1610: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1620: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1630: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1640: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1650: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1670: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1680: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1690: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
16a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
16b0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
16c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
16d0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
16e0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
16f0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1700: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1710: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1720: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1730: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1740: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1750: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1760: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1770: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1780: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1790: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
17a0: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
17b0: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
17c0: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
17d0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
17e0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
17f0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1800: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1810: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1820: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
1830: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
1840: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
1850: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
1860: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
1870: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
1880: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
1890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18a0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
18b0: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
18c0: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
18d0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
18e0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
18f0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
1900: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
1910: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
1920: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
1930: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
1940: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
1950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1960: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
1970: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
1980: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
1990: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
19a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
19b0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
19c0: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
19d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
19e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19f0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
1a00: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
1a10: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
1a20: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
1a30: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
1a40: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
1a50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
1a60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
1a70: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
1a80: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
1a90: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
1aa0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
1ab0: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
1ac0: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
1ad0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
1ae0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
1af0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1b00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
1b20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1b30: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
1b40: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
1b50: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
1b60: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
1b70: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
1b80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1b90: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
1ba0: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
1bb0: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
1bc0: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
1bd0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1be0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
1bf0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
1c00: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
1c10: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
1c20: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
1c30: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
1c40: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
1c50: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
1c60: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
1c70: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
1c80: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
1c90: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
1ca0: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
1cb0: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1cc0: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
1cd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1cf0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d00: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1d30: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
1d40: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
1d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1d70: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
1d80: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
1d90: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
1da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1db0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1dc0: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
1dd0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1de0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
1df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1e00: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
1e10: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
1e20: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1e50: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
1e60: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
1e70: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e90: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
1ea0: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
1eb0: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
1ee0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
1ef0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
1f00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1f10: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
1f20: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
1f30: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
1f40: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
1f50: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
1f60: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
1f70: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1f80: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
1f90: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
1fa0: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
1fb0: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
1fc0: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
1fd0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
1fe0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
1ff0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
2000: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
2010: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
2020: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2030: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2040: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2050: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2060: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2070: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2080: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2090: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20a0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
20b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20c0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
20e0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
20f0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2100: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2110: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2120: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2130: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2140: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2150: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2160: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2170: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2180: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2190: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
21a0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
21b0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
21c0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
21d0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
21e0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
21f0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2200: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2210: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2220: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2230: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2240: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2250: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2260: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2270: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2280: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2290: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
22a0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
22b0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
22c0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
22d0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
22e0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
22f0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2300: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2310: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2320: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2330: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2340: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2350: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2360: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2370: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2380: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2390: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
23a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
23b0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
23c0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
23e0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
23f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2400: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2410: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2420: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2430: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2440: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2450: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2460: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2470: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2480: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2490: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
24a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
24b0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
24c0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
24d0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
24e0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
24f0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2500: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2510: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2520: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2530: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2540: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2550: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2560: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2570: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2580: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2590: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
25a0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
25b0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
25c0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
25d0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
25e0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
25f0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2600: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2610: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2620: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2630: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2640: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2650: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2660: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2670: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2680: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2690: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
26a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
26b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
26c0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
26d0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
26e0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
26f0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2700: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2710: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2720: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2730: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2740: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2750: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2770: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2780: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2790: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
27a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
27b0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
27c0: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
27d0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
27e0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
27f0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2800: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2810: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2820: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
2830: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
2840: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
2850: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
2860: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
2870: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
2880: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
2890: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
28a0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
28b0: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
28c0: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
28d0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
28e0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
28f0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
2900: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
2910: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
2920: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
2930: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
2940: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
2950: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
2960: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
2970: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
2980: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
2990: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
29a0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
29b0: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
29c0: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
29d0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29e0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29f0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
2a00: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2a10: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
2a20: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
2a30: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2a40: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
2a70: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a80: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
2a90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ab0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
2ac0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ad0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
2ae0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
2af0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
2b00: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b10: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
2b20: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
2b30: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
2b40: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
2b50: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
2b60: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
2b70: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
2b80: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
2b90: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
2ba0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
2bc0: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
2bd0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
2be0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
2bf0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
2c00: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
2c10: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
2c20: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
2c30: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
2c40: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
2c50: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
2c60: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2c70: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
2c80: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
2c90: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
2ca0: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
2cb0: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
2cc0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
2cd0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
2ce0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
2cf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d00: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
2d10: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
2d20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
2d30: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
2d40: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
2d50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
2d70: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
2d80: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
2d90: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
2da0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
2db0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
2dc0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
2dd0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2de0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
2df0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
2e00: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
2e10: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
2e20: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
2e30: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
2e40: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
2e50: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
2e60: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
2e70: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
2e80: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
2e90: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
2ea0: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
2eb0: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
2ec0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
2ed0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
2ee0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
2ef0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
2f00: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
2f10: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
2f20: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2f30: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
2f40: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
2f50: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2f70: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
2f80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2fa0: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
2fb0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2fc0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2fd0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
2fe0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2ff0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
3000: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
3010: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3020: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3030: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3040: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3050: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3060: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3080: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3090: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
30a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
30b0: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
30c0: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
30d0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
30e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
30f0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
3100: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
3110: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
3120: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3130: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3140: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3150: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3160: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3170: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3180: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3190: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
31a0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
31b0: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
31c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
31d0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
31e0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
31f0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
3200: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
3210: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
3220: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3230: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3240: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3250: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3260: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3270: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3280: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3290: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
32a0: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
32b0: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
32c0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
32d0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
32e0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
32f0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3300: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3310: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3320: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3330: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3340: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3350: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3360: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3370: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3380: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
33a0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
33b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
33c0: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
33d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
33e0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
33f0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3400: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3410: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3430: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3440: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3450: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3460: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3470: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3480: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3490: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
34a0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
34b0: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
34c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
34d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
34e0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
34f0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3500: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3510: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3520: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3530: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3540: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3550: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3560: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3570: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3590: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
35a0: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
35b0: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
35c0: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
35d0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
35e0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
35f0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3620: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3630: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3640: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3650: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3680: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3690: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
36a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
36b0: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
36c0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
36d0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
36e0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
36f0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
3700: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
3710: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
3720: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
3730: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3740: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3750: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3760: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
3770: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
3780: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
3790: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
37a0: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
37b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
37c0: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20  /.  int regData 
37d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37e0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
37f0: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
3800: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3810: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3820: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
3830: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3840: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3850: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3860: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
3870: 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67  pr+2);.  int reg
3880: 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
3890: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
38a0: 65 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20  e);.  int op;.  
38b0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
38c0: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
38d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
38e0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
38f0: 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61   pOrderBy, regBa
3900: 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  se, 0);.  sqlite
3910: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3920: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
3930: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3940: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
3950: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3960: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
3970: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
3980: 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71  Expr+1, 1);.  sq
3990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
39a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
39b0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
39c0: 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29   + 2, regRecord)
39d0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  ;.  if( pSelect-
39e0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
39f0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
3a00: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
3a10: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
3a20: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
3a30: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
3a40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3a50: 20 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69   op, pOrderBy->i
3a60: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
3a70: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
3a80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
3a90: 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
3aa0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
3ab0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
3ac0: 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  e, regBase, nExp
3ad0: 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  r+2);.  if( pSel
3ae0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ect->iLimit ){. 
3af0: 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
3b00: 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  dr2;.    int iLi
3b10: 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65  mit;.    if( pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b  lect->iOffset ){
3b30: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
3b40: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
3b50: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
3b60: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
3b70: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
3b80: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d     }.    addr1 =
3b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ba0: 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p1(v, OP_IfZero,
3bb0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71   iLimit);.    sq
3bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3bd0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c  v, OP_AddImm, iL
3be0: 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  imit, -1);.    a
3bf0: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
3c00: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
3c10: 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oto);.    sqlite
3c20: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3c30: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
3c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3c50: 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65  , OP_Last, pOrde
3c60: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
3c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3c80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
3c90: 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  te, pOrderBy->iE
3ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
3cb0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3cc0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
3cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
3ce0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
3cf0: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
3d00: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
3d10: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
3d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3d30: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3d40: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
3d50: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
3d60: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
3d70: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
3d80: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
3d90: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
3da0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
3db0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
3dc0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
3dd0: 69 4f 66 66 73 65 74 3e 30 20 26 26 20 69 43 6f  iOffset>0 && iCo
3de0: 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20  ntinue!=0 ){.   
3df0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73   int addr;.    s
3e00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3e10: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
3e20: 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20  Offset, -1);.   
3e30: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3e40: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3e50: 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 29 3b  IfNeg, iOffset);
3e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3e70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
3e80: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
3e90: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
3ea0: 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53  t((v, "skip OFFS
3eb0: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
3ec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3ed0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
3ee0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3ef0: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
3f00: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
3f10: 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74  ure the N regist
3f20: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
3f30: 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64  iMem.** form a d
3f40: 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20  istinct entry.  
3f50: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
3f60: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
3f70: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
3f80: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
3f90: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
3fa0: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
3fb0: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
3fc0: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
3fd0: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
3fe0: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
3ff0: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
4000: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
4010: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
4020: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
4030: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
4040: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
4050: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
4060: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
4070: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50  odeDistinct(.  P
4080: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4090: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
40a0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
40b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
40c0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
40d0: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
40e0: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
40f0: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
4100: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
4110: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
4120: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
4130: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
4140: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
4150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
4160: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
4170: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20   iMem           
4180: 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  /* First element
4190: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
41a0: 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76  ;.  int r1;..  v
41b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
41c0: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
41d0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
41e0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
41f0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
4200: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
4210: 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20  drRepeat, iMem, 
4220: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  N);.  sqlite3Vdb
4230: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4240: 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20  keRecord, iMem, 
4250: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
4260: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4270: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
4280: 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  b, r1);.  sqlite
4290: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
42a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
42b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
42c0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
42d0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65  ** Generate an e
42e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
42f0: 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73  n a SELECT is us
4300: 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65  ed within a sube
4310: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78  xpression.** (ex
4320: 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53  ample:  "a IN (S
4330: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
4340: 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73  le)") but it has
4350: 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73   more than 1 res
4360: 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20  ult.** column.  
4370: 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20  We do this in a 
4380: 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75  subroutine becau
4390: 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73 65  se the error use
43a0: 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e  d to occur.** in
43b0: 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
43c0: 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e  .  (The error on
43d0: 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65  ly occurs in one
43e0: 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20   place now, but 
43f0: 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65  we.** retain the
4400: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d   subroutine to m
4410: 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73  inimize code dis
4420: 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61  ruption.).*/.sta
4430: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
4440: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
4450: 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  tError(.  Parse 
4460: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
4470: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e  * Parse context.
4480: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
4490: 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65   *pDest,   /* De
44a0: 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c  stination of SEL
44b0: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ECT results */. 
44c0: 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20   int nExpr      
44d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
44e0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
44f0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  s returned by SE
4500: 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  LECT */.){.  int
4510: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4520: 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78  eDest;.  if( nEx
4530: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
4540: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
4550: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
4560: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4570: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
4580: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
4590: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
45a0: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
45b0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
45c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
45d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
45e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
45f0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  n 0;.  }.}.#endi
4600: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  f../*.** An inst
4610: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
4620: 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20  owing object is 
4630: 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69  used to record i
4640: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
4650: 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65  .** how to proce
4660: 73 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ss the DISTINCT 
4670: 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70  keyword, to simp
4680: 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61  lify passing tha
4690: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  t information.**
46a0: 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74   into the select
46b0: 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74  InnerLoop() rout
46c0: 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ine..*/.typedef 
46d0: 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43  struct DistinctC
46e0: 74 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a  tx DistinctCtx;.
46f0: 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43  struct DistinctC
4700: 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74  tx {.  u8 isTnct
4710: 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
4720: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
4730: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
4740: 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54  t */.  u8 eTnctT
4750: 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ype;   /* One of
4760: 20 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49   the WHERE_DISTI
4770: 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20  NCT_* operators 
4780: 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74  */.  int tabTnct
4790: 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61  ;    /* Ephemera
47a0: 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72  l table used for
47b0: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
47c0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64  sing */.  int ad
47d0: 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64  drTnct;   /* Add
47e0: 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
47f0: 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20  phemeral opcode 
4800: 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d  for tabTnct */.}
4810: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
4820: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
4830: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
4840: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
4850: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
4860: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
4870: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
4880: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
4890: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
48a0: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
48b0: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
48c0: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
48d0: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73   this row.  If s
48e0: 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f  rcTab is.** zero
48f0: 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64   or more, then d
4900: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
4910: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
4920: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
4930: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d  y .** to get num
4940: 62 65 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  ber columns and 
4950: 74 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72  the datatype for
4960: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
4970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
4980: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
4990: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
49a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
49b0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
49c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
49d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
49e0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
49f0: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
4a00: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
4a10: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
4a20: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4a30: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
4a40: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
4a50: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
4a60: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
4a70: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
4a80: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4a90: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
4aa0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
4ab0: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
4ac0: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 44   this key */.  D
4ad0: 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73  istinctCtx *pDis
4ae0: 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74  tinct, /* If not
4af0: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
4b00: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49  ow to process DI
4b10: 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65  STINCT */.  Sele
4b20: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
4b30: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
4b40: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
4b50: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
4b60: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
4b70: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4b80: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
4b90: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
4ba0: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
4bb0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4bc0: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
4bd0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
4be0: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
4bf0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4c00: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
4c10: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
4c20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4c30: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4c40: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4c50: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73   */.  int regRes
4c60: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
4c70: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
4c80: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73  mory holding res
4c90: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
4ca0: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4cb0: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
4cc0: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
4cd0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
4ce0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53  Parm = pDest->iS
4cf0: 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20  DParm; /* First 
4d00: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
4d10: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
4d20: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d40: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
4d50: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61   columns */..  a
4d60: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73  ssert( v );.  as
4d70: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4d80: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4d90: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
4da0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
4db0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
4dc0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
4dd0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4de0: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4df0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4e00: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
4e10: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20  ontinue);.  }.. 
4e20: 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71   /* Pull the req
4e30: 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  uested columns..
4e40: 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f    */.  nResultCo
4e50: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
4e60: 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  r;.  if( pDest->
4e70: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
4e80: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
4e90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
4ea0: 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20     pDest->nSdst 
4eb0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4ec0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4ed0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4ee0: 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65  }else{ .    asse
4ef0: 72 74 28 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  rt( pDest->nSdst
4f00: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
4f10: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
4f20: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
4f30: 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20    if( srcTab>=0 
4f40: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4f50: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
4f60: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4f70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4f80: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4f90: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
4fa0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
4fb0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
4fc0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
4fd0: 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  e));.    }.  }el
4fe0: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
4ff0: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
5000: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
5010: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
5020: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
5030: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
5040: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
5050: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
5060: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
5070: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
5080: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5090: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
50a0: 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75   pEList, regResu
50b0: 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt,.            
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50d0: 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  (eDest==SRT_Outp
50e0: 75 74 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f  ut)?SQLITE_ECEL_
50f0: 44 55 50 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DUP:0);.  }..  /
5100: 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43  * If the DISTINC
5110: 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72  T keyword was pr
5120: 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c  esent on the SEL
5130: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
5140: 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20  ** and this row 
5150: 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65  has been seen be
5160: 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  fore, then do no
5170: 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a  t make this row.
5180: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
5190: 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
51a0: 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20  if( hasDistinct 
51b0: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ){.    switch( p
51c0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
51d0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
51e0: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
51f0: 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
5200: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
5210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5220: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
5230: 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  d OpenEphemeral 
5240: 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20  instr. */.      
5250: 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20    int iJump;    
5260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5270: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  p destination */
5280: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
5290: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
52a0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
52b0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20   content */..   
52c0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
52d0: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 70   space for the p
52e0: 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20  revious row */. 
52f0: 20 20 20 20 20 20 20 72 65 67 50 72 65 76 20 3d         regPrev =
5300: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
5310: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
5320: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
5330: 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  Col;..        /*
5340: 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   Change the OP_O
5350: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64  penEphemeral cod
5360: 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e  ed earlier to an
5370: 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20   OP_Null.       
5380: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d   ** sets the MEM
5390: 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20  _Cleared bit on 
53a0: 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
53b0: 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  er of the.      
53c0: 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61    ** previous va
53d0: 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  lue.  This will 
53e0: 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20  cause the OP_Ne 
53f0: 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a  below to always.
5400: 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20          ** fail 
5410: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65  on the first ite
5420: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
5430: 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66  op even if the f
5440: 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  irst.        ** 
5450: 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73  row is all NULLs
5460: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5470: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5480: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
5490: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
54a0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
54b0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
54c0: 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  etOp(v, pDistinc
54d0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
54e0: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
54f0: 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20  e = OP_Null;.   
5500: 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31       pOp->p1 = 1
5510: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
5520: 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20  2 = regPrev;..  
5530: 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71        iJump = sq
5540: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5550: 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c  Addr(v) + nResul
5560: 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f  tCol;.        fo
5570: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
5580: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
5590: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
55a0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
55b0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
55c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
55d0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
55e0: 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  if( i<nResultCol
55f0: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
5600: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5610: 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65  Op3(v, OP_Ne, re
5620: 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70  gResult+i, iJump
5630: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
5640: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5650: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5660: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5670: 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74  OP_Eq, regResult
5680: 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72  +i, iContinue, r
5690: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
56a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
56b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
56c0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
56d0: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
56e0: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
56f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5700: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
5710: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
5720: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5730: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5740: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
5750: 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20 20  v)==iJump );.   
5760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5770: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
5780: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
5790: 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f  gPrev, nResultCo
57a0: 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  l-1);.        br
57b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
57c0: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
57d0: 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
57e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
57f0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5800: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5810: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5830: 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  }..      default
5840: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  : {.        asse
5850: 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  rt( pDistinct->e
5860: 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
5870: 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
5880: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ED );.        co
5890: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
58a0: 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61  e, pDistinct->ta
58b0: 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  bTnct, iContinue
58c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 65  , nResultCol, re
58d0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
58e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
58f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5900: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
5910: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
5920: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
5930: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
5940: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
5950: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
5960: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
5970: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
5980: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
5990: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
59a0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
59b0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
59c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
59d0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
59e0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
59f0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
5a00: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
5a10: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5a20: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5a30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5a40: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5a50: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
5a60: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
5a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5a80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
5a90: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
5aa0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
5ab0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
5ac0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
5ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5ae0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
5af0: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
5b00: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
5b10: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
5b20: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
5b30: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
5b40: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
5b50: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
5b60: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
5b70: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
5b80: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
5b90: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
5ba0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
5bb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5bc0: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50  OP_IdxDelete, iP
5bd0: 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  arm, regResult, 
5be0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
5bf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5c00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5c10: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
5c20: 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
5c30: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
5c40: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
5c50: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
5c60: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5c70: 54 5f 44 69 73 74 54 61 62 6c 65 3a 0a 20 20 20  T_DistTable:.   
5c80: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
5c90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
5ca0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
5cb0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
5cc0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5cd0: 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
5ce0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
5cf0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
5d00: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
5d10: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
5d20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5d30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5d40: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
5d50: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
5d60: 72 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  r1);.#ifndef SQL
5d70: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
5d80: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
5d90: 54 5f 44 69 73 74 54 61 62 6c 65 20 29 7b 0a 20  T_DistTable ){. 
5da0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
5db0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
5dc0: 44 69 73 74 54 61 62 6c 65 2c 20 74 68 65 6e 20  DistTable, then 
5dd0: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
5de0: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
5df0: 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65   ** on an epheme
5e00: 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ral index. If th
5e10: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
5e20: 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
5e30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
5e40: 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74  he index, do not
5e50: 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65   write it to the
5e60: 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c   output. If not,
5e70: 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20   add the.       
5e80: 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20   ** current row 
5e90: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  to the index and
5ea0: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72   proceed with wr
5eb0: 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a  iting it to the.
5ec0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
5ed0: 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e  t table as well.
5ee0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
5ef0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
5f00: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5f10: 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73  ) + 4;.        s
5f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5f30: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
5f40: 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20   iParm+1, addr, 
5f50: 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
5f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5f70: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5f80: 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b  t, iParm+1, r1);
5f90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5fa0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a   pOrderBy==0 );.
5fb0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
5fc0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5fd0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5fe0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5ff0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
6000: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
6010: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
6020: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
6030: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6050: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6060: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
6070: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
6080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6090: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
60a0: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
60b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
60c0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
60d0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
60e0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
60f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
6100: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
6110: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6120: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6130: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
6140: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
6150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6160: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
6170: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
6180: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
6190: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
61a0: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
61b0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
61c0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
61d0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
61e0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
61f0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
6200: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
6210: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
6220: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
6230: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
6240: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6250: 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a  ResultCol==1 );.
6260: 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
6270: 53 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20  Sdst =.         
6280: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6290: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
62a0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
62b0: 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64  pr, pDest->affSd
62c0: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
62d0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
62e0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
62f0: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
6300: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
6310: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
6320: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
6330: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
6340: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
6350: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
6360: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
6370: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
6380: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
6390: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
63a0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
63b0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
63c0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
63d0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
63e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
63f0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
6400: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
6410: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6420: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
6430: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6440: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
6450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6460: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
6470: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
6480: 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  1,r1, &pDest->af
6490: 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  fSdst, 1);.     
64a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
64b0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
64c0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
64d0: 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ult, 1);.       
64e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64f0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
6500: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
6510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6520: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6530: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
6540: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6550: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
6560: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
6570: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
6580: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
6590: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
65a0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
65b0: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
65c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
65d0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
65e0: 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20  r, 1, iParm);.  
65f0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6600: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
6610: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
6620: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
6630: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
6640: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
6650: 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
6660: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
6670: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
6680: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
6690: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
66a0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
66b0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
66c0: 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
66d0: 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
66e0: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
66f0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
6700: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
6710: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
6720: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
6730: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
6740: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
6750: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
6760: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
6770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6780: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
6790: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
67a0: 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29  esult, iParm, 1)
67b0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
67c0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
67d0: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
67e0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
67f0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
6800: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
6810: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
6820: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6830: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ERY */..    /* S
6840: 65 6e 64 20 74 68 65 20 64 61 74 61 20 74 6f 20  end the data to 
6850: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  the callback fun
6860: 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75  ction or to a su
6870: 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68  broutine.  In th
6880: 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66  e.    ** case of
6890: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74   a subroutine, t
68a0: 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74  he subroutine it
68b0: 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69  self is responsi
68c0: 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  ble for.    ** p
68d0: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 20  opping the data 
68e0: 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a  from the stack..
68f0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
6900: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20  SRT_Coroutine:. 
6910: 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70     case SRT_Outp
6920: 75 74 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ut: {.      test
6930: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
6940: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
6950: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
6960: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
6970: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
6980: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
6990: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
69a0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
69b0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
69c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
69d0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
69e0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
69f0: 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20  ultCol, r1);.   
6a00: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
6a10: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
6a20: 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20  erBy, p, r1);.  
6a30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6a40: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6a50: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d  se, r1);.      }
6a60: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d 3d  else if( eDest==
6a70: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b  SRT_Coroutine ){
6a80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6a90: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
6aa0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
6ab0: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
6ac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6ad0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
6ae0: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
6af0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
6b00: 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  ultCol);.       
6b10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
6b20: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
6b30: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
6b40: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
6b50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6b60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
6b70: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6b80: 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  CTE.    /* Write
6b90: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 74   the results int
6ba0: 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71 75 65  o a priority que
6bb0: 75 65 20 74 68 61 74 20 69 73 20 6f 72 64 65 72  ue that is order
6bc0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20   according to.  
6bd0: 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64    ** pDest->pOrd
6be0: 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20 20  erBy (in pSO).  
6bf0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 28  pDest->iSDParm (
6c00: 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68 65  in iParm) is the
6c10: 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20   cursor for an. 
6c20: 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68     ** index with
6c30: 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f   pSO->nExpr+2 co
6c40: 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61 20  lumns.  Build a 
6c50: 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66 6f  key using pSO fo
6c60: 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  r the first.    
6c70: 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f  ** pSO->nExpr co
6c80: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65  lumns, then make
6c90: 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20 61   sure all keys a
6ca0: 72 65 20 75 6e 69 71 75 65 20 62 79 20 61 64 64  re unique by add
6cb0: 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e  ing a.    ** fin
6cc0: 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20 63  al OP_Sequence c
6cd0: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74  olumn.  The last
6ce0: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 72   column is the r
6cf0: 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62 2e  ecord as a blob.
6d00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
6d10: 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a 0a   SRT_DistQueue:.
6d20: 20 20 20 20 63 61 73 65 20 53 52 54 5f 51 75 65      case SRT_Que
6d30: 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ue: {.      int 
6d40: 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  nKey;.      int 
6d50: 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20 20  r1, r2, r3;.    
6d60: 20 20 69 6e 74 20 61 64 64 72 54 65 73 74 20 3d    int addrTest =
6d70: 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   0;.      ExprLi
6d80: 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70  st *pSO;.      p
6d90: 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64  SO = pDest->pOrd
6da0: 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73 65  erBy;.      asse
6db0: 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20 20  rt( pSO );.     
6dc0: 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78   nKey = pSO->nEx
6dd0: 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  pr;.      r1 = s
6de0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6df0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
6e00: 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r2 = sqlite3GetT
6e10: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
6e20: 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20   nKey+2);.      
6e30: 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a  r3 = r2+nKey+1;.
6e40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6e50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
6e60: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
6e70: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
6e80: 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20   r3);.      if( 
6e90: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 51  eDest==SRT_DistQ
6ea0: 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20 20  ueue ){.        
6eb0: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
6ec0: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75 65  ation is DistQue
6ed0: 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  ue, then cursor 
6ee0: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
6ef0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
6f00: 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65 72  a second ephemer
6f10: 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f  al index that ho
6f20: 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20 65  lds all values e
6f30: 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79 0a  very previously.
6f40: 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65 64          ** added
6f50: 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20 20   to the queue.  
6f60: 4f 6e 6c 79 20 61 64 64 20 74 68 69 73 20 6e 65  Only add this ne
6f70: 77 20 76 61 6c 75 65 20 69 66 20 69 74 20 68 61  w value if it ha
6f80: 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 0a 20  s never before. 
6f90: 20 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 61         ** been a
6fa0: 64 64 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  dded */.        
6fb0: 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69 74  addrTest = sqlit
6fc0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
6fd0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61  v, OP_Found, iPa
6fe0: 72 6d 2b 31 2c 20 30 2c 20 72 33 2c 20 30 29 3b  rm+1, 0, r3, 0);
6ff0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7000: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7010: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
7020: 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20 20 20  m+1, r3);.      
7030: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
7040: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
7050: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
7060: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
7070: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
70a0: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
70b0: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
70e0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
70f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7100: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
7110: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
7120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7130: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
7140: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
7150: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
7160: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7170: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
7180: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
7190: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
71a0: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
71b0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
71c0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
71d0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
71e0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
71f0: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7200: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
7210: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
7220: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7230: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
7240: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
7250: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
7260: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
7270: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
7280: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
7290: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
72a0: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
72b0: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
72c0: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
72d0: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
72e0: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
72f0: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
7300: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
7310: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
7320: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
7330: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
7340: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
7350: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
7360: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
7370: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
7380: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
7390: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
73a0: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
73b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
73c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
73d0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
73e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
73f0: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
7400: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
7410: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
7420: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
7430: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
7440: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
7450: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
7460: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
7470: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  s..  */.  if( pO
7480: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e  rderBy==0 && p->
7490: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
74a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
74b0: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
74c0: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
74d0: 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   -1);.  }.}../*.
74e0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65  ** Allocate a Ke
74f0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75 66  yInfo object suf
7500: 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20 69  ficient for an i
7510: 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f  ndex of N key co
7520: 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65  lumns and.** X e
7530: 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f  xtra columns..*/
7540: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
7550: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71  3KeyInfoAlloc(sq
7560: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e  lite3 *db, int N
7570: 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49  , int X){.  KeyI
7580: 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  nfo *p = sqlite3
7590: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20  DbMallocZero(0, 
75a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
75b0: 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e      sizeof(KeyIn
75c0: 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a  fo) + (N+X)*(siz
75d0: 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29  eof(CollSeq*)+1)
75e0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
75f0: 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
7600: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c  = (u8*)&p->aColl
7610: 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46  [N+X];.    p->nF
7620: 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20  ield = (u16)N;. 
7630: 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20     p->nXField = 
7640: 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65  (u16)X;.    p->e
7650: 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
7660: 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20    p->db = db;.  
7670: 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20    p->nRef = 1;. 
7680: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
7690: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
76a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
76b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
76c0: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
76d0: 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73  object.*/.void s
76e0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
76f0: 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a  ef(KeyInfo *p){.
7700: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61    if( p ){.    a
7710: 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30  ssert( p->nRef>0
7720: 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d   );.    p->nRef-
7730: 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  -;.    if( p->nR
7740: 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 44  ef==0 ) sqlite3D
7750: 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d  bFree(0, p);.  }
7760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
7770: 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f 20   new pointer to 
7780: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
7790: 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
77a0: 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b  ite3KeyInfoRef(K
77b0: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
77c0: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
77d0: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
77e0: 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20      p->nRef++;. 
77f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
7800: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7810: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
7820: 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65 79  rn TRUE if a Key
7830: 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20  Info object can 
7840: 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65 20  be change.  The 
7850: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
7860: 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68  * can only be ch
7870: 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69 73  anged if this is
7880: 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 72   just a single r
7890: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
78a0: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
78b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
78c0: 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f  ed only inside o
78d0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
78e0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
78f0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
7900: 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20  iteable(KeyInfo 
7910: 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e  *p){ return p->n
7920: 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66  Ref==1; }.#endif
7930: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
7940: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
7950: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
7960: 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ist, generate a 
7970: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
7980: 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a 2a  e that records.*
7990: 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * the collating 
79a0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61 63  sequence for eac
79b0: 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  h expression in 
79c0: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 20  that expression 
79d0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  list..**.** If t
79e0: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 61  he ExprList is a
79f0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
7a00: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 68  OUP BY clause th
7a10: 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  en the resulting
7a20: 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  .** KeyInfo stru
7a30: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
7a40: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
7a50: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 20  izing a virtual 
7a60: 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c  index to.** impl
7a70: 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75 73  ement that claus
7a80: 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72 4c  e.  If the ExprL
7a90: 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  ist is the resul
7aa0: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
7ab0: 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b 65  T.** then the Ke
7ac0: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
7ad0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
7ae0: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
7af0: 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64  a virtual.** ind
7b00: 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ex to implement 
7b10: 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 2e  a DISTINCT test.
7b20: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
7b30: 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66 6f  hold the KeyInfo
7b40: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f 62   structure is ob
7b50: 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  tain from malloc
7b60: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  .  The calling.*
7b70: 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  * function is re
7b80: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73 65  sponsible for se
7b90: 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73  eing that this s
7ba0: 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e  tructure is even
7bb0: 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e  tually.** freed.
7bc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e  .*/.static KeyIn
7bd0: 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  fo *keyInfoFromE
7be0: 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a 70  xprList(Parse *p
7bf0: 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74 20  Parse, ExprList 
7c00: 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6e 45 78 74  *pList, int nExt
7c10: 72 61 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72  ra){.  int nExpr
7c20: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
7c30: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
7c40: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
7c50: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
7c60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7c70: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
7c80: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
7c90: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
7ca0: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
7cb0: 62 2c 20 6e 45 78 70 72 2b 6e 45 78 74 72 61 2c  b, nExpr+nExtra,
7cc0: 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f   1);.  if( pInfo
7cd0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7ce0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
7cf0: 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f 29  Writeable(pInfo)
7d00: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   );.    for(i=0,
7d10: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
7d20: 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70   i<nExpr; i++, p
7d30: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43  Item++){.      C
7d40: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
7d50: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
7d60: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
7d70: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
7d80: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
7d90: 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20   !pColl ) pColl 
7da0: 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
7db0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43  .      pInfo->aC
7dc0: 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
7dd0: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f        pInfo->aSo
7de0: 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 74  rtOrder[i] = pIt
7df0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  em->sortOrder;. 
7e00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7e10: 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e  n pInfo;.}..#ifn
7e20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7e30: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
7e40: 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68  /*.** Name of th
7e50: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65  e connection ope
7e60: 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72 20  rator, used for 
7e70: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a  error messages..
7e80: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
7e90: 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61  char *selectOpNa
7ea0: 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63 68  me(int id){.  ch
7eb0: 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28  ar *z;.  switch(
7ec0: 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65 20   id ){.    case 
7ed0: 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20  TK_ALL:       z 
7ee0: 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20  = "UNION ALL";  
7ef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
7f00: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a   TK_INTERSECT: z
7f10: 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b 20   = "INTERSECT"; 
7f20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
7f30: 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20 20  e TK_EXCEPT:    
7f40: 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20 20  z = "EXCEPT";   
7f50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
7f60: 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20 20  fault:          
7f70: 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20   z = "UNION";   
7f80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20      break;.  }. 
7f90: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e   return z;.}.#en
7fa0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7fb0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
7fc0: 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  CT */..#ifndef S
7fd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
7fe0: 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  IN./*.** Unless 
7ff0: 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52  an "EXPLAIN QUER
8000: 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20  Y PLAN" command 
8010: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
8020: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
8030: 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  n.** is a no-op.
8040: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61   Otherwise, it a
8050: 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  dds a single row
8060: 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68   of output to th
8070: 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a  e EQP result,.**
8080: 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69   where the capti
8090: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
80a0: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20  m:.**.**   "USE 
80b0: 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20  TEMP B-TREE FOR 
80c0: 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  xxx".**.** where
80d0: 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20 22   xxx is one of "
80e0: 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44 45  DISTINCT", "ORDE
80f0: 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50 20  R BY" or "GROUP 
8100: 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68 69  BY". Exactly whi
8110: 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d 69  ch.** is determi
8120: 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61 67  ned by the zUsag
8130: 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
8140: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
8150: 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72 73  inTempTable(Pars
8160: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
8170: 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a   char *zUsage){.
8180: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
8190: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
81a0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
81b0: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61  ->pVdbe;.    cha
81c0: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
81d0: 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
81e0: 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20 42  >db, "USE TEMP B
81f0: 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20 7a  -TREE FOR %s", z
8200: 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c 69  Usage);.    sqli
8210: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
8220: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61   OP_Explain, pPa
8230: 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  rse->iSelectId, 
8240: 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44  0, 0, zMsg, P4_D
8250: 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a  YNAMIC);.  }.}..
8260: 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78 70  /*.** Assign exp
8270: 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61  ression b to lva
8280: 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c  lue a. A second,
8290: 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20   no-op, version 
82a0: 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a  of this macro.**
82b0: 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68 65   is provided whe
82c0: 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  n SQLITE_OMIT_EX
82d0: 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65 64  PLAIN is defined
82e0: 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  . This allows th
82f0: 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c  e code.** in sql
8300: 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f 20  ite3Select() to 
8310: 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74 6f  assign values to
8320: 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62 65   structure membe
8330: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
8340: 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20 69  .** only exist i
8350: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
8360: 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65 66  PLAIN is not def
8370: 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f 6c  ined without pol
8380: 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  luting the.** co
8390: 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66 20  de with #ifndef 
83a0: 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23  directives..*/.#
83b0: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
83c0: 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29 20  etInteger(a, b) 
83d0: 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20  a = b..#else./* 
83e0: 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f  No-op versions o
83f0: 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58  f the explainXXX
8400: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  () functions and
8410: 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65   macros. */.# de
8420: 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d 70  fine explainTemp
8430: 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66  Table(y,z).# def
8440: 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49 6e  ine explainSetIn
8450: 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69  teger(y,z).#endi
8460: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
8470: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
8480: 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64  AIN) && !defined
8490: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d  (SQLITE_OMIT_COM
84a0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a  POUND_SELECT)./*
84b0: 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45  .** Unless an "E
84c0: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
84d0: 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65  N" command is be
84e0: 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74  ing processed, t
84f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
8500: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  is a no-op. Othe
8510: 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20 61  rwise, it adds a
8520: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f   single row of o
8530: 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51 50  utput to the EQP
8540: 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72   result,.** wher
8550: 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73  e the caption is
8560: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   of one of the t
8570: 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  wo forms:.**.** 
8580: 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42    "COMPOSITE SUB
8590: 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61 6e  QUERIES iSub1 an
85a0: 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a  d iSub2 (op)".**
85b0: 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55     "COMPOSITE SU
85c0: 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61  BQUERIES iSub1 a
85d0: 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47 20 54  nd iSub2 USING T
85e0: 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29 22  EMP B-TREE (op)"
85f0: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53 75  .**.** where iSu
8600: 62 31 20 61 6e 64 20 69 53 75 62 32 20 61 72 65  b1 and iSub2 are
8610: 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 70 61   the integers pa
8620: 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 72 72  ssed as the corr
8630: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e  esponding.** fun
8640: 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73  ction parameters
8650: 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65 20  , and op is the 
8660: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
8670: 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61 6d  ion of the param
8680: 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73  eter.** of the s
8690: 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70 61  ame name. The pa
86a0: 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75 73  rameter "op" mus
86b0: 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55  t be one of TK_U
86c0: 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
86d0: 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  .** TK_INTERSECT
86e0: 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20   or TK_ALL. The 
86f0: 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75 73  first form is us
8700: 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20 62  ed if argument b
8710: 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61  UseTmp is .** fa
8720: 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63 6f  lse, or the seco
8730: 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69 73  nd form if it is
8740: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
8750: 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d   void explainCom
8760: 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65 20  posite(.  Parse 
8770: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
8790: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
87a0: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87c0: 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49  /* One of TK_UNI
87d0: 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65 74  ON, TK_EXCEPT et
87e0: 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  c. */.  int iSub
87f0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
8800: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75          /* Subqu
8810: 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e  ery id 1 */.  in
8820: 74 20 69 53 75 62 32 2c 20 20 20 20 20 20 20 20  t iSub2,        
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8840: 20 53 75 62 71 75 65 72 79 20 69 64 20 32 20 2a   Subquery id 2 *
8850: 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70 20  /.  int bUseTmp 
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8870: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
8880: 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73 20   temp table was 
8890: 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  used */.){.  ass
88a0: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ert( op==TK_UNIO
88b0: 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45  N || op==TK_EXCE
88c0: 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
88d0: 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b  ERSECT || op==TK
88e0: 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70 50  _ALL );.  if( pP
88f0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
8900: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
8910: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
8920: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
8930: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
8940: 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
8950: 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20  ->db, "COMPOUND 
8960: 53 55 42 51 55 45 52 49 45 53 20 25 64 20 41 4e  SUBQUERIES %d AN
8970: 44 20 25 64 20 25 73 28 25 73 29 22 2c 20 69 53  D %d %s(%s)", iS
8980: 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20 20  ub1, iSub2,.    
8990: 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53 49      bUseTmp?"USI
89a0: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 22  NG TEMP B-TREE "
89b0: 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d  :"", selectOpNam
89c0: 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20 20  e(op).    );.   
89d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
89e0: 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e  p4(v, OP_Explain
89f0: 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63  , pParse->iSelec
8a00: 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c  tId, 0, 0, zMsg,
8a10: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
8a20: 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d  }.}.#else./* No-
8a30: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
8a40: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
8a50: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
8a60: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
8a70: 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69  e explainComposi
8a80: 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  te(v,w,x,y,z).#e
8a90: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
8aa0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61  he inner loop wa
8ab0: 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69 6e  s generated usin
8ac0: 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72  g a non-null pOr
8ad0: 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a  derBy argument,.
8ae0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  ** then the resu
8af0: 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64 20  lts were placed 
8b00: 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41 66  in a sorter.  Af
8b10: 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73 20  ter the loop is 
8b20: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65  terminated.** we
8b30: 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68 65   need to run the
8b40: 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74 70   sorter and outp
8b50: 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20  ut the results. 
8b60: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
8b70: 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  * routine genera
8b80: 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65 65  tes the code nee
8b90: 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  ded to do that..
8ba0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
8bb0: 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
8bc0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8bd0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
8be0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
8bf0: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
8c00: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
8c10: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65  tement */.  Vdbe
8c20: 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f 2a   *v,          /*
8c30: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
8c40: 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f  nto this VDBE */
8c50: 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20  .  int nColumn, 
8c60: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8c70: 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74  f columns of dat
8c80: 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  a */.  SelectDes
8c90: 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69 74  t *pDest /* Writ
8ca0: 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65 73  e the sorted res
8cb0: 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
8cc0: 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b 20    int addrBreak 
8cd0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
8ce0: 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20 20 2f  eLabel(v);     /
8cf0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
8d00: 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  xit loop */.  in
8d10: 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d  t addrContinue =
8d20: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
8d30: 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75  Label(v);  /* Ju
8d40: 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78 74  mp here for next
8d50: 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   cycle */.  int 
8d60: 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61 62  addr;.  int iTab
8d70: 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54 61  ;.  int pseudoTa
8d80: 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69 73  b = 0;.  ExprLis
8d90: 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  t *pOrderBy = p-
8da0: 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e  >pOrderBy;..  in
8db0: 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d  t eDest = pDest-
8dc0: 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69 50  >eDest;.  int iP
8dd0: 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53 44  arm = pDest->iSD
8de0: 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67  Parm;..  int reg
8df0: 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f  Row;.  int regRo
8e00: 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70  wid;..  iTab = p
8e10: 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f  OrderBy->iECurso
8e20: 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73 71  r;.  regRow = sq
8e30: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
8e40: 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 65  pParse);.  if( e
8e50: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
8e60: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
8e70: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
8e80: 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61 72  pseudoTab = pPar
8e90: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
8ea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8eb0: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
8ec0: 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 72  do, pseudoTab, r
8ed0: 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  egRow, nColumn);
8ee0: 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
8ef0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
8f00: 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69 74  regRowid = sqlit
8f10: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
8f20: 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rse);.  }.  if( 
8f30: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
8f40: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
8f50: 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75 74    int regSortOut
8f60: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
8f70: 6d 3b 0a 20 20 20 20 69 6e 74 20 70 74 61 62 32  m;.    int ptab2
8f80: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
8f90: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
8fa0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
8fb0: 70 65 6e 50 73 65 75 64 6f 2c 20 70 74 61 62 32  penPseudo, ptab2
8fc0: 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 70 4f  , regSortOut, pO
8fd0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29  rderBy->nExpr+2)
8fe0: 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b  ;.    addr = 1 +
8ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9000: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
9010: 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42  ort, iTab, addrB
9020: 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f  reak);.    codeO
9030: 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66  ffset(v, p->iOff
9040: 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  set, addrContinu
9050: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
9060: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
9070: 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62  SorterData, iTab
9080: 2c 20 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20  , regSortOut);. 
9090: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
90a0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
90b0: 6e 2c 20 70 74 61 62 32 2c 20 70 4f 72 64 65 72  n, ptab2, pOrder
90c0: 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67  By->nExpr+1, reg
90d0: 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Row);.    sqlite
90e0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
90f0: 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
9100: 48 45 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  HE);.  }else{.  
9110: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
9120: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9130: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
9140: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
9150: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
9160: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
9170: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71  ontinue);.    sq
9180: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9190: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
91a0: 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ab, pOrderBy->nE
91b0: 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a  xpr+1, regRow);.
91c0: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 65 44    }.  switch( eD
91d0: 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73 65 20  est ){.    case 
91e0: 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63  SRT_Table:.    c
91f0: 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62  ase SRT_EphemTab
9200: 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
9210: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
9220: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
9230: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9240: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
9250: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9260: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
9270: 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20 72 65  Rowid, iParm, re
9280: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
9290: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
92a0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
92b0: 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65  Parm, regRow, re
92c0: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
92d0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
92e0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
92f0: 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72 65 61  END);.      brea
9300: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
9310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
9320: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 53  QUERY.    case S
9330: 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20  RT_Set: {.      
9340: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
9350: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
9360: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
9370: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
9380: 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f  regRow, 1, regRo
9390: 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  wid,.           
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 44               &pD
93b0: 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29  est->affSdst, 1)
93c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
93d0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
93e0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
93f0: 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20  egRow, 1);.     
9400: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9410: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
9420: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
9430: 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61  wid);.      brea
9440: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9450: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
9460: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
9470: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
9480: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
9490: 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  ve(pParse, regRo
94a0: 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  w, iParm, 1);.  
94b0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
94c0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
94d0: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
94e0: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
94f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9500: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
9510: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a   {.      int i;.
9520: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
9530: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
9540: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
9550: 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20 20 20  routine ); .    
9560: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
9570: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
9580: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9590: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
95a0: 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 66  utine );.      f
95b0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d  or(i=0; i<nColum
95c0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
95d0: 20 61 73 73 65 72 74 28 20 72 65 67 52 6f 77 21   assert( regRow!
95e0: 3d 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69 20  =pDest->iSdst+i 
95f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
9600: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9610: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64  OP_Column, pseud
9620: 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e  oTab, i, pDest->
9630: 69 53 64 73 74 2b 69 29 3b 0a 20 20 20 20 20 20  iSdst+i);.      
9640: 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20    if( i==0 ){.  
9650: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9660: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
9670: 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45  PFLAG_CLEARCACHE
9680: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9690: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65     }.      if( e
96a0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
96b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
96c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
96d0: 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
96e0: 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f  Dest->iSdst, nCo
96f0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
9700: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
9710: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
9720: 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69 53 64  arse, pDest->iSd
9730: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
9740: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9750: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9760: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
9770: 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
9780: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9790: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
97a0: 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
97b0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
97c0: 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c  , regRow);.  sql
97d0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
97e0: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f  eg(pParse, regRo
97f0: 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  wid);..  /* The 
9800: 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f  bottom of the lo
9810: 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  op.  */.  sqlite
9820: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
9830: 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  l(v, addrContinu
9840: 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  e);.  if( p->sel
9850: 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f  Flags & SF_UseSo
9860: 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  rter ){.    sqli
9870: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9880: 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
9890: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d  iTab, addr);.  }
98a0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
98b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
98c0: 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
98d0: 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  dr);.  }.  sqlit
98e0: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
98f0: 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29  el(v, addrBreak)
9900: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
9910: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
9920: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
9930: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
9940: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9950: 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f 54 61  _Close, pseudoTa
9960: 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b, 0);.  }.}../*
9970: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
9980: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e 67  nter to a string
9990: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
99a0: 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70  'declaration typ
99b0: 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70  e' of the.** exp
99c0: 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 54  ression pExpr. T
99d0: 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20 62 65  he string may be
99e0: 20 74 72 65 61 74 65 64 20 61 73 20 73 74 61 74   treated as stat
99f0: 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ic by the caller
9a00: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79  ..**.** Also try
9a10: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
9a20: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 74   size of the ret
9a30: 75 72 6e 65 64 20 76 61 6c 75 65 20 61 6e 64 20  urned value and 
9a40: 72 65 74 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72  return that.** r
9a50: 65 73 75 6c 74 20 69 6e 20 2a 70 45 73 74 57 69  esult in *pEstWi
9a60: 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  dth..**.** The d
9a70: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
9a80: 69 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74  is the exact dat
9a90: 61 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e  atype definition
9aa0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
9ab0: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
9ac0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9ad0: 74 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78  tement if the ex
9ae0: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
9af0: 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63  lumn. The.** dec
9b00: 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f  laration type fo
9b10: 72 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20  r a ROWID field 
9b20: 69 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63  is INTEGER. Exac
9b30: 74 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72  tly when an expr
9b40: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
9b50: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
9b60: 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20   can be complex 
9b70: 69 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20  in the presence 
9b80: 6f 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54  of subqueries. T
9b90: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
9ba0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61   expression in a
9bb0: 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ll of the follow
9bc0: 69 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65  ing SELECT state
9bd0: 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e  ments is .** con
9be0: 73 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e  sidered a column
9bf0: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
9c00: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  n..**.**   SELEC
9c10: 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a  T col FROM tbl;.
9c20: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
9c30: 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c  ECT col FROM tbl
9c40: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53  ;.**   SELECT (S
9c50: 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74  ELECT col FROM t
9c60: 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  bl);.**   SELECT
9c70: 20 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43   abc FROM (SELEC
9c80: 54 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f  T col AS abc FRO
9c90: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54  M tbl);.** .** T
9ca0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
9cb0: 79 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72  ype for any expr
9cc0: 65 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61  ession other tha
9cd0: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55  n a column is NU
9ce0: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  LL..**.** This r
9cf0: 6f 75 74 69 6e 65 20 68 61 73 20 65 69 74 68 65  outine has eithe
9d00: 72 20 33 20 6f 72 20 36 20 70 61 72 61 6d 65 74  r 3 or 6 paramet
9d10: 65 72 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  ers depending on
9d20: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
9d30: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  ** the SQLITE_EN
9d40: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
9d50: 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  DATA compile-tim
9d60: 65 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  e option is used
9d70: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
9d80: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
9d90: 5f 4d 45 54 41 44 41 54 41 0a 23 20 64 65 66 69  _METADATA.# defi
9da0: 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c  ne columnType(A,
9db0: 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d  B,C,D,E,F) colum
9dc0: 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c  nTypeImpl(A,B,C,
9dd0: 44 2c 45 2c 46 29 0a 73 74 61 74 69 63 20 63 6f  D,E,F).static co
9de0: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
9df0: 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65  TypeImpl(.  Name
9e00: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
9e10: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
9e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
9e30: 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  rigDb,.  const c
9e40: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c  har **pzOrigTab,
9e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
9e60: 70 7a 4f 72 69 67 43 6f 6c 2c 0a 20 20 75 38 20  pzOrigCol,.  u8 
9e70: 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 20 20  *pEstWidth.){.  
9e80: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
9e90: 67 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  gDb = 0;.  char 
9ea0: 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54 61 62 20  const *zOrigTab 
9eb0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
9ec0: 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  t *zOrigCol = 0;
9ed0: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 21 64 65  .#else /* if !de
9ee0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
9ef0: 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
9f00: 41 54 41 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65  ATA) */.# define
9f10: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c   columnType(A,B,
9f20: 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54  C,D,E,F) columnT
9f30: 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 73  ypeImpl(A,B,F).s
9f40: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
9f50: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
9f60: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
9f70: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
9f80: 45 78 70 72 2c 0a 20 20 75 38 20 2a 70 45 73 74  Expr,.  u8 *pEst
9f90: 57 69 64 74 68 0a 29 7b 0a 23 65 6e 64 69 66 20  Width.){.#endif 
9fa0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
9fb0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
9fc0: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 20 20  _METADATA) */.  
9fd0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
9fe0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a  e = 0;.  int j;.
9ff0: 20 20 75 38 20 65 73 74 57 69 64 74 68 20 3d 20    u8 estWidth = 
a000: 31 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  1;..  if( NEVER(
a010: 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43  pExpr==0) || pNC
a020: 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ->pSrcList==0 ) 
a030: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
a040: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
a050: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47  .    case TK_AGG
a060: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
a070: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20  e TK_COLUMN: {. 
a080: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
a090: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
a0a0: 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68 65 20 74  mn. Locate the t
a0b0: 61 62 6c 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  able the column 
a0c0: 69 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 2a  is being.      *
a0d0: 2a 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  * extracted from
a0e0: 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e   in NameContext.
a0f0: 70 53 72 63 4c 69 73 74 2e 20 54 68 69 73 20 74  pSrcList. This t
a100: 61 62 6c 65 20 6d 61 79 20 62 65 20 72 65 61 6c  able may be real
a110: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
a120: 73 65 20 74 61 62 6c 65 20 6f 72 20 61 20 73 75  se table or a su
a130: 62 71 75 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f  bquery..      */
a140: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
a150: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
a160: 20 20 20 2f 2a 20 54 61 62 6c 65 20 73 74 72 75     /* Table stru
a170: 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20  cture column is 
a180: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a  extracted from *
a190: 2f 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  /.      Select *
a1a0: 70 53 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  pS = 0;         
a1b0: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 74 68      /* Select th
a1c0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72  e column is extr
a1d0: 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20  acted from */.  
a1e0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
a1f0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20  Expr->iColumn;  
a200: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
a210: 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20  mn in pTab */.  
a220: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
a230: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
a240: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
a250: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
a260: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
a270: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
a280: 4e 43 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  NC && !pTab ){. 
a290: 20 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a         SrcList *
a2a0: 70 54 61 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pTabList = pNC->
a2b0: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
a2c0: 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62    for(j=0;j<pTab
a2d0: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 70 54  List->nSrc && pT
a2e0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
a2f0: 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e 69 54 61  rsor!=pExpr->iTa
a300: 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20  ble;j++);.      
a310: 20 20 69 66 28 20 6a 3c 70 54 61 62 4c 69 73 74    if( j<pTabList
a320: 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20  ->nSrc ){.      
a330: 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c      pTab = pTabL
a340: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a  ist->a[j].pTab;.
a350: 20 20 20 20 20 20 20 20 20 20 70 53 20 3d 20 70            pS = p
a360: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53  TabList->a[j].pS
a370: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d  elect;.        }
a380: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a390: 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74  pNC = pNC->pNext
a3a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a3b0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
a3c0: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab==0 ){.      
a3d0: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65    /* At one time
a3e0: 2c 20 63 6f 64 65 20 73 75 63 68 20 61 73 20 22  , code such as "
a3f0: 53 45 4c 45 43 54 20 6e 65 77 2e 78 22 20 77 69  SELECT new.x" wi
a400: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 20 77  thin a trigger w
a410: 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ould.        ** 
a420: 63 61 75 73 65 20 74 68 69 73 20 63 6f 6e 64 69  cause this condi
a430: 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69  tion to run.  Si
a440: 6e 63 65 20 74 68 65 6e 2c 20 77 65 20 68 61 76  nce then, we hav
a450: 65 20 72 65 73 74 72 75 63 74 75 72 65 64 20 68  e restructured h
a460: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  ow.        ** tr
a470: 69 67 67 65 72 20 63 6f 64 65 20 69 73 20 67 65  igger code is ge
a480: 6e 65 72 61 74 65 64 20 61 6e 64 20 73 6f 20 74  nerated and so t
a490: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
a4a0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20   no longer .    
a4b0: 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e      ** possible.
a4c0: 20 48 6f 77 65 76 65 72 2c 20 69 74 20 63 61 6e   However, it can
a4d0: 20 73 74 69 6c 6c 20 62 65 20 74 72 75 65 20 66   still be true f
a4e0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  or statements li
a4f0: 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ke.        ** th
a500: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20  e following:.   
a510: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
a520: 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
a530: 45 20 74 31 28 63 6f 6c 20 49 4e 54 45 47 45 52  E t1(col INTEGER
a540: 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  );.        **   
a550: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 74  SELECT (SELECT t
a560: 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d  1.col) FROM FROM
a570: 20 74 31 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a   t1;.        **.
a580: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
a590: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
a5a0: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
a5b0: 70 72 65 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c  pression "t1.col
a5c0: 22 20 69 6e 20 74 68 65 20 0a 20 20 20 20 20 20  " in the .      
a5d0: 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e    ** sub-select.
a5e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 73   In this case, s
a5f0: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  et the column ty
a600: 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e  pe to NULL, even
a610: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 6f 75  .        ** thou
a620: 67 68 20 69 74 20 73 68 6f 75 6c 64 20 72 65 61  gh it should rea
a630: 6c 6c 79 20 62 65 20 22 49 4e 54 45 47 45 52 22  lly be "INTEGER"
a640: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
a650: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
a660: 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61  not a problem, a
a670: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  s the column typ
a680: 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22 20 69 73  e of "t1.col" is
a690: 20 6e 65 76 65 72 0a 20 20 20 20 20 20 20 20 2a   never.        *
a6a0: 2a 20 75 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c  * used. When col
a6b0: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
a6c0: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
a6d0: 73 73 69 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ssion .        *
a6e0: 2a 20 22 28 53 45 4c 45 43 54 20 74 31 2e 63 6f  * "(SELECT t1.co
a6f0: 6c 29 22 2c 20 74 68 65 20 63 6f 72 72 65 63 74  l)", the correct
a700: 20 74 79 70 65 20 69 73 20 72 65 74 75 72 6e 65   type is returne
a710: 64 20 28 73 65 65 20 74 68 65 20 54 4b 5f 53 45  d (see the TK_SE
a720: 4c 45 43 54 0a 20 20 20 20 20 20 20 20 2a 2a 20  LECT.        ** 
a730: 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a  branch below.  *
a740: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
a750: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
a760: 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20  assert( pTab && 
a770: 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61  pExpr->pTab==pTa
a780: 62 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b );.      if( p
a790: 53 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  S ){.        /* 
a7a0: 54 68 65 20 22 74 61 62 6c 65 22 20 69 73 20 61  The "table" is a
a7b0: 63 74 75 61 6c 6c 79 20 61 20 73 75 62 2d 73 65  ctually a sub-se
a7c0: 6c 65 63 74 20 6f 72 20 61 20 76 69 65 77 20 69  lect or a view i
a7d0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
a7e0: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
a7f0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
a800: 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65  ment. Return the
a810: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
a820: 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20  e and origin.   
a830: 20 20 20 20 20 2a 2a 20 64 61 74 61 20 66 6f 72       ** data for
a840: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
a850: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 73 75  column of the su
a860: 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20 20 20 20  b-select..      
a870: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
a880: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41   iCol>=0 && ALWA
a890: 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69  YS(iCol<pS->pELi
a8a0: 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
a8b0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 43          /* If iC
a8c0: 6f 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ol is less than 
a8d0: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 65  zero, then the e
a8e0: 78 70 72 65 73 73 69 6f 6e 20 72 65 71 75 65 73  xpression reques
a8f0: 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ts the.         
a900: 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20 74 68 65   ** rowid of the
a910: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 76   sub-select or v
a920: 69 65 77 2e 20 54 68 69 73 20 65 78 70 72 65 73  iew. This expres
a930: 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c 20 28 73  sion is legal (s
a940: 65 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ee .          **
a950: 20 74 65 73 74 20 63 61 73 65 20 6d 69 73 63 32   test case misc2
a960: 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c 77 61 79  .2.2) - it alway
a970: 73 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e  s evaluates to N
a980: 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ULL..          *
a990: 2f 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65  /.          Name
a9a0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
a9b0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d         Expr *p =
a9c0: 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69   pS->pEList->a[i
a9d0: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  Col].pExpr;.    
a9e0: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
a9f0: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
aa00: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 4e 65           sNC.pNe
aa10: 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  xt = pNC;.      
aa20: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
aa30: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
aa40: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
aa50: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
aa60: 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72   p,&zOrigDb,&zOr
aa70: 69 67 54 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c  igTab,&zOrigCol,
aa80: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
aa90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
aaa0: 6c 73 65 20 69 66 28 20 70 54 61 62 2d 3e 70 53  lse if( pTab->pS
aab0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
aac0: 20 2f 2a 20 41 20 72 65 61 6c 20 74 61 62 6c 65   /* A real table
aad0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
aae0: 72 74 28 20 21 70 53 20 29 3b 0a 20 20 20 20 20  rt( !pS );.     
aaf0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
ab00: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
ab10: 65 79 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ey;.        asse
ab20: 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20  rt( iCol==-1 || 
ab30: 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c  (iCol>=0 && iCol
ab40: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a  <pTab->nCol) );.
ab50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
ab60: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
ab70: 44 41 54 41 0a 20 20 20 20 20 20 20 20 69 66 28  DATA.        if(
ab80: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
ab90: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
aba0: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
abb0: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f    zOrigCol = "ro
abc0: 77 69 64 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  wid";.        }e
abd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
abe0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
abf0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
ac00: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
ac10: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
ac20: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
ac30: 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d        estWidth =
ac40: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ac50: 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20  ].szEst;.       
ac60: 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67   }.        zOrig
ac70: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
ac80: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
ac90: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
aca0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
acb0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
acc0: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
acd0: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
ace0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
acf0: 20 20 7a 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d    zOrigDb = pNC-
ad00: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62  >pParse->db->aDb
ad10: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
ad20: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
ad30: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
ad40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
ad50: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
ad60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ad70: 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d           zType =
ad80: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ad90: 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20  ].zType;.       
ada0: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
adb0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
adc0: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
add0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
ade0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
adf0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
ae00: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
ae10: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
ae20: 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  T: {.      /* Th
ae30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ae40: 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 52 65  a sub-select. Re
ae50: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
ae60: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a 20 20  tion type and.  
ae70: 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e      ** origin in
ae80: 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e 67 6c  fo for the singl
ae90: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  e column in the 
aea0: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
aeb0: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20 20 2a  e SELECT.      *
aec0: 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  * statement..   
aed0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65     */.      Name
aee0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 20  Context sNC;.   
aef0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20     Select *pS = 
af00: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
af10: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 20  ;.      Expr *p 
af20: 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  = pS->pEList->a[
af30: 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  0].pExpr;.      
af40: 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
af50: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
af60: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
af70: 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69        sNC.pSrcLi
af80: 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20  st = pS->pSrc;. 
af90: 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d       sNC.pNext =
afa0: 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e   pNC;.      sNC.
afb0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
afc0: 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54 79 70  arse;.      zTyp
afd0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
afe0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
aff0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
b000: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
b010: 68 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  h); .      break
b020: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
b030: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
b040: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
b050: 4d 45 54 41 44 41 54 41 20 20 0a 20 20 69 66 28  METADATA  .  if(
b060: 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a 20 20 20   pzOrigDb ){.   
b070: 20 61 73 73 65 72 74 28 20 70 7a 4f 72 69 67 54   assert( pzOrigT
b080: 61 62 20 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20  ab && pzOrigCol 
b090: 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 44 62  );.    *pzOrigDb
b0a0: 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20   = zOrigDb;.    
b0b0: 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72  *pzOrigTab = zOr
b0c0: 69 67 54 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72  igTab;.    *pzOr
b0d0: 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c  igCol = zOrigCol
b0e0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
b0f0: 66 28 20 70 45 73 74 57 69 64 74 68 20 29 20 2a  f( pEstWidth ) *
b100: 70 45 73 74 57 69 64 74 68 20 3d 20 65 73 74 57  pEstWidth = estW
b110: 69 64 74 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a  idth;.  return z
b120: 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Type;.}../*.** G
b130: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
b140: 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20  t will tell the 
b150: 56 44 42 45 20 74 68 65 20 64 65 63 6c 61 72 61  VDBE the declara
b160: 74 69 6f 6e 20 74 79 70 65 73 20 6f 66 20 63 6f  tion types of co
b170: 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
b180: 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73  result set..*/.s
b190: 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72  tatic void gener
b1a0: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a  ateColumnTypes(.
b1b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
b1c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
b1d0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
b1e0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
b1f0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
b200: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
b210: 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45   *pEList    /* E
b220: 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e  xpressions defin
b230: 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20 73  ing the result s
b240: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  et */.){.#ifndef
b250: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
b260: 4c 54 59 50 45 0a 20 20 56 64 62 65 20 2a 76 20  LTYPE.  Vdbe *v 
b270: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
b280: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65  .  int i;.  Name
b290: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 73  Context sNC;.  s
b2a0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54  NC.pSrcList = pT
b2b0: 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50  abList;.  sNC.pP
b2c0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
b2d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
b2e0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
b2f0: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70  .    Expr *p = p
b300: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
b310: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
b320: 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66 64 65 66  r *zType;.#ifdef
b330: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
b340: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
b350: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
b360: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 20 20  OrigDb = 0;.    
b370: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
b380: 67 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f  gTab = 0;.    co
b390: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 43  nst char *zOrigC
b3a0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70  ol = 0;.    zTyp
b3b0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
b3c0: 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62  sNC, p, &zOrigDb
b3d0: 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f  , &zOrigTab, &zO
b3e0: 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20  rigCol, 0);..   
b3f0: 20 2f 2a 20 54 68 65 20 76 64 62 65 20 6d 75 73   /* The vdbe mus
b400: 74 20 6d 61 6b 65 20 69 74 73 20 6f 77 6e 20 63  t make its own c
b410: 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  opy of the colum
b420: 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74 68 65 72  n-type and other
b430: 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20   .    ** column 
b440: 73 70 65 63 69 66 69 63 20 73 74 72 69 6e 67 73  specific strings
b450: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 63  , in case the sc
b460: 68 65 6d 61 20 69 73 20 72 65 73 65 74 20 62 65  hema is reset be
b470: 66 6f 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  fore this.    **
b480: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
b490: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
b4a0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
b4b0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
b4c0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41   i, COLNAME_DATA
b4d0: 42 41 53 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53  BASE, zOrigDb, S
b4e0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
b4f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
b500: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
b510: 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c  , COLNAME_TABLE,
b520: 20 7a 4f 72 69 67 54 61 62 2c 20 53 51 4c 49 54   zOrigTab, SQLIT
b530: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
b540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
b550: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
b560: 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f  LNAME_COLUMN, zO
b570: 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54  rigCol, SQLITE_T
b580: 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65  RANSIENT);.#else
b590: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
b5a0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
b5b0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65   0, 0, 0, 0);.#e
b5c0: 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
b5d0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
b5e0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43  , i, COLNAME_DEC
b5f0: 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c 20 53 51  LTYPE, zType, SQ
b600: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
b610: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
b620: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
b630: 4d 49 54 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f  MIT_DECLTYPE) */
b640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
b650: 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
b660: 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20  l tell the VDBE 
b670: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
b680: 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72  umns.** in the r
b690: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 69 73  esult set.  This
b6a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
b6b0: 75 73 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  used to provide 
b6c0: 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76  the.** azCol[] v
b6d0: 61 6c 75 65 73 20 69 6e 20 74 68 65 20 63 61 6c  alues in the cal
b6e0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  lback..*/.static
b6f0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f   void generateCo
b700: 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72  lumnNames(.  Par
b710: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b720: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
b730: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
b740: 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c  *pTabList,  /* L
b750: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f  ist of tables */
b760: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
b770: 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73  ist    /* Expres
b780: 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74  sions defining t
b790: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
b7a0: 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  .){.  Vdbe *v = 
b7b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
b7c0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c   int i, j;.  sql
b7d0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b7e0: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c  e->db;.  int ful
b7f0: 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d  lNames, shortNam
b800: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
b810: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
b820: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
b830: 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69   an EXPLAIN, ski
b840: 70 20 74 68 69 73 20 73 74 65 70 20 2a 2f 0a 20  p this step */. 
b850: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
b860: 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72 65 74 75  lain ){.    retu
b870: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
b880: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f    if( pParse->co
b890: 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56  lNamesSet || NEV
b8a0: 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e  ER(v==0) || db->
b8b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
b8c0: 65 74 75 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d  eturn;.  pParse-
b8d0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31  >colNamesSet = 1
b8e0: 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20  ;.  fullNames = 
b8f0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
b900: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
b910: 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d  )!=0;.  shortNam
b920: 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  es = (db->flags 
b930: 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
b940: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71  lNames)!=0;.  sq
b950: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
b960: 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e  ols(v, pEList->n
b970: 45 78 70 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Expr);.  for(i=0
b980: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
b990: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
b9a0: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 70 45  r *p;.    p = pE
b9b0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
b9c0: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
b9d0: 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  p==0) ) continue
b9e0: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
b9f0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a  ->a[i].zName ){.
ba00: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
ba10: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
ba20: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71  .zName;.      sq
ba30: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
ba40: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
ba50: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
ba60: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
ba70: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ba80: 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  (p->op==TK_COLUM
ba90: 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  N || p->op==TK_A
baa0: 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54  GG_COLUMN) && pT
bab0: 61 62 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  abList ){.      
bac0: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
bad0: 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20     char *zCol;. 
bae0: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
baf0: 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  p->iColumn;.    
bb00: 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59    for(j=0; ALWAY
bb10: 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  S(j<pTabList->nS
bb20: 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  rc); j++){.     
bb30: 20 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d     if( pTabList-
bb40: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70  >a[j].iCursor==p
bb50: 2d 3e 69 54 61 62 6c 65 20 29 20 62 72 65 61 6b  ->iTable ) break
bb60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bb70: 61 73 73 65 72 74 28 20 6a 3c 70 54 61 62 4c 69  assert( j<pTabLi
bb80: 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20  st->nSrc );.    
bb90: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
bba0: 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20  t->a[j].pTab;.  
bbb0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
bbc0: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
bbd0: 4b 65 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Key;.      asser
bbe0: 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28  t( iCol==-1 || (
bbf0: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
bc00: 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20  pTab->nCol) );. 
bc10: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
bc20: 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  ){.        zCol 
bc30: 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20  = "rowid";.     
bc40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bc50: 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
bc60: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
bc70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
bc80: 20 21 73 68 6f 72 74 4e 61 6d 65 73 20 26 26 20   !shortNames && 
bc90: 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20  !fullNames ){.  
bca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bcb0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
bcc0: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
bcd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
bce0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bcf0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
bd00: 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e  pan), SQLITE_DYN
bd10: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
bd20: 73 65 20 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73  se if( fullNames
bd30: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
bd40: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20   *zName = 0;.   
bd50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
bd60: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
bd70: 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
bd80: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  Name, zCol);.   
bd90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bda0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
bdb0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
bdc0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e  Name, SQLITE_DYN
bdd0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c  AMIC);.      }el
bde0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
bdf0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
be00: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
be10: 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49  NAME, zCol, SQLI
be20: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
be30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
be40: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
be50: 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e  ar *z = pEList->
be60: 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[i].zSpan;.    
be70: 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c    z = z==0 ? sql
be80: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
be90: 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29  "column%d", i+1)
bea0: 20 3a 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   : sqlite3DbStrD
beb0: 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  up(db, z);.     
bec0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
bed0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
bee0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51  NAME_NAME, z, SQ
bef0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
bf00: 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72     }.  }.  gener
bf10: 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70  ateColumnTypes(p
bf20: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
bf30: 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a   pEList);.}../*.
bf40: 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20 65 78  ** Given a an ex
bf50: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 28 77  pression list (w
bf60: 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 74  hich is really t
bf70: 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65  he list of expre
bf80: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66  ssions.** that f
bf90: 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74 20 73  orm the result s
bfa0: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  et of a SELECT s
bfb0: 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74  tatement) comput
bfc0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
bfd0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
bfe0: 72 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 77  r a table that w
bff0: 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 78  ould hold the ex
c000: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
c010: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20  *.** All column 
c020: 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20 75 6e  names will be un
c030: 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ique..**.** Only
c040: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
c050: 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64 2e 20  s are computed. 
c060: 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43   Column.zType, C
c070: 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20  olumn.zColl,.** 
c080: 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73  and other fields
c090: 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a   of Column are z
c0a0: 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  eroed..**.** Ret
c0b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
c0c0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 61 20   success.  If a 
c0d0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
c0e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
c0f0: 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e  ** store NULL in
c100: 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e   *paCol and 0 in
c110: 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75   *pnCol and retu
c120: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  rn SQLITE_NOMEM.
c130: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
c140: 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
c150: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
c160: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c170: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
c180: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
c190: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20  List *pEList,   
c1a0: 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69 73 74      /* Expr list
c1b0: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20 64   from which to d
c1c0: 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  erive column nam
c1d0: 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43  es */.  i16 *pnC
c1e0: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
c1f0: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
c200: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68  ber of columns h
c210: 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20  ere */.  Column 
c220: 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20 20 20  **paCol         
c230: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65   /* Write the ne
c240: 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65  w column list he
c250: 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
c260: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
c270: 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61 62 61  >db;   /* Databa
c280: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
c290: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c2b0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
c2c0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
c2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2e0: 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65 64 20   /* Index added 
c2f0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65  to make the name
c300: 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c   unique */.  Col
c310: 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c  umn *aCol, *pCol
c320: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
c330: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72 65 73  looping over res
c340: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
c350: 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c370: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
c380: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
c390: 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  set */.  Expr *p
c3a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c3b0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
c3c0: 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  on for a single 
c3d0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f  result column */
c3e0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c400: 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
c410: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c430: 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69  * Size of name i
c440: 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20  n zName[] */..  
c450: 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a 20 20  if( pEList ){.  
c460: 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d    nCol = pEList-
c470: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c  >nExpr;.    aCol
c480: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c490: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
c4a0: 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29  f(aCol[0])*nCol)
c4b0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c4c0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  aCol==0 );.  }el
c4d0: 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30  se{.    nCol = 0
c4e0: 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a  ;.    aCol = 0;.
c4f0: 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e    }.  *pnCol = n
c500: 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20  Col;.  *paCol = 
c510: 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  aCol;..  for(i=0
c520: 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e  , pCol=aCol; i<n
c530: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
c540: 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20 61 6e  ){.    /* Get an
c550: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e 61 6d   appropriate nam
c560: 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  e for the column
c570: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
c580: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
c590: 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74 2d 3e 61  ollate(pEList->a
c5a0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
c5b0: 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c  if( (zName = pEL
c5c0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
c5d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
c5e0: 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f  If the column co
c5f0: 6e 74 61 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e  ntains an "AS <n
c600: 61 6d 65 3e 22 20 70 68 72 61 73 65 2c 20 75 73  ame>" phrase, us
c610: 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74 68 65 20  e <name> as the 
c620: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e  name */.      zN
c630: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
c640: 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29  trDup(db, zName)
c650: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c660: 20 20 20 45 78 70 72 20 2a 70 43 6f 6c 45 78 70     Expr *pColExp
c670: 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68 65 20 65  r = p;  /* The e
c680: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
c690: 73 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  s the result col
c6a0: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
c6b0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
c6c0: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
c6d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
c6e0: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
c6f0: 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  */.      while( 
c700: 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  pColExpr->op==TK
c710: 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20  _DOT ){.        
c720: 70 43 6f 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45  pColExpr = pColE
c730: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
c740: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
c750: 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  lExpr!=0 );.    
c760: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43    }.      if( pC
c770: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  olExpr->op==TK_C
c780: 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41 59 53 28  OLUMN && ALWAYS(
c790: 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d  pColExpr->pTab!=
c7a0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  0) ){.        /*
c7b0: 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65   For columns use
c7c0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
c7d0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
c7e0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c   int iCol = pCol
c7f0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
c800: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 43         pTab = pC
c810: 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20  olExpr->pTab;.  
c820: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
c830: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
c840: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 7a  iPKey;.        z
c850: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
c860: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 0a  rintf(db, "%s",.
c870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c880: 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d   iCol>=0 ? pTab-
c890: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
c8a0: 65 20 3a 20 22 72 6f 77 69 64 22 29 3b 0a 20 20  e : "rowid");.  
c8b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43      }else if( pC
c8c0: 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  olExpr->op==TK_I
c8d0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  D ){.        ass
c8e0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
c8f0: 70 65 72 74 79 28 70 43 6f 6c 45 78 70 72 2c 20  perty(pColExpr, 
c900: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
c910: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c920: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
c930: 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c 45 78 70  b, "%s", pColExp
c940: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
c950: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c960: 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 6f 72     /* Use the or
c970: 69 67 69 6e 61 6c 20 74 65 78 74 20 6f 66 20 74  iginal text of t
c980: 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73  he column expres
c990: 73 69 6f 6e 20 61 73 20 69 74 73 20 6e 61 6d 65  sion as its name
c9a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   */.        zNam
c9b0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
c9c0: 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 45 4c  tf(db, "%s", pEL
c9d0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29  ist->a[i].zSpan)
c9e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c9f0: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
ca00: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
ca10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ca20: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
ca30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
ca40: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
ca50: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
ca60: 20 69 73 20 75 6e 69 71 75 65 2e 20 20 49 66 20   is unique.  If 
ca70: 74 68 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  the name is not 
ca80: 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61  unique,.    ** a
ca90: 70 70 65 6e 64 20 61 20 69 6e 74 65 67 65 72 20  ppend a integer 
caa0: 74 6f 20 74 68 65 20 6e 61 6d 65 20 73 6f 20 74  to the name so t
cab0: 68 61 74 20 69 74 20 62 65 63 6f 6d 65 73 20 75  hat it becomes u
cac0: 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  nique..    */.  
cad0: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
cae0: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
caf0: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d  ;.    for(j=cnt=
cb00: 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<i; j++){.  
cb10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
cb20: 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a  trICmp(aCol[j].z
cb30: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
cb40: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
cb50: 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20  *zNewName;.     
cb60: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
cb70: 20 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b    for(k=nName-1;
cb80: 20 6b 3e 31 20 26 26 20 73 71 6c 69 74 65 33 49   k>1 && sqlite3I
cb90: 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29  sdigit(zName[k])
cba0: 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20  ; k--){}.       
cbb0: 20 69 66 28 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27   if( zName[k]=='
cbc0: 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a  :' ) nName = k;.
cbd0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e          zName[nN
cbe0: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  ame] = 0;.      
cbf0: 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c    zNewName = sql
cc00: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
cc10: 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20  "%s:%d", zName, 
cc20: 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  ++cnt);.        
cc30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
cc40: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
cc50: 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61    zName = zNewNa
cc60: 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20  me;.        j = 
cc70: 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  -1;.        if( 
cc80: 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b  zName==0 ) break
cc90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cca0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20      pCol->zName 
ccb0: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69  = zName;.  }.  i
ccc0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
ccd0: 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  led ){.    for(j
cce0: 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<i; j++){. 
ccf0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
cd00: 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a  ee(db, aCol[j].z
cd10: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
cd20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
cd30: 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70  b, aCol);.    *p
cd40: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70  aCol = 0;.    *p
cd50: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  nCol = 0;.    re
cd60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
cd70: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
cd80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cd90: 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61 6e 64  .** Add type and
cda0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72   collation infor
cdb0: 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75  mation to a colu
cdc0: 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20 6f 6e  mn list based on
cdd0: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
cde0: 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54  tement..** .** T
cdf0: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70  he column list p
ce00: 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65 20 66  resumably came f
ce10: 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  rom selectColumn
ce20: 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c 69 73  NamesFromExprLis
ce30: 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  t()..** The colu
ce40: 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79  mn list has only
ce50: 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65   names, not type
ce60: 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e  s or collations.
ce70: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
ce80: 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68 20 61  e goes through a
ce90: 6e 64 20 61 64 64 73 20 74 68 65 20 74 79 70 65  nd adds the type
cea0: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
ceb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
cec0: 74 69 6e 65 20 72 65 71 75 69 72 65 73 20 74 68  tine requires th
ced0: 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66 69 65  at all identifie
cee0: 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  rs in the SELECT
cef0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 62 65  .** statement be
cf00: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74   resolved..*/.st
cf10: 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
cf20: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
cf30: 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72  Collation(.  Par
cf40: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
cf50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
cf60: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c  ntexts */.  Tabl
cf70: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
cf80: 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20    /* Add column 
cf90: 74 79 70 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  type information
cfa0: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a   to this table *
cfb0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
cfc0: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 53 45 4c  ect       /* SEL
cfd0: 45 43 54 20 75 73 65 64 20 74 6f 20 64 65 74 65  ECT used to dete
cfe0: 72 6d 69 6e 65 20 74 79 70 65 73 20 61 6e 64 20  rmine types and 
cff0: 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b  collations */.){
d000: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d010: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e   pParse->db;.  N
d020: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
d030: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
d040: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
d050: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  ;.  int i;.  Exp
d060: 72 20 2a 70 3b 0a 20 20 73 74 72 75 63 74 20 45  r *p;.  struct E
d070: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
d080: 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30  .  u64 szAll = 0
d090: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 65  ;..  assert( pSe
d0a0: 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  lect!=0 );.  ass
d0b0: 65 72 74 28 20 28 70 53 65 6c 65 63 74 2d 3e 73  ert( (pSelect->s
d0c0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
d0d0: 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a 20 20 61  olved)!=0 );.  a
d0e0: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
d0f0: 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  l==pSelect->pELi
d100: 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d  st->nExpr || db-
d110: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
d120: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
d130: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
d140: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
d150: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
d160: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
d170: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
d180: 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74 2d  ;.  a = pSelect-
d190: 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f  >pEList->a;.  fo
d1a0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(i=0, pCol=pTab
d1b0: 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e  ->aCol; i<pTab->
d1c0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
d1d0: 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d  +){.    p = a[i]
d1e0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c  .pExpr;.    pCol
d1f0: 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65  ->zType = sqlite
d200: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 63 6f  3DbStrDup(db, co
d210: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
d220: 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73  ,0,0,0, &pCol->s
d230: 7a 45 73 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c  zEst));.    szAl
d240: 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  l += pCol->szEst
d250: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
d260: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
d270: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
d280: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66     if( pCol->aff
d290: 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d  inity==0 ) pCol-
d2a0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
d2b0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
d2c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
d2d0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
d2e0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
d2f0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
d300: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
d310: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d320: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
d330: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62      }.  }.  pTab
d340: 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c  ->szTabRow = sql
d350: 69 74 65 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c  ite3LogEst(szAll
d360: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  *4);.}../*.** Gi
d370: 76 65 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61  ven a SELECT sta
d380: 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72 61 74 65  tement, generate
d390: 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
d3a0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
d3b0: 73 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  s.** the result 
d3c0: 73 65 74 20 6f 66 20 74 68 61 74 20 53 45 4c 45  set of that SELE
d3d0: 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  CT..*/.Table *sq
d3e0: 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
d3f0: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
d400: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
d410: 65 6c 65 63 74 29 7b 0a 20 20 54 61 62 6c 65 20  elect){.  Table 
d420: 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33  *pTab;.  sqlite3
d430: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d440: 62 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 46 6c  b;.  int savedFl
d450: 61 67 73 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61  ags;..  savedFla
d460: 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a  gs = db->flags;.
d470: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
d480: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
d490: 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  mes;.  db->flags
d4a0: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
d4b0: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69  ColNames;.  sqli
d4c0: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
d4d0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 30  arse, pSelect, 0
d4e0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
d4f0: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
d500: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
d510: 63 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65  ct->pPrior ) pSe
d520: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
d530: 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c  pPrior;.  db->fl
d540: 61 67 73 20 3d 20 73 61 76 65 64 46 6c 61 67 73  ags = savedFlags
d550: 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
d560: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
d570: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
d580: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   );.  if( pTab==
d590: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
d5a0: 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  0;.  }.  /* The 
d5b0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
d5c0: 4f 66 53 65 6c 65 63 74 28 29 20 69 73 20 6f 6e  OfSelect() is on
d5d0: 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e 74 65 78  ly used n contex
d5e0: 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69  ts where lookasi
d5f0: 64 65 0a 20 20 2a 2a 20 69 73 20 64 69 73 61 62  de.  ** is disab
d600: 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  led */.  assert(
d610: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
d620: 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  Enabled==0 );.  
d630: 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
d640: 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
d650: 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45  0;.  pTab->nRowE
d660: 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20  st = 1048576;.  
d670: 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
d680: 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
d690: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  , pSelect->pELis
d6a0: 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  t, &pTab->nCol, 
d6b0: 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20  &pTab->aCol);.  
d6c0: 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
d6d0: 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
d6e0: 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53  pParse, pTab, pS
d6f0: 65 6c 65 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e  elect);.  pTab->
d700: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66  iPKey = -1;.  if
d710: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
d720: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
d730: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
d740: 20 70 54 61 62 29 3b 0a 20 20 20 20 72 65 74 75   pTab);.    retu
d750: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
d760: 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
d770: 2a 20 47 65 74 20 61 20 56 44 42 45 20 66 6f 72  * Get a VDBE for
d780: 20 74 68 65 20 67 69 76 65 6e 20 70 61 72 73 65   the given parse
d790: 72 20 63 6f 6e 74 65 78 74 2e 20 20 43 72 65 61  r context.  Crea
d7a0: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
d7b0: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66  necessary..** If
d7c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
d7d0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
d7e0: 64 20 6c 65 61 76 65 20 61 20 6d 65 73 73 61 67  d leave a messag
d7f0: 65 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  e in pParse..*/.
d800: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 47 65 74  Vdbe *sqlite3Get
d810: 56 64 62 65 28 50 61 72 73 65 20 2a 70 50 61 72  Vdbe(Parse *pPar
d820: 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  se){.  Vdbe *v =
d830: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
d840: 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
d850: 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56    v = pParse->pV
d860: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dbe = sqlite3Vdb
d870: 65 43 72 65 61 74 65 28 70 50 61 72 73 65 29 3b  eCreate(pParse);
d880: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d890: 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 69  OMIT_TRACE.    i
d8a0: 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20 73 71  f( v ){.      sq
d8b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
d8c0: 76 2c 20 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20  v, OP_Trace);.  
d8d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
d8e0: 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f   return v;.}.../
d8f0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
d900: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
d910: 73 65 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68  set fields of th
d920: 65 20 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f  e SELECT based o
d930: 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20  n the.** pLimit 
d940: 61 6e 64 20 70 4f 66 66 73 65 74 20 65 78 70 72  and pOffset expr
d950: 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74  essions.  pLimit
d960: 20 61 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c   and pOffset hol
d970: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
d980: 73 0a 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72  s.** that appear
d990: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
d9a0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
d9b0: 66 74 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61  fter the LIMIT a
d9c0: 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79  nd OFFSET.** key
d9d0: 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20  words.  Or NULL 
d9e0: 69 66 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64  if those keyword
d9f0: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69  s are omitted. i
da00: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
da10: 74 20 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e  t .** are the in
da20: 74 65 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67  teger memory reg
da30: 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f  ister numbers fo
da40: 72 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  r counters used 
da50: 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74  to compute .** t
da60: 68 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66  he limit and off
da70: 73 65 74 2e 20 20 49 66 20 74 68 65 72 65 20 69  set.  If there i
da80: 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f  s no limit and/o
da90: 72 20 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a  r offset, then .
daa0: 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  ** iLimit and iO
dab0: 66 66 73 65 74 20 61 72 65 20 6e 65 67 61 74 69  ffset are negati
dac0: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ve..**.** This r
dad0: 6f 75 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74  outine changes t
dae0: 68 65 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69  he values of iLi
daf0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
db00: 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d  only if.** a lim
db10: 69 74 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20  it or offset is 
db20: 64 65 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69  defined by pLimi
db30: 74 20 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20  t and pOffset.  
db40: 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f  iLimit and.** iO
db50: 66 66 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  ffset should hav
db60: 65 20 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f  e been preset to
db70: 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 65 66   appropriate def
db80: 61 75 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72  ault values (zer
db90: 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63  o).** prior to c
dba0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
dbb0: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ine..**.** The i
dbc0: 4f 66 66 73 65 74 20 72 65 67 69 73 74 65 72 20  Offset register 
dbd0: 28 69 66 20 69 74 20 65 78 69 73 74 73 29 20 69  (if it exists) i
dbe0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
dbf0: 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   the value.** of
dc00: 20 74 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68   the OFFSET.  Th
dc10: 65 20 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65  e iLimit registe
dc20: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
dc30: 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69   to LIMIT.  Regi
dc40: 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b  ster.** iOffset+
dc50: 31 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  1 is initialized
dc60: 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54   to LIMIT+OFFSET
dc70: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ..**.** Only if 
dc80: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
dc90: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
dca0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
dcb0: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
dcc0: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
dcd0: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
dce0: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
dcf0: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
dd00: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
dd10: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
dd20: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
dd30: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
dd40: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
dd50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
dd60: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
dd70: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
dd80: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
dd90: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
dda0: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
ddb0: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
ddc0: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
ddd0: 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28   addr1, n;.  if(
dde0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
ddf0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
de00: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
de10: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
de20: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
de30: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72  e.  ** controver
de40: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
de50: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
de60: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
de70: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
de80: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
de90: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
dea0: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
deb0: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
dec0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
ded0: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
dee0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
def0: 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69  set==0 || p->pLi
df00: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  mit!=0 );.  if( 
df10: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
df20: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
df30: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
df40: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
df50: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
df60: 72 73 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  rse);.    assert
df70: 28 20 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ( v!=0 );.    if
df80: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
df90: 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74  nteger(p->pLimit
dfa0: 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73  , &n) ){.      s
dfb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
dfc0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
dfd0: 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  n, iLimit);.    
dfe0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
dff0: 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72  , "LIMIT counter
e000: 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  "));.      if( n
e010: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
e020: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e030: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
e040: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d  iBreak);.      }
e050: 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26  else if( n>=0 &&
e060: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28   p->nSelectRow>(
e070: 75 36 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20  u64)n ){.       
e080: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
e090: 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   n;.      }.    
e0a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
e0b0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e0c0: 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20  rse, p->pLimit, 
e0d0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73  iLimit);.      s
e0e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
e0f0: 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
e100: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
e110: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
e120: 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22   "LIMIT counter"
e130: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
e140: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e150: 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74  P_IfZero, iLimit
e160: 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d  , iBreak);.    }
e170: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66  .    if( p->pOff
e180: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  set ){.      p->
e190: 69 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65  iOffset = iOffse
e1a0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
e1b0: 65 6d 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  em;.      pParse
e1c0: 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41  ->nMem++;   /* A
e1d0: 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61  llocate an extra
e1e0: 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69   register for li
e1f0: 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20  mit+offset */.  
e200: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e210: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ode(pParse, p->p
e220: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29  Offset, iOffset)
e230: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e240: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e250: 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73  MustBeInt, iOffs
e260: 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
e270: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53  omment((v, "OFFS
e280: 45 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20  ET counter"));. 
e290: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
e2a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e2b0: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66  , OP_IfPos, iOff
e2c0: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
e2d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e2e0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
e2f0: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
e300: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
e310: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
e320: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e330: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64  AddOp3(v, OP_Add
e340: 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65  , iLimit, iOffse
e350: 74 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20  t, iOffset+1);. 
e360: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
e370: 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53  ((v, "LIMIT+OFFS
e380: 45 54 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64  ET"));.      add
e390: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
e3a0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
e3b0: 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  os, iLimit);.   
e3c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e3d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
e3e0: 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b  er, -1, iOffset+
e3f0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
e400: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
e410: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20   addr1);.    }. 
e420: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
e430: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
e440: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
e450: 52 65 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f  Return the appro
e460: 70 72 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67  priate collating
e470: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68   sequence for th
e480: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
e490: 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c   of.** the resul
e4a0: 74 20 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f  t set for the co
e4b0: 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74  mpound-select st
e4c0: 61 74 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65  atement "p".  Re
e4d0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20  turn NULL if.** 
e4e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e  the column has n
e4f0: 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  o default collat
e500: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
e510: 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e  .** The collatin
e520: 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  g sequence for t
e530: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
e540: 63 74 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ct is taken from
e550: 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73   the.** left-mos
e560: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65  t term of the se
e570: 6c 65 63 74 20 74 68 61 74 20 68 61 73 20 61 20  lect that has a 
e580: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e590: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f  ce..*/.static Co
e5a0: 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65  llSeq *multiSele
e5b0: 63 74 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  ctCollSeq(Parse 
e5c0: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
e5d0: 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  *p, int iCol){. 
e5e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a   CollSeq *pRet;.
e5f0: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
e600: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75  ){.    pRet = mu
e610: 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
e620: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69  (pParse, p->pPri
e630: 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c  or, iCol);.  }el
e640: 73 65 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30  se{.    pRet = 0
e650: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
e660: 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28  iCol>=0 );.  if(
e670: 20 70 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c   pRet==0 && iCol
e680: 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  <p->pEList->nExp
e690: 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20  r ){.    pRet = 
e6a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
e6b0: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45  eq(pParse, p->pE
e6c0: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
e6d0: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
e6e0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69  rn pRet;.}.#endi
e6f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
e700: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
e710: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
e720: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
e730: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e740: 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63  generates VDBE c
e750: 6f 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ode to compute t
e760: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
e770: 57 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a  WITH RECURSIVE.*
e780: 2a 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66  * query of the f
e790: 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65  orm:.**.**   <re
e7a0: 63 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41  cursive-table> A
e7b0: 53 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e  S (<setup-query>
e7c0: 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65   UNION [ALL] <re
e7d0: 63 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a  cursive-query>).
e7e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e7f0: 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f             \____
e800: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20  _______/        
e810: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
e820: 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e840: 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20      p->pPrior   
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68     p.**.**.** Th
e870: 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f  ere is exactly o
e880: 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ne reference to 
e890: 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
e8a0: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
e8b0: 63 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63  clause.** of rec
e8c0: 75 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61  ursive-query, ma
e8d0: 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72  rked with the Sr
e8e0: 63 4c 69 73 74 2d 3e 61 5b 5d 2e 69 73 52 65 63  cList->a[].isRec
e8f0: 75 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a  ursive flag..**.
e900: 2a 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65  ** The setup-que
e910: 72 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  ry runs once to 
e920: 67 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74  generate an init
e930: 69 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20  ial set of rows 
e940: 74 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20  that go.** into 
e950: 61 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  a Queue table.  
e960: 52 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74  Rows are extract
e970: 65 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75  ed from the Queu
e980: 65 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a  e table one by.*
e990: 2a 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77  * one.  Each row
e9a0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
e9b0: 51 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20  Queue is output 
e9c0: 74 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20  to pDest.  Then 
e9d0: 74 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78  the single.** ex
e9e0: 74 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77  tracted row (now
e9f0: 20 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74   in the iCurrent
ea00: 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20   table) becomes 
ea10: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
ea20: 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d  he.** recursive-
ea30: 74 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75  table for a recu
ea40: 72 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e  rsive-query run.
ea50: 20 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20    The output of 
ea60: 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75  the recursive-qu
ea70: 65 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ery.** is added 
ea80: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75  back into the Qu
ea90: 65 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  eue table.  Then
eaa0: 20 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20   another row is 
eab0: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
eac0: 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20  ueue.** and the 
ead0: 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e  iteration contin
eae0: 75 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75  ues until the Qu
eaf0: 65 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  eue table is emp
eb00: 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ty..**.** If the
eb10: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
eb20: 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
eb30: 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63  N then no duplic
eb40: 61 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65  ate rows are eve
eb50: 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  r.** inserted in
eb60: 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62  to the Queue tab
eb70: 6c 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e  le.  The iDistin
eb80: 63 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61  ct table keeps a
eb90: 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77   copy of all row
eba0: 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65  s.** that have e
ebb0: 76 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ver been inserte
ebc0: 64 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64  d into Queue and
ebd0: 20 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74   causes duplicat
ebe0: 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63  es to be.** disc
ebf0: 61 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f  arded.  If the o
ec00: 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
ec10: 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69   ALL, then dupli
ec20: 63 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65  cates are allowe
ec30: 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  d..** .** If the
ec40: 20 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52   query has an OR
ec50: 44 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74  DER BY, then ent
ec60: 72 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75  ries in the Queu
ec70: 65 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74  e table are kept
ec80: 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20   in.** ORDER BY 
ec90: 6f 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69  order and the fi
eca0: 72 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74  rst entry is ext
ecb0: 72 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20  racted for each 
ecc0: 63 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a  cycle.  Without.
ecd0: 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20  ** an ORDER BY, 
ece0: 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20  the Queue table 
ecf0: 69 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a  is just a FIFO..
ed00: 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54  **.** If a LIMIT
ed10: 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69   clause is provi
ed20: 64 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74  ded, then the it
ed30: 65 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66  eration stops af
ed40: 74 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a  ter LIMIT rows.*
ed50: 2a 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70  * have been outp
ed60: 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20  ut to pDest.  A 
ed70: 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65  LIMIT of zero me
ed80: 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f  ans to output no
ed90: 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e   rows and a.** n
eda0: 65 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65  egative LIMIT me
edb0: 61 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c  ans to output al
edc0: 6c 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72  l rows.  If ther
edd0: 65 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46  e is also an OFF
ede0: 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69  SET clause.** wi
edf0: 74 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61  th a positive va
ee00: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  lue, then the fi
ee10: 72 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75  rst OFFSET outpu
ee20: 74 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64  ts are discarded
ee30: 20 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20   rather.** than 
ee40: 62 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44  being sent to pD
ee50: 65 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20  est.  The LIMIT 
ee60: 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62  count does not b
ee70: 65 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72  egin until after
ee80: 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20   OFFSET.** rows 
ee90: 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
eea0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
eeb0: 64 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65  d generateWithRe
eec0: 63 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20  cursiveQuery(.  
eed0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
eee0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
eef0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
ef00: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
ef10: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72      /* The recur
ef20: 73 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62  sive SELECT to b
ef30: 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
ef40: 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
ef50: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
ef60: 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
ef70: 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  lts */.){.  SrcL
ef80: 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
ef90: 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
efa0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
efb0: 74 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75  the recursive qu
efc0: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ery */.  int nCo
efd0: 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  l = p->pEList->n
efe0: 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  Expr;  /* Number
eff0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
f000: 68 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62  he recursive tab
f010: 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  le */.  Vdbe *v 
f020: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
f030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65        /* The pre
f040: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
f050: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
f060: 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
f070: 70 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69  pSetup = p->pPri
f080: 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74  or;   /* The set
f090: 75 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  up query */.  in
f0a0: 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
f0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f0c0: 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a  op of the loop *
f0d0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74  /.  int addrCont
f0e0: 2c 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20  , addrBreak;    
f0f0: 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e    /* CONTINUE an
f100: 64 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65  d BREAK addresse
f110: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72  s */.  int iCurr
f120: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
f130: 20 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72       /* The Curr
f140: 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ent table */.  i
f150: 6e 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20  nt regCurrent;  
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f170: 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
f180: 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a   Current table *
f190: 2f 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20  /.  int iQueue; 
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74    /* The Queue t
f1c0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  able */.  int iD
f1d0: 69 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20  istinct = 0;    
f1e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e          /* To en
f1f0: 73 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75  sure unique resu
f200: 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a  lts if UNION */.
f210: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52    int eDest = SR
f220: 54 5f 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  T_Table;        
f230: 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20  /* How to write 
f240: 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65  to Queue */.  Se
f250: 6c 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65  lectDest destQue
f260: 75 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ue;         /* S
f270: 65 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74  electDest target
f280: 74 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74  ting the Queue t
f290: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
f2c0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
f2d0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
f2e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
f2f0: 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45  sult code */.  E
f300: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
f310: 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y;           /* 
f320: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
f330: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
f340: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
f350: 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
f360: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
f370: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d   */.  int regLim
f380: 69 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20  it, regOffset;  
f390: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73      /* Registers
f3a0: 20 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61   used by LIMIT a
f3b0: 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20  nd OFFSET */..  
f3c0: 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72  /* Obtain author
f3d0: 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20  ization to do a 
f3e0: 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20  recursive query 
f3f0: 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
f400: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f410: 2c 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49  , SQLITE_RECURSI
f420: 56 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  VE, 0, 0, 0) ) r
f430: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f  eturn;..  /* Pro
f440: 63 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61  cess the LIMIT a
f450: 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  nd OFFSET clause
f460: 73 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74  s, if they exist
f470: 20 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20   */.  addrBreak 
f480: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
f490: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d  eLabel(v);.  com
f4a0: 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
f4b0: 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64  rs(pParse, p, ad
f4c0: 64 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d  drBreak);.  pLim
f4d0: 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
f4e0: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
f4f0: 4f 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d  Offset;.  regLim
f500: 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
f510: 20 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d    regOffset = p-
f520: 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70  >iOffset;.  p->p
f530: 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73  Limit = p->pOffs
f540: 65 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69  et = 0;.  p->iLi
f550: 6d 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74  mit = p->iOffset
f560: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61   = 0;..  /* Loca
f570: 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  te the cursor nu
f580: 6d 62 65 72 20 6f 66 20 74 68 65 20 43 75 72 72  mber of the Curr
f590: 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ent table */.  f
f5a0: 6f 72 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69  or(i=0; ALWAYS(i
f5b0: 3c 70 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b  <pSrc->nSrc); i+
f5c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63  +){.    if( pSrc
f5d0: 2d 3e 61 5b 69 5d 2e 69 73 52 65 63 75 72 73 69  ->a[i].isRecursi
f5e0: 76 65 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72  ve ){.      iCur
f5f0: 72 65 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69  rent = pSrc->a[i
f600: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ].iCursor;.     
f610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f620: 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74  }..  /* Detach t
f630: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
f640: 73 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70  se from the comp
f650: 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20  ound SELECT */. 
f660: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
f670: 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4f  OrderBy;.  p->pO
f680: 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f  rderBy = 0;..  /
f690: 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f  * Allocate curso
f6a0: 72 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51  rs numbers for Q
f6b0: 75 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63  ueue and Distinc
f6c0: 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e  t.  The cursor n
f6d0: 75 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74  umber for.  ** t
f6e0: 68 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c  he Distinct tabl
f6f0: 65 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  e must be exactl
f700: 79 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68  y one greater th
f710: 61 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65  an Queue in orde
f720: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53  r.  ** for the S
f730: 52 54 5f 44 69 73 74 54 61 62 6c 65 20 61 6e 64  RT_DistTable and
f740: 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64   SRT_DistQueue d
f750: 65 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77  estinations to w
f760: 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65  ork. */.  iQueue
f770: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
f780: 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  +;.  if( p->op==
f790: 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
f7a0: 65 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79  eDest = pOrderBy
f7b0: 20 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65   ? SRT_DistQueue
f7c0: 20 3a 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65   : SRT_DistTable
f7d0: 3b 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74 20  ;.    iDistinct 
f7e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
f7f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  ;.  }else{.    e
f800: 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
f810: 3f 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52  ? SRT_Queue : SR
f820: 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 73  T_Table;.  }.  s
f830: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
f840: 49 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c  Init(&destQueue,
f850: 20 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b   eDest, iQueue);
f860: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
f870: 63 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72  cursors for Curr
f880: 65 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20  ent, Queue, and 
f890: 44 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72  Distinct. */.  r
f8a0: 65 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50  egCurrent = ++pP
f8b0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
f8c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
f8d0: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
f8e0: 2c 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43  , iCurrent, regC
f8f0: 75 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20  urrent, nCol);. 
f900: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
f910: 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  .    KeyInfo *pK
f920: 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
f930: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
f940: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 31  rse, pOrderBy, 1
f950: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
f960: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
f970: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51  penEphemeral, iQ
f980: 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
f990: 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
f9c0: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
f9d0: 20 20 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f      destQueue.pO
f9e0: 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
f9f0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
fa00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fa10: 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  2(v, OP_OpenEphe
fa20: 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e  meral, iQueue, n
fa30: 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65  Col);.  }.  Vdbe
fa40: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65  Comment((v, "Que
fa50: 75 65 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69  ue table"));.  i
fa60: 66 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a  f( iDistinct ){.
fa70: 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
fa80: 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33  phm[0] = sqlite3
fa90: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
faa0: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
fab0: 69 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20  iDistinct, 0);. 
fac0: 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
fad0: 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  = SF_UsesEphemer
fae0: 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74  al;.  }..  /* St
faf0: 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ore the results 
fb00: 6f 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65  of the setup-que
fb10: 72 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a  ry in Queue. */.
fb20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
fb30: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
fb40: 74 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29  tup, &destQueue)
fb50: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
fb60: 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69  o end_of_recursi
fb70: 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20  ve_query;..  /* 
fb80: 46 69 6e 64 20 74 68 65 20 6e 65 78 74 20 72 6f  Find the next ro
fb90: 77 20 69 6e 20 74 68 65 20 51 75 65 75 65 20 61  w in the Queue a
fba0: 6e 64 20 6f 75 74 70 75 74 20 74 68 61 74 20 72  nd output that r
fbb0: 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  ow */.  addrTop 
fbc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
fbd0: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
fbe0: 2c 20 69 51 75 65 75 65 2c 20 61 64 64 72 42 72  , iQueue, addrBr
fbf0: 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e  eak);..  /* Tran
fc00: 73 66 65 72 20 74 68 65 20 6e 65 78 74 20 72 6f  sfer the next ro
fc10: 77 20 69 6e 20 51 75 65 75 65 20 6f 76 65 72 20  w in Queue over 
fc20: 74 6f 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20  to Current */.  
fc30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
fc40: 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c  1(v, OP_NullRow,
fc50: 20 69 43 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54   iCurrent); /* T
fc60: 6f 20 72 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63  o reset column c
fc70: 61 63 68 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ache */.  if( pO
fc80: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
fc90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
fca0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51  v, OP_Column, iQ
fcb0: 75 65 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e  ueue, pOrderBy->
fcc0: 6e 45 78 70 72 2b 31 2c 20 72 65 67 43 75 72 72  nExpr+1, regCurr
fcd0: 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
fce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
fcf0: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61  dOp2(v, OP_RowDa
fd00: 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65 67 43  ta, iQueue, regC
fd10: 75 72 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73  urrent);.  }.  s
fd20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
fd30: 28 76 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69  (v, OP_Delete, i
fd40: 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75  Queue);..  /* Ou
fd50: 74 70 75 74 20 74 68 65 20 73 69 6e 67 6c 65 20  tput the single 
fd60: 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20 2a  row in Current *
fd70: 2f 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73  /.  addrCont = s
fd80: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
fd90: 62 65 6c 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66  bel(v);.  codeOf
fda0: 66 73 65 74 28 76 2c 20 72 65 67 4f 66 66 73 65  fset(v, regOffse
fdb0: 74 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20  t, addrCont);.  
fdc0: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
fdd0: 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
fde0: 4c 69 73 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a  List, iCurrent,.
fdf0: 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
fe00: 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
fe10: 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 72  rBreak);.  if( r
fe20: 65 67 4c 69 6d 69 74 20 29 20 73 71 6c 69 74 65  egLimit ) sqlite
fe30: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fe40: 50 5f 49 66 5a 65 72 6f 2c 20 72 65 67 4c 69 6d  P_IfZero, regLim
fe50: 69 74 2c 20 61 64 64 72 42 72 65 61 6b 2c 20 2d  it, addrBreak, -
fe60: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
fe70: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
fe80: 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f   addrCont);..  /
fe90: 2a 20 45 78 65 63 75 74 65 20 74 68 65 20 72 65  * Execute the re
fea0: 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
feb0: 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67 6c 65  aking the single
fec0: 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e 74 20   row in Current 
fed0: 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  as.  ** the valu
fee0: 65 20 66 6f 72 20 74 68 65 20 72 65 63 75 72 73  e for the recurs
fef0: 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65  ive-table. Store
ff00: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
ff10: 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a  the Queue..  */.
ff20: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
ff30: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
ff40: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
ff50: 74 51 75 65 75 65 29 3b 0a 20 20 61 73 73 65 72  tQueue);.  asser
ff60: 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
ff70: 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  );.  p->pPrior =
ff80: 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b   pSetup;..  /* K
ff90: 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68 65 20  eep running the 
ffa0: 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65 20 51  loop until the Q
ffb0: 75 65 75 65 20 69 73 20 65 6d 70 74 79 20 2a 2f  ueue is empty */
ffc0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ffd0: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
ffe0: 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20   0, addrTop);.  
fff0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
10000 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
10010 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72  reak);..end_of_r
10020 65 63 75 72 73 69 76 65 5f 71 75 65 72 79 3a 0a  ecursive_query:.
10030 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
10040 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70  pOrderBy;.  p->p
10050 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
10060 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
10070 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e  Offset;.  return
10080 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46  ;.}.#endif../* F
10090 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
100a0 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
100b0 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
100c0 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
100d0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
100e0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
100f0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10110 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
10120 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
10130 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
10140 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
10150 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
10160 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
10170 2f 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53  /.);...#ifndef S
10180 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
10190 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a  UND_SELECT./*.**
101a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
101b0 20 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65   called to proce
101c0 73 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75  ss a compound qu
101d0 65 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a  ery form from.**
101e0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70   two or more sep
101f0 61 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73  arate queries us
10200 69 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e  ing UNION, UNION
10210 20 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72   ALL, EXCEPT, or
10220 0a 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a  .** INTERSECT.**
10230 0a 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74  .** "p" points t
10240 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
10250 20 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72   of the two quer
10260 69 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20  ies.  the query 
10270 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69  on the.** left i
10280 73 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68  s p->pPrior.  Th
10290 65 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75  e left query cou
102a0 6c 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d  ld also be a com
102b0 70 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69  pound query.** i
102c0 6e 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69  n which case thi
102d0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62  s routine will b
102e0 65 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69  e called recursi
102f0 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  vely. .**.** The
10300 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
10310 74 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20  total query are 
10320 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
10330 74 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e  to a destination
10340 0a 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73  .** of type eDes
10350 74 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72  t with parameter
10360 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78   iParm..**.** Ex
10370 61 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64  ample 1:  Consid
10380 65 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63  er a three-way c
10390 6f 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74  ompound SQL stat
103a0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
103b0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74   SELECT a FROM t
103c0 31 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62  1 UNION SELECT b
103d0 20 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53   FROM t2 UNION S
103e0 45 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a  ELECT c FROM t3.
103f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65  **.** This state
10400 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75  ment is parsed u
10410 70 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  p as follows:.**
10420 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63  .**     SELECT c
10430 20 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20   FROM t3.**     
10440 20 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d   |.**      `----
10450 2d 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f  ->  SELECT b FRO
10460 4d 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20  M t2.**         
10470 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
10480 20 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d             `----
10490 2d 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52  -->  SELECT a FR
104a0 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20  OM t1.**.** The 
104b0 61 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69  arrows in the di
104c0 61 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72  agram above repr
104d0 65 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74  esent the Select
104e0 2e 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e  .pPrior pointer.
104f0 0a 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72  .** So if this r
10500 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
10510 20 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f   with p equal to
10520 20 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74   the t3 query, t
10530 68 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69  hen.** pPrior wi
10540 6c 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65  ll be the t2 que
10550 72 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20  ry.  p->op will 
10560 62 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74  be TK_UNION in t
10570 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
10580 4e 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61  Notice that beca
10590 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53  use of the way S
105a0 51 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d  QLite parses com
105b0 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74  pound SELECTs, t
105c0 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
105d0 20 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20   selects always 
105e0 67 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20  group from left 
105f0 74 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61  to right..*/.sta
10600 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
10610 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
10620 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10630 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10640 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
10650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10660 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
10670 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
10680 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
10690 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
106a0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
106b0 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
106c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
106d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
106e0 20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72   Success code fr
106f0 6f 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  om a subroutine 
10700 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
10710 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
10720 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
10730 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
10740 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
10750 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
10760 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
10770 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
10780 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
10790 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  st;      /* Alte
107a0 72 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73  rnative data des
107b0 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65  tination */.  Se
107c0 6c 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20  lect *pDelete = 
107d0 30 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20  0;  /* Chain of 
107e0 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74  simple selects t
107f0 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71  o delete */.  sq
10800 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
10810 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
10820 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69  connection */.#i
10830 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10840 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
10850 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
10860 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
10870 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
10880 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
10890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
108a0 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
108b0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
108c0 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
108d0 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  e there is no OR
108e0 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20  DER BY or LIMIT 
108f0 63 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20  clause on prior 
10900 53 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20  SELECTs.  Only. 
10910 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69   ** the last (ri
10920 67 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54  ght-most) SELECT
10930 20 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d   in the series m
10940 61 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  ay have an ORDER
10950 20 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20   BY or LIMIT..  
10960 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26  */.  assert( p &
10970 26 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20  & p->pPrior );  
10980 2f 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74  /* Calling funct
10990 69 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74  ion guarantees t
109a0 68 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73  his much */.  as
109b0 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
109c0 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
109d0 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  e)==0 || p->op==
109e0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d  TK_ALL || p->op=
109f0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64  =TK_UNION );.  d
10a00 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
10a10 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50    pPrior = p->pP
10a20 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20  rior;.  assert( 
10a30 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f  pPrior->pRightmo
10a40 73 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20  st!=pPrior );.  
10a50 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
10a60 70 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70  pRightmost==p->p
10a70 52 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64  Rightmost );.  d
10a80 65 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20  est = *pDest;.  
10a90 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  if( pPrior->pOrd
10aa0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
10ab0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10ac0 73 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61  se,"ORDER BY cla
10ad0 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20  use should come 
10ae0 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66  after %s not bef
10af0 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65  ore",.      sele
10b00 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
10b10 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
10b20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
10b30 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69  ect_end;.  }.  i
10b40 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69  f( pPrior->pLimi
10b50 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
10b60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
10b70 22 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68  "LIMIT clause sh
10b80 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
10b90 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
10ba0 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
10bb0 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
10bc0 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
10bd0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
10be0 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71  d;.  }..  v = sq
10bf0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
10c00 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
10c10 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20  v!=0 );  /* The 
10c20 56 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65  VDBE already cre
10c30 61 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  ated by calling 
10c40 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  function */..  /
10c50 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73  * Create the des
10c60 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61  tination tempora
10c70 72 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65  ry table if nece
10c80 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28  ssary.  */.  if(
10c90 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54   dest.eDest==SRT
10ca0 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
10cb0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
10cc0 73 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  st );.    sqlite
10cd0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10ce0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
10cf0 20 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70   dest.iSDParm, p
10d00 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
10d10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
10d20 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
10d30 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
10d40 20 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20     dest.eDest = 
10d50 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a  SRT_Table;.  }..
10d60 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61    /* Make sure a
10d70 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68  ll SELECTs in th
10d80 65 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65  e statement have
10d90 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
10da0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a   of elements.  *
10db0 2a 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c  * in their resul
10dc0 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61  t sets..  */.  a
10dd0 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
10de0 20 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69   && pPrior->pELi
10df0 73 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  st );.  if( p->p
10e00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50  EList->nExpr!=pP
10e10 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  rior->pEList->nE
10e20 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  xpr ){.    if( p
10e30 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
10e40 56 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20  Values ){.      
10e50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10e60 70 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c  pParse, "all VAL
10e70 55 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68  UES must have th
10e80 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
10e90 20 74 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65   terms");.    }e
10ea0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
10eb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10ec0 65 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74  e, "SELECTs to t
10ed0 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
10ee0 74 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20  t of %s".       
10ef0 20 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74   " do not have t
10f00 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
10f10 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
10f20 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
10f30 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20  p->op));.    }. 
10f40 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
10f50 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
10f60 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  _end;.  }..#ifnd
10f70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
10f80 54 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  TE.  if( p->selF
10f90 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
10fa0 69 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72  ive ){.    gener
10fb0 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65  ateWithRecursive
10fc0 51 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c  Query(pParse, p,
10fd0 20 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65   &dest);.  }else
10fe0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f  .#endif..  /* Co
10ff0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74  mpound SELECTs t
11000 68 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45  hat have an ORDE
11010 52 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20  R BY clause are 
11020 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
11030 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ly..  */.  if( p
11040 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
11050 20 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65    return multiSe
11060 6c 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72  lectOrderBy(pPar
11070 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
11080 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e   }else..  /* Gen
11090 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
110a0 68 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68  he left and righ
110b0 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
110c0 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74  nts..  */.  swit
110d0 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
110e0 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a   case TK_ALL: {.
110f0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
11100 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c   0;.      int nL
11110 69 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65  imit;.      asse
11120 72 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69  rt( !pPrior->pLi
11130 6d 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72  mit );.      pPr
11140 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d  ior->iLimit = p-
11150 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >iLimit;.      p
11160 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d  Prior->iOffset =
11170 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20   p->iOffset;.   
11180 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69     pPrior->pLimi
11190 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
111a0 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66       pPrior->pOf
111b0 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
111c0 74 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  t;.      explain
111d0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
111e0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
111f0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
11200 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
11210 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
11220 72 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  r, &dest);.     
11230 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
11240 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
11250 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
11260 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
11270 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
11280 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
11290 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
112a0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
112b0 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d  t = pPrior->iLim
112c0 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66  it;.      p->iOf
112d0 66 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  fset = pPrior->i
112e0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
112f0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ( p->iLimit ){. 
11300 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
11310 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
11320 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
11330 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20  >iLimit);.      
11340 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
11350 2c 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66  , "Jump ahead if
11360 20 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29   LIMIT reached")
11370 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11380 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
11390 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
113a0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
113b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
113c0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
113d0 65 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, p, &dest);.  
113e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
113f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
11400 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
11410 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
11420 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
11430 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  or;.      p->nSe
11440 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f  lectRow += pPrio
11450 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
11460 20 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d       if( pPrior-
11470 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26  >pLimit.       &
11480 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  & sqlite3ExprIsI
11490 6e 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70  nteger(pPrior->p
114a0 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a  Limit, &nLimit).
114b0 20 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74         && nLimit
114c0 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  >0 && p->nSelect
114d0 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69  Row > (u64)nLimi
114e0 74 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  t .      ){.    
114f0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
11500 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20  w = nLimit;.    
11510 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64    }.      if( ad
11520 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  dr ){.        sq
11530 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11540 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  e(v, addr);.    
11550 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
11560 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
11570 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63  TK_EXCEPT:.    c
11580 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a  ase TK_UNION: {.
11590 20 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54        int unionT
115a0 61 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ab;    /* Cursor
115b0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74   number of the t
115c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68  emporary table h
115d0 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f  olding result */
115e0 0a 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30  .      u8 op = 0
115f0 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  ;       /* One o
11600 66 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61  f the SRT_ opera
11610 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74  tions to apply t
11620 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20  o self */.      
11630 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20  int priorOp;    
11640 20 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65   /* The SRT_ ope
11650 72 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20  ration to apply 
11660 74 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73  to prior selects
11670 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a   */.      Expr *
11680 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74  pLimit, *pOffset
11690 3b 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65  ; /* Saved value
116a0 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61  s of p->nLimit a
116b0 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f  nd p->nOffset */
116c0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
116d0 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
116e0 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20  t uniondest;..  
116f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
11700 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29  >op==TK_EXCEPT )
11710 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11720 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
11730 4e 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72  N );.      prior
11740 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a  Op = SRT_Union;.
11750 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
11760 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26  Dest==priorOp &&
11770 20 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d   ALWAYS(!p->pLim
11780 69 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74  it &&!p->pOffset
11790 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
117a0 57 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74  We can reuse a t
117b0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67  emporary table g
117c0 65 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45  enerated by a SE
117d0 4c 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20  LECT to our.    
117e0 20 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20      ** right..  
117f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11800 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67   assert( p->pRig
11810 68 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a  htmost!=p );  /*
11820 20 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   Can only happen
11830 20 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c   for leftward el
11840 65 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20  ements.         
11850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11860 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
11870 66 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72  f a 3-way or mor
11880 65 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  e compound */.  
11890 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
118a0 3e 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20  >pLimit==0 );   
118b0 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65     /* Not allowe
118c0 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c  d on leftward el
118d0 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  ements */.      
118e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66    assert( p->pOf
118f0 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f  fset==0 );     /
11900 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
11910 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
11920 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e  ts */.        un
11930 69 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53  ionTab = dest.iS
11940 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c  DParm;.      }el
11950 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  se{.        /* W
11960 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  e will need to c
11970 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65  reate our own te
11980 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f  mporary table to
11990 20 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20   hold the.      
119a0 20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74    ** intermediat
119b0 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20  e results..     
119c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e     */.        un
119d0 69 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d  ionTab = pParse-
119e0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  >nTab++;.       
119f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64   assert( p->pOrd
11a00 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
11a10 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
11a20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11a30 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
11a40 20 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20   unionTab, 0);. 
11a50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11a60 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
11a70 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20  ] == -1 );.     
11a80 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
11a90 68 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20  hm[0] = addr;.  
11aa0 20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d        p->pRightm
11ab0 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ost->selFlags |=
11ac0 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
11ad0 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  l;.        asser
11ae0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
11af0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
11b00 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
11b10 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
11b20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a  our left.      *
11b30 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
11b40 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42  !pPrior->pOrderB
11b50 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  y );.      sqlit
11b60 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
11b70 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69  (&uniondest, pri
11b80 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b  orOp, unionTab);
11b90 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
11ba0 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
11bb0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
11bc0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
11bd0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
11be0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
11bf0 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20   &uniondest);.  
11c00 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
11c10 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
11c20 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
11c30 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
11c40 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ode the current 
11c50 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
11c60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11c70 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  if( p->op==TK_EX
11c80 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  CEPT ){.        
11c90 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b  op = SRT_Except;
11ca0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
11cc0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
11cd0 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52  .        op = SR
11ce0 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d  T_Union;.      }
11cf0 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
11d00 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d   = 0;.      pLim
11d10 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a  it = p->pLimit;.
11d20 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
11d30 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73  = 0;.      pOffs
11d40 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b  et = p->pOffset;
11d50 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  .      p->pOffse
11d60 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69  t = 0;.      uni
11d70 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f  ondest.eDest = o
11d80 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  p;.      explain
11d90 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
11da0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
11db0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
11dc0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
11dd0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75  ct(pParse, p, &u
11de0 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
11df0 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
11e00 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
11e10 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74    /* Query flatt
11e20 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33  ening in sqlite3
11e30 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72  Select() might r
11e40 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42  efill p->pOrderB
11e50 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73  y..      ** Be s
11e60 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d  ure to delete p-
11e70 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65  >pOrderBy, there
11e80 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61  fore, to avoid a
11e90 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f   memory leak. */
11ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
11eb0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
11ec0 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
11ed0 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
11ee0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
11ef0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
11f00 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  or;.      p->pOr
11f10 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
11f20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55   if( p->op==TK_U
11f30 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63  NION ) p->nSelec
11f40 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
11f50 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
11f60 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
11f70 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
11f80 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
11f90 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
11fa0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
11fb0 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20   pOffset;.      
11fc0 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->iLimit = 0;. 
11fd0 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20       p->iOffset 
11fe0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  = 0;..      /* C
11ff0 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20  onvert the data 
12000 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  in the temporary
12010 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74   table into what
12020 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20  ever form.      
12030 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65  ** it is that we
12040 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e   currently need.
12050 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12060 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62  assert( unionTab
12070 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c  ==dest.iSDParm |
12080 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  | dest.eDest!=pr
12090 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69  iorOp );.      i
120a0 66 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70  f( dest.eDest!=p
120b0 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20  riorOp ){.      
120c0 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
120d0 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
120e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
120f0 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
12100 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
12110 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
12120 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74            Select
12130 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
12140 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
12150 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
12160 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
12170 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
12180 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
12190 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
121a0 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
121b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
121c0 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71       iBreak = sq
121d0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
121e0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69  el(v);.        i
121f0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
12200 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12210 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c          computeL
12220 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
12230 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
12240 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12250 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12260 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54  P_Rewind, unionT
12270 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  ab, iBreak);.   
12280 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71       iStart = sq
12290 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
122a0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
122b0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
122c0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
122d0 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  EList, unionTab,
122e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
122f0 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26           0, 0, &
12300 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72  dest, iCont, iBr
12310 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
12320 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
12330 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b  Label(v, iCont);
12340 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12350 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12360 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c  _Next, unionTab,
12370 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
12380 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
12390 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
123a0 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  eak);.        sq
123b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
123c0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69  v, OP_Close, uni
123d0 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
123e0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
123f0 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
12400 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70  t: assert( p->op
12410 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29  ==TK_INTERSECT )
12420 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61  ; {.      int ta
12430 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20  b1, tab2;.      
12440 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  int iCont, iBrea
12450 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20  k, iStart;.     
12460 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a   Expr *pLimit, *
12470 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69  pOffset;.      i
12480 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
12490 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73  electDest inters
124a0 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69  ectdest;.      i
124b0 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a  nt r1;..      /*
124c0 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69   INTERSECT is di
124d0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65  fferent from the
124e0 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74   others since it
124f0 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
12500 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79  ** two temporary
12510 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20   tables.  Hence 
12520 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63  it has its own c
12530 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20  ase.  Begin.    
12540 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69    ** by allocati
12550 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65  ng the tables we
12560 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20   will need..    
12570 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20    */.      tab1 
12580 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
12590 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70  ;.      tab2 = p
125a0 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
125b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
125c0 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a  pOrderBy==0 );..
125d0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
125e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
125f0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12600 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  al, tab1, 0);.  
12610 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
12620 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
12630 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
12640 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
12650 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
12660 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65  ->pRightmost->se
12670 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
12680 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
12690 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
126a0 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
126b0 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
126c0 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
126d0 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
126e0 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
126f0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
12700 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
12710 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
12720 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
12730 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
12740 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
12750 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
12760 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
12770 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
12780 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
12790 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
127a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
127b0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
127c0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
127d0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
127e0 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
127f0 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
12800 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12810 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
12820 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
12830 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12840 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
12850 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
12860 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
12870 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
12880 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
12890 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
128a0 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
128b0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
128c0 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
128d0 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
128e0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
128f0 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
12900 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
12910 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
12920 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
12930 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
12940 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b2;.      explai
12950 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
12960 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
12970 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
12980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
12990 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
129a0 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
129b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
129c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
129d0 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
129e0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
129f0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
12a00 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
12a10 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
12a20 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
12a30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
12a40 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
12a50 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
12a60 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
12a70 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
12a80 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
12a90 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
12aa0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
12ab0 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  set;..      /* G
12ac0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12ad0 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
12ae0 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
12af0 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
12b00 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
12b10 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
12b20 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
12b30 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
12b40 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
12b50 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
12b60 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
12b70 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
12b80 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
12b90 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
12ba0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
12bb0 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
12bc0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
12bd0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
12be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12bf0 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
12c00 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
12c10 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
12c20 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
12c30 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
12c40 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
12c50 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
12c60 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
12c70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12c80 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
12c90 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
12ca0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
12cb0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
12cc0 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  );.      iStart 
12cd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
12ce0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  Op2(v, OP_RowKey
12cf0 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
12d00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12d10 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
12d20 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
12d30 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ont, r1, 0);.   
12d40 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
12d50 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
12d60 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65   r1);.      sele
12d70 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
12d80 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
12d90 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20  , tab1,.        
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
12db0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
12dc0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
12dd0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
12de0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
12df0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
12e00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12e10 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
12e20 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
12e30 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
12e40 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
12e50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
12e60 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
12e70 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
12e80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12e90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
12ea0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
12eb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12ec0 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
12ed0 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
12ee0 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
12ef0 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
12f00 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
12f10 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
12f20 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
12f30 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
12f40 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
12f50 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
12f60 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
12f70 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
12f80 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
12f90 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
12fa0 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
12fb0 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
12fc0 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
12fd0 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
12fe0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
12ff0 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
13000 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
13010 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
13020 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
13030 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
13040 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
13050 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
13060 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
13070 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13080 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
13090 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
130a0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
130b0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
130c0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
130d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
130e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130f0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
13100 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
13110 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
13120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
13130 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
13140 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
13150 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
13160 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
13170 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
13180 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
13190 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
131a0 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
131b0 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
131c0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
131d0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
131e0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
131f0 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13210 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13220 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
13230 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
13240 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
13250 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e  most==p );.    n
13260 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
13270 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
13280 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
13290 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
132a0 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
132b0 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
132c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
132d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
132e0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
132f0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
13300 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
13310 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
13320 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
13330 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
13340 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
13350 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
13360 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
13370 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
13380 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
13390 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
133a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
133b0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
133c0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
133d0 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
133e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
133f0 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
13400 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
13410 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13420 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
13430 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
13440 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
13450 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
13460 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
13470 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
13480 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
13490 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
134a0 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
134b0 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
134c0 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
134d0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
134e0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
134f0 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
13500 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13510 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
13520 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
13530 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
13540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13550 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
13560 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
13570 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
13580 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
13590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135a0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
135b0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
135c0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
135d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
135e0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
135f0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
13600 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
13610 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
13620 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
13630 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
13640 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
13650 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
13660 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
13670 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
13680 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
13690 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
136a0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
136b0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
136c0 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
136d0 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
136e0 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
136f0 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
13700 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
13710 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
13720 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
13730 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
13740 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
13750 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
13760 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
13770 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
13780 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
13790 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
137a0 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
137b0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
137c0 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
137d0 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
137e0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
137f0 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
13800 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
13810 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
13820 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
13830 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
13840 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
13850 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
13860 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
13870 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
13880 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
13890 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
138a0 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
138b0 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
138c0 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
138d0 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
138e0 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
138f0 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
13900 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
13910 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
13920 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
13930 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
13940 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
13950 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
13960 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
13970 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
13980 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
13990 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
139a0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
139b0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
139c0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
139d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
139e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
139f0 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
13a00 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
13a10 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
13a20 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
13a30 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
13a40 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
13a50 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
13a60 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
13a70 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
13a80 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
13a90 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
13aa0 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
13ab0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
13ac0 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
13ad0 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
13ae0 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
13af0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
13b00 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
13b10 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
13b20 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
13b30 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
13b40 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
13b50 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
13b60 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
13b70 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
13b80 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
13b90 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
13ba0 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
13bb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
13bc0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
13bd0 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
13be0 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
13bf0 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
13c00 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
13c10 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
13c20 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
13c30 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
13c40 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
13c50 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
13c60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
13c70 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
13c80 50 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20  Prev);.    j2 = 
13c90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13ca0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
13cb0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
13cc0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
13cd0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
13d00 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
13d10 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
13d20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
13d30 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
13d40 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74  ump, j2+2, iCont
13d50 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20  inue, j2+2);.   
13d60 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
13d70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
13d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13d90 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
13da0 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
13db0 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
13dc0 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
13dd0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13de0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
13df0 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
13e00 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
13e10 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
13e20 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
13e30 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
13e40 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
13e50 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
13e60 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
13e70 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
13e80 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
13e90 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63  tinue);..  switc
13ea0 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
13eb0 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
13ec0 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
13ed0 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
13ee0 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
13ef0 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
13f00 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
13f10 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
13f20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
13f30 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
13f40 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  se);.      int r
13f50 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
13f60 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
13f70 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
13f80 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
13f90 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
13fa0 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
13fb0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
13fc0 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
13fd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
13fe0 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
13ff0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
14000 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
14010 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14020 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
14030 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
14040 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
14050 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14060 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
14070 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
14080 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
14090 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
140a0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
140b0 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
140c0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
140d0 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
140e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
140f0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
14100 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
14110 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
14120 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14130 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
14140 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
14150 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
14160 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
14170 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
14180 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
14190 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
141a0 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
141b0 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
141c0 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
141d0 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
141e0 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
141f0 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
14200 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
14210 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
14220 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14230 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a  In->nSdst==1 );.
14240 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
14250 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20  Sdst = .        
14260 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
14270 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
14280 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
14290 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
142a0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
142b0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
142c0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
142d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
142e0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
142f0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72  pIn->iSdst, 1, r
14300 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
14310 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  st,1);.      sql
14320 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
14330 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
14340 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
14350 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
14360 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
14370 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
14380 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29  st->iSDParm, r1)
14390 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
143a0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
143b0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
143c0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
143d0 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f  if 0  /* Never o
143e0 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45  ccurs on an ORDE
143f0 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20  R BY query */.  
14400 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
14410 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
14420 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
14430 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
14440 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
14450 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
14460 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
14470 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14480 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65  _Integer, 1, pDe
14490 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
144a0 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
144b0 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
144c0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
144d0 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
144e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
144f0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
14500 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
14510 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
14520 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
14530 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
14540 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
14550 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
14560 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
14570 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
14580 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
14590 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
145a0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
145b0 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
145c0 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
145d0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
145e0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
145f0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
14600 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
14610 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
14620 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
14630 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
14640 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
14650 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
14660 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
14670 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
14680 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
14690 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
146a0 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
146b0 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
146c0 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
146d0 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
146e0 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
146f0 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
14700 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
14710 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
14720 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
14730 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
14740 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
14750 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
14760 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
14770 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
14780 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
14790 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
147a0 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
147b0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
147c0 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
147d0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
147e0 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44  pDest->iSdst, pD
147f0 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  est->nSdst);.   
14800 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14810 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
14820 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
14830 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14840 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
14850 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f   none of the abo
14860 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
14870 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ult destination 
14880 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53  must be.    ** S
14890 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73  RT_Output.  This
148a0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
148b0 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  r called with an
148c0 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  y other.    ** d
148d0 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
148e0 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68   than the ones h
148f0 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20  andled above or 
14900 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20  SRT_Output..    
14910 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52  **.    ** For SR
14920 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74  T_Output, result
14930 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
14940 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
14950 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a  gisters.  .    *
14960 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65  * Then the OP_Re
14970 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
14980 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
14990 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
149a0 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  o.    ** return 
149b0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
149c0 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
149d0 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
149e0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73      assert( pDes
149f0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
14a00 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71  tput );.      sq
14a10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14a20 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
14a30 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
14a40 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
14a50 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14a60 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
14a70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
14a80 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
14a90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14aa0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
14ab0 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
14ac0 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
14ad0 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
14ae0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14af0 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
14b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14b10 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
14b20 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
14b30 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   -1);.  }..  /* 
14b40 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62  Generate the sub
14b50 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20  routine return. 
14b60 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
14b70 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
14b80 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
14b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
14ba0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
14bb0 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65  egReturn);..  re
14bc0 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
14bd0 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20  .** Alternative 
14be0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
14bf0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66  code generator f
14c00 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68  or cases when th
14c10 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44  ere.** is an ORD
14c20 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  ER BY clause..**
14c30 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20  .** We assume a 
14c40 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c  query of the fol
14c50 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
14c60 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41  **      <selectA
14c70 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c  >  <operator>  <
14c80 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20  selectB>  ORDER 
14c90 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e  BY <orderbylist>
14ca0 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  .**.** <operator
14cb0 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f  > is one of UNIO
14cc0 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58  N ALL, UNION, EX
14cd0 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
14ce0 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a  CT.  The idea.**
14cf0 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68   is to code both
14d00 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c   <selectA> and <
14d10 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68  selectB> with th
14d20 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14d30 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69  e as.** co-routi
14d40 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74  nes.  Then run t
14d50 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69  he co-routines i
14d60 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d  n parallel and m
14d70 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73  erge the results
14d80 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  .** into the out
14d90 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  put.  In additio
14da0 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72  n to the two cor
14db0 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20  outines (called 
14dc0 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73  selectA and.** s
14dd0 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72  electB) there ar
14de0 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a  e 7 subroutines:
14df0 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  .**.**    outA: 
14e00 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
14e10 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
14e20 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  A coroutine into
14e30 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
14e40 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
14e50 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
14e60 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  ..**.**    outB:
14e70 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
14e80 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
14e90 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tB coroutine int
14ea0 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
14ec0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
14ed0 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61  y.  (Only genera
14ee0 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e  ted for UNION an
14ef0 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
14f00 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43   UNION ALL.  EXC
14f10 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45  EPT and INSERTSE
14f20 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20  CT never output 
14f30 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20  a row that.**   
14f40 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72            appear
14f50 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a  s only in B.).**
14f60 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20  .**    AltB:    
14f70 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
14f80 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
14f90 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
14fa0 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A<B..**.**   
14fb0 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64   AeqB:    Called
14fc0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
14fd0 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
14fe0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d  routines and A==
14ff0 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42  B..**.**    AgtB
15000 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
15010 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
15020 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
15030 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a  nes and A>B..**.
15040 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43  **    EofA:    C
15050 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
15060 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
15070 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a  m selectA..**.**
15080 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c      EofB:    Cal
15090 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
150a0 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
150b0 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54  selectB..**.** T
150c0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
150d0 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20  n of the latter 
150e0 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73  five subroutines
150f0 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68   depend on which
15100 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20   .** <operator> 
15110 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a  is used:.**.**.*
15120 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
15130 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20  ION ALL         
15140 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20  UNION           
15150 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20   EXCEPT         
15160 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20   INTERSECT.**   
15170 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
15180 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
15190 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
151a0 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
151b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
151c0 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AltB:   outA, ne
151d0 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
151e0 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
151f0 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
15200 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71  extA.**.**   Aeq
15210 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
15220 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
15230 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41             nextA
15240 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e           outA, n
15250 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74  extA.**.**   Agt
15260 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  B:   outB, nextB
15270 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
15280 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42  B          nextB
15290 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
152a0 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20  B.**.**   EofA: 
152b0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
152c0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
152d0 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20          halt    
152e0 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
152f0 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75  .**   EofB:   ou
15300 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
15310 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
15320 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
15330 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
15340 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71  In the AltB, Aeq
15350 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72  B, and AgtB subr
15360 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20  outines, an EOF 
15370 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on A following n
15380 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61  extA.** causes a
15390 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
153a0 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20   to EofA and an 
153b0 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69  EOF on B followi
153c0 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a  ng nextB causes.
153d0 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  ** an immediate 
153e0 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57  jump to EofB.  W
153f0 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45  ithin EofA and E
15400 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20  ofB, and EOF on 
15410 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c  entry or.** foll
15420 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73  owing nextX caus
15430 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  es a jump to the
15440 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65   end of the sele
15450 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ct processing..*
15460 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72  *.** Duplicate r
15470 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e  emoval in the UN
15480 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
15490 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73   INTERSECT cases
154a0 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77   is handled.** w
154b0 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ithin the output
154c0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
154d0 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74  e regPrev regist
154e0 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65  er set holds the
154f0 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f   previously.** o
15500 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20  utput value.  A 
15510 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
15520 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  de against this 
15530 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75  value and the ou
15540 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70  tput.** is skipp
15550 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72  ed if the next r
15560 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20  esults would be 
15570 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
15580 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20  previous..**.** 
15590 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
155a0 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d  on plan is to im
155b0 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20  plement the two 
155c0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73  coroutines and s
155d0 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69  even.** subrouti
155e0 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20  nes first, then 
155f0 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  put the control 
15600 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74  logic at the bot
15610 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  tom.  Like this:
15620 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
15630 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20  goto Init.**    
15640 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coA: coroutine 
15650 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28  for left query (
15660 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63  A).**     coB: c
15670 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
15680 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20  ht query (B).** 
15690 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20     outA: output 
156a0 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20  one row of A.** 
156b0 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20     outB: output 
156c0 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e  one row of B (UN
156d0 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c  ION and UNION AL
156e0 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f  L only).**    Eo
156f0 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f  fA: ....**    Eo
15700 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c  fB: ....**    Al
15710 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65  tB: ....**    Ae
15720 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67  qB: ....**    Ag
15730 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e  tB: ....**    In
15740 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  it: initialize c
15750 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65  oroutine registe
15760 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  rs.**          y
15770 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20  ield coA.**     
15780 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67       if eof(A) g
15790 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20  oto EofA.**     
157a0 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a       yield coB.*
157b0 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
157c0 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a  f(B) goto EofB.*
157d0 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61  *    Cmpr: Compa
157e0 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20  re A, B.**      
157f0 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41      Jump AltB, A
15800 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20  eqB, AgtB.**    
15810 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   End: ....**.** 
15820 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65  We call AltB, Ae
15830 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20  qB, AgtB, EofA, 
15840 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75  and EofB "subrou
15850 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20  tines" but they 
15860 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61  are not.** actua
15870 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67  lly called using
15880 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20   Gosub and they 
15890 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20  do not Return.  
158a0 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f  EofA and EofB lo
158b0 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20  op.** until all 
158c0 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
158d0 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  d then jump to t
158e0 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20  he "end" labe.  
158f0 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61  AltB, AeqB,.** a
15900 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20  nd AgtB jump to 
15910 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20  either L2 or to 
15920 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45  one of EofA or E
15930 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ofB..*/.#ifndef 
15940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
15950 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74  OUND_SELECT.stat
15960 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
15970 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
15980 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15990 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
159a0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
159b0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
159c0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
159d0 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
159e0 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
159f0 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
15a00 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
15a10 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
15a20 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
15a30 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
15a40 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
15a50 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ters */.  Select
15a60 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
15a70 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
15a80 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
15a90 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
15aa0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
15ab0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
15ac0 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
15ad0 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
15ae0 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a  st destA;     /*
15af0 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
15b00 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a   coroutine A */.
15b10 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
15b20 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tB;     /* Desti
15b30 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
15b40 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20  tine B */.  int 
15b50 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20  regAddrA;       
15b60 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
15b70 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
15b80 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
15b90 20 20 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20    int regEofA;  
15ba0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
15bb0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e  to indicate when
15bc0 20 73 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d   select-A is com
15bd0 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72  plete */.  int r
15be0 65 67 41 64 64 72 42 3b 20 20 20 20 20 20 20 20  egAddrB;        
15bf0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
15c00 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
15c10 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  B coroutine */. 
15c20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20   int regEofB;   
15c30 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74         /* Flag t
15c40 6f 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20  o indicate when 
15c50 73 65 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70  select-B is comp
15c60 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  lete */.  int ad
15c70 64 72 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20  drSelectA;      
15c80 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
15c90 65 20 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75  e select-A corou
15ca0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
15cb0 64 72 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20  drSelectB;      
15cc0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
15cd0 65 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75  e select-B corou
15ce0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65  tine */.  int re
15cf0 67 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 20  gOutA;          
15d00 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
15d10 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70  ter for the outp
15d20 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-A subroutine 
15d30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42  */.  int regOutB
15d40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ;          /* Ad
15d50 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
15d60 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  or the output-B 
15d70 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
15d80 69 6e 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20  int addrOutA;   
15d90 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15da0 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41   of the output-A
15db0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
15dc0 20 69 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20   int addrOutB = 
15dd0 30 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  0;     /* Addres
15de0 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d  s of the output-
15df0 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
15e00 20 20 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20    int addrEofA; 
15e10 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
15e20 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
15e30 2d 41 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -A-exhausted sub
15e40 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
15e50 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
15e60 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
15e70 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
15e80 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
15e90 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
15ea0 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
15eb0 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
15ec0 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
15ed0 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
15ee0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
15ef0 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
15f00 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
15f10 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
15f20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
15f30 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
15f40 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
15f50 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
15f60 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
15f70 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
15f80 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
15f90 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
15fa0 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
15fb0 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
15fc0 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
15fd0 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
15fe0 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
15ff0 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
16000 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
16010 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
16020 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
16030 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
16040 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
16050 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
16060 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
16070 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
16080 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
16090 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
160a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
160b0 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
160c0 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
160d0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
160e0 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
160f0 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
16100 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
16110 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
16120 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
16130 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
16140 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
16150 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
16160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
16170 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
16180 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
16190 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
161a0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
161b0 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
161c0 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
161d0 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
161e0 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
161f0 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
16200 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
16210 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
16220 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
16230 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
16240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
16250 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
16260 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
16270 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
16280 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
16290 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
162a0 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
162b0 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
162c0 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
162d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
162e0 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
162f0 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
16300 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
16310 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
16320 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
16330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
16340 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
16350 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
16360 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
16370 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
16380 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
16390 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
163a0 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
163b0 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
163c0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
163d0 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
163e0 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
163f0 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
16400 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
16410 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
16420 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
16430 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
16440 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
16450 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
16460 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
16470 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
16480 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
16490 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
164a0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
164b0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
164c0 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
164d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
164e0 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
164f0 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
16500 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
16510 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
16520 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
16530 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
16540 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
16550 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
16560 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
16570 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
16580 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
16590 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
165a0 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
165b0 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
165c0 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
165d0 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
165e0 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
165f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
16600 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
16610 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
16620 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
16630 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
16640 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
16650 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
16660 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
16670 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
16680 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
16690 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
166a0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
166b0 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
166c0 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
166d0 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
166e0 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
166f0 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
16700 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
16710 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16720 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
16730 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
16740 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
16750 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
16760 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
16770 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
16780 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
16790 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
167a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
167b0 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
167c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
167d0 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
167e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
167f0 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
16800 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
16810 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
16820 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
16830 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
16840 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
16850 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
16860 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
16870 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
16880 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
16890 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e  a[nOrderBy++].u.
168a0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
168b0 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
168c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
168d0 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
168e0 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
168f0 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
16900 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
16910 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
16920 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
16930 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
16940 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
16950 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
16960 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
16970 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
16980 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
16990 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
169a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
169b0 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
169c0 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
169d0 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
169e0 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
169f0 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
16a00 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
16a10 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
16a20 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
16a30 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
16a40 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
16a50 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65  izeof(int)*nOrde
16a60 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
16a70 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
16a80 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
16a90 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
16aa0 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
16ab0 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
16ac0 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
16ad0 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
16ae0 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
16af0 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20  derByCol>0.     
16b00 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 75       && pItem->u
16b10 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d  .x.iOrderByCol<=
16b20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
16b30 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75   );.      aPermu
16b40 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75  te[i] = pItem->u
16b50 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d  .x.iOrderByCol -
16b60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b   1;.    }.    pK
16b70 65 79 4d 65 72 67 65 20 3d 20 73 71 6c 69 74 65  eyMerge = sqlite
16b80 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
16b90 2c 20 6e 4f 72 64 65 72 42 79 2c 20 31 29 3b 0a  , nOrderBy, 1);.
16ba0 20 20 20 20 69 66 28 20 70 4b 65 79 4d 65 72 67      if( pKeyMerg
16bb0 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  e ){.      for(i
16bc0 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
16bd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  i++){.        Co
16be0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
16bf0 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
16c00 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
16c10 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
16c20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
16c30 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
16c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
16c50 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
16c60 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
16c70 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  pTerm);.        
16c80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16c90 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
16ca0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
16cb0 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b  se, p, aPermute[
16cc0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  i]);.          i
16cd0 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
16ce0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
16cf0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70  oll;.          p
16d00 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
16d10 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
16d20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
16d30 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70  dCollateString(p
16d40 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43  Parse, pTerm, pC
16d50 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
16d60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
16d70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
16d80 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
16d90 28 70 4b 65 79 4d 65 72 67 65 29 20 29 3b 0a 20  (pKeyMerge) );. 
16da0 20 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65         pKeyMerge
16db0 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
16dc0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  ll;.        pKey
16dd0 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f 72 64 65  Merge->aSortOrde
16de0 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79 2d  r[i] = pOrderBy-
16df0 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
16e00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65 79   }else{.    pKey
16e20 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Merge = 0;.  }..
16e30 20 20 2f 2a 20 52 65 61 74 74 61 63 68 20 74 68    /* Reattach th
16e40 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
16e50 65 20 74 6f 20 74 68 65 20 71 75 65 72 79 2e 0a  e to the query..
16e60 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72    */.  p->pOrder
16e70 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20  By = pOrderBy;. 
16e80 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
16e90 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
16ea0 69 73 74 44 75 70 28 70 50 61 72 73 65 2d 3e 64  istDup(pParse->d
16eb0 62 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29 3b  b, pOrderBy, 0);
16ec0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
16ed0 61 20 72 61 6e 67 65 20 6f 66 20 74 65 6d 70 6f  a range of tempo
16ee0 72 61 72 79 20 72 65 67 69 73 74 65 72 73 20 61  rary registers a
16ef0 6e 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6e  nd the KeyInfo n
16f00 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f 72 20 74  eeded.  ** for t
16f10 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 72 65  he logic that re
16f20 6d 6f 76 65 73 20 64 75 70 6c 69 63 61 74 65 20  moves duplicate 
16f30 72 65 73 75 6c 74 20 72 6f 77 73 20 77 68 65 6e  result rows when
16f40 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
16f50 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20 45 58 43  or is UNION, EXC
16f60 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
16f70 54 20 28 62 75 74 20 6e 6f 74 20 55 4e 49 4f 4e  T (but not UNION
16f80 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66   ALL)..  */.  if
16f90 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op==TK_ALL ){.
16fa0 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 30 3b      regPrev = 0;
16fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
16fc0 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c  t nExpr = p->pEL
16fd0 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
16fe0 61 73 73 65 72 74 28 20 6e 4f 72 64 65 72 42 79  assert( nOrderBy
16ff0 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d  >=nExpr || db->m
17000 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
17010 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
17020 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
17030 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
17040 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20 20 73 71   nExpr+1;.    sq
17050 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17060 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
17070 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20  , regPrev);.    
17080 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74 65  pKeyDup = sqlite
17090 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
170a0 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 20  , nExpr, 1);.   
170b0 20 69 66 28 20 70 4b 65 79 44 75 70 20 29 7b 0a   if( pKeyDup ){.
170c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
170d0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
170e0 69 74 65 61 62 6c 65 28 70 4b 65 79 44 75 70 29  iteable(pKeyDup)
170f0 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
17100 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
17110 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  {.        pKeyDu
17120 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  p->aColl[i] = mu
17130 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
17140 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
17150 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
17160 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
17170 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
17180 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70  }.  }. .  /* Sep
17190 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61  arate the left a
171a0 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65  nd the right que
171b0 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74  ry from one anot
171c0 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50  her.  */.  p->pP
171d0 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rior = 0;.  sqli
171e0 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
171f0 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
17200 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
17210 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
17220 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
17230 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
17240 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
17250 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
17260 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
17270 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
17280 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
17290 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
172a0 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
172b0 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
172c0 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
172d0 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
172e0 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
172f0 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
17300 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
17310 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
17320 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
17330 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
17340 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17350 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
17360 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
17370 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : p->iLimit,.
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173a0 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
173b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
173c0 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
173d0 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
173e0 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
173f0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
17400 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
17410 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
17420 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
17430 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
17440 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
17450 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
17460 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
17470 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
17480 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
17490 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
174a0 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73  egEofA = ++pPars
174b0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
174c0 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
174d0 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20  nMem;.  regEofB 
174e0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
174f0 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
17500 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
17510 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
17520 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
17530 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
17540 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
17550 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
17560 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
17570 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
17580 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
17590 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
175a0 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68   /* Jump past th
175b0 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75  e various subrou
175c0 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74  tines and corout
175d0 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e  ines to the main
175e0 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70  .  ** merge loop
175f0 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c  .  */.  j1 = sql
17600 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
17610 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64  , OP_Goto);.  ad
17620 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
17630 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
17640 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65  dr(v);...  /* Ge
17650 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
17660 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
17670 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
17680 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
17690 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
176a0 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
176b0 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
176c0 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
176d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
176e0 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
176f0 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
17700 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
17710 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
17720 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
17730 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
17740 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
17750 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
17760 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
17770 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
17780 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17790 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
177a0 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  regEofA);.  sqli
177b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
177c0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
177d0 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drA);.  VdbeNoop
177e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
177f0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
17800 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a  eft SELECT"));..
17810 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
17820 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
17830 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
17840 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
17850 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
17860 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
17870 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
17880 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
17890 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
178a0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
178b0 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f  ((v, "Begin coro
178c0 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
178d0 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
178e0 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
178f0 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
17900 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
17910 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
17920 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
17930 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
17940 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
17950 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
17960 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
17970 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
17980 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
17990 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
179a0 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
179b0 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
179c0 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
179d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
179e0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
179f0 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c   regEofB);.  sql
17a00 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
17a10 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
17a20 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrB);.  VdbeNoo
17a30 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
17a40 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
17a50 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
17a60 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17a70 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
17a80 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
17a90 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
17aa0 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
17ab0 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
17ac0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
17ad0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
17ae0 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
17af0 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
17b00 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
17b10 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
17b20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
17b30 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
17b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17b50 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
17b60 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
17b80 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
17b90 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20  labelEnd);.  .  
17ba0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
17bb0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
17bc0 74 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e  tputs the curren
17bd0 74 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20  t row of the B. 
17be0 20 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68   ** select as th
17bf0 65 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f  e next output ro
17c00 77 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  w of the compoun
17c10 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  d select..  */. 
17c20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
17c30 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
17c40 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  ){.    VdbeNoopC
17c50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70  omment((v, "Outp
17c60 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42  ut routine for B
17c70 22 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74  "));.    addrOut
17c80 42 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70  B = generateOutp
17c90 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61  utSubroutine(pPa
17ca0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
17cb0 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c        p, &destB,
17cc0 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c   pDest, regOutB,
17cd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17ce0 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44    regPrev, pKeyD
17cf0 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  up, labelEnd);. 
17d00 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49   }.  sqlite3KeyI
17d10 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70  nfoUnref(pKeyDup
17d20 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
17d30 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
17d40 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72  o run when the r
17d50 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65  esults from sele
17d60 63 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78  ct A.  ** are ex
17d70 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79  hausted and only
17d80 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20   data in select 
17d90 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a  B remains..  */.
17da0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
17db0 74 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62  t((v, "eof-A sub
17dc0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 69 66  routine"));.  if
17dd0 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  ( op==TK_EXCEPT 
17de0 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
17df0 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
17e00 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
17e10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
17e20 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45 6e 64 29  to, 0, labelEnd)
17e30 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
17e40 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
17e50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17e60 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
17e70 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20   labelEnd);.    
17e80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17e90 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
17ea0 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
17eb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
17ec0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
17ed0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b  ield, regAddrB);
17ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
17ef0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
17f00 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b  o, 0, addrEofA);
17f10 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52  .    p->nSelectR
17f20 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53  ow += pPrior->nS
17f30 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20  electRow;.  }.. 
17f40 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
17f50 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e  ubroutine to run
17f60 20 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   when the result
17f70 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a  s from select B.
17f80 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74    ** are exhaust
17f90 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61  ed and only data
17fa0 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d   in select A rem
17fb0 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ains..  */.  if(
17fc0 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
17fd0 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
17fe0 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20  B = addrEofA;.  
17ff0 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
18000 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53  Row > pPrior->nS
18010 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53  electRow ) p->nS
18020 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f  electRow = pPrio
18030 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  r->nSelectRow;. 
18040 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64   }else{  .    Vd
18050 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
18060 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74  , "eof-B subrout
18070 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72  ine"));.    addr
18080 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64  EofB = sqlite3Vd
18090 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
180a0 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c 61 62 65  f, regEofA, labe
180b0 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  lEnd);.    sqlit
180c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
180d0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
180e0 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20  A, addrOutA);.  
180f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18100 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
18110 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20   regAddrA);.    
18120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18130 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
18140 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a   addrEofB);.  }.
18150 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
18160 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
18170 65 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20  e case of A<B.  
18180 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
18190 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42  ment((v, "A-lt-B
181a0 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
181b0 20 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c    addrAltB = sql
181c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
181d0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
181e0 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a  utA, addrOutA);.
181f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18200 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
18210 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71   regAddrA);.  sq
18220 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18230 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
18240 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
18250 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18260 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
18270 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20   labelCmpr);..  
18280 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
18290 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63   to handle the c
182a0 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f  ase of A==B.  */
182b0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c  .  if( op==TK_AL
182c0 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  L ){.    addrAeq
182d0 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
182e0 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
182f0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
18300 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64 64    addrAeqB = add
18310 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72 41  rAltB;.    addrA
18320 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ltB++;.  }else{.
18330 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
18340 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42 20  ent((v, "A-eq-B 
18350 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
18360 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20 20     addrAeqB =.  
18370 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18380 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
18390 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 20 20   regAddrA);.    
183a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
183b0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
183c0 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a  ofA, addrEofA);.
183d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
183e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
183f0 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b  , 0, labelCmpr);
18400 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
18410 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64  ate code to hand
18420 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41  le the case of A
18430 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  >B.  */.  VdbeNo
18440 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
18450 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -gt-B subroutine
18460 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74 42 20  "));.  addrAgtB 
18470 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
18480 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
18490 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  f( op==TK_ALL ||
184a0 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b   op==TK_UNION ){
184b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
184c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
184d0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
184e0 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71  rOutB);.  }.  sq
184f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
18500 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
18510 41 64 64 72 42 29 3b 0a 20 20 73 71 6c 69 74 65  AddrB);.  sqlite
18520 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18530 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61  P_If, regEofB, a
18540 64 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  ddrEofB);.  sqli
18550 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18560 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
18570 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54  elCmpr);..  /* T
18580 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e  his code runs on
18590 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
185a0 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a   everything..  *
185b0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a  /.  sqlite3VdbeJ
185c0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
185d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
185e0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
185f0 72 2c 20 30 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 0, regEofA);.
18600 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18610 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
18620 72 2c 20 30 2c 20 72 65 67 45 6f 66 42 29 3b 0a  r, 0, regEofB);.
18630 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18640 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
18650 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 53   regAddrA, addrS
18660 65 6c 65 63 74 41 29 3b 0a 20 20 73 71 6c 69 74  electA);.  sqlit
18670 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18680 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64  OP_Gosub, regAdd
18690 72 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29  rB, addrSelectB)
186a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
186b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
186c0 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
186d0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
186e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
186f0 2c 20 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45  , regEofB, addrE
18700 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c  ofB);..  /* Impl
18710 65 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d  ement the main m
18720 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20  erge loop.  */. 
18730 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18740 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65  lveLabel(v, labe
18750 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  lCmpr);.  sqlite
18760 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
18770 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30  P_Permutation, 0
18780 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61  , 0, 0, (char*)a
18790 50 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41  Permute, P4_INTA
187a0 52 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33  RRAY);.  sqlite3
187b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
187c0 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e  _Compare, destA.
187d0 69 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64  iSdst, destB.iSd
187e0 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20  st, nOrderBy,.  
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18800 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
18810 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49  eyMerge, P4_KEYI
18820 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
18830 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
18840 50 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a  PFLAG_PERMUTE);.
18850 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18860 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
18870 61 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65  addrAltB, addrAe
18880 71 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a  qB, addrAgtB);..
18890 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
188a0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f   this point in o
188b0 72 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74  rder to terminat
188c0 65 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a  e the query..  *
188d0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
188e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
188f0 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  abelEnd);..  /* 
18900 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Set the number o
18910 66 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73  f output columns
18920 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
18930 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
18940 74 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65  tput ){.    Sele
18950 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72  ct *pFirst = pPr
18960 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ior;.    while( 
18970 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
18980 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
18990 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65  ->pPrior;.    ge
189a0 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
189b0 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
189c0 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
189d0 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62  }..  /* Reassemb
189e0 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ly the compound 
189f0 71 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74  query so that it
18a00 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63   will be freed c
18a10 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79  orrectly.  ** by
18a20 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   the calling fun
18a30 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
18a40 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
18a50 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
18a60 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f  ete(db, p->pPrio
18a70 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72  r);.  }.  p->pPr
18a80 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 0a 20  ior = pPrior;.. 
18a90 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49 6e 73 65   /*** TBD:  Inse
18aa0 72 74 20 73 75 62 72 6f 75 74 69 6e 65 20 63 61  rt subroutine ca
18ab0 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20 63 75 72  lls to close cur
18ac0 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d 70 6c 65  sors on incomple
18ad0 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62 71 75 65  te.  **** subque
18ae0 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20 65 78 70  ries ****/.  exp
18af0 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50  lainComposite(pP
18b00 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75  arse, p->op, iSu
18b10 62 31 2c 20 69 53 75 62 32 2c 20 30 29 3b 0a 20  b1, iSub2, 0);. 
18b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18b30 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
18b40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
18b50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
18b60 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
18b70 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a  TE_OMIT_VIEW)./*
18b80 20 46 6f 72 77 61 72 64 20 44 65 63 6c 61 72 61   Forward Declara
18b90 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20  tions */.static 
18ba0 76 6f 69 64 20 73 75 62 73 74 45 78 70 72 4c 69  void substExprLi
18bb0 73 74 28 73 71 6c 69 74 65 33 2a 2c 20 45 78 70  st(sqlite3*, Exp
18bc0 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20 45 78 70  rList*, int, Exp
18bd0 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74 69 63 20  rList*);.static 
18be0 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74  void substSelect
18bf0 28 73 71 6c 69 74 65 33 2a 2c 20 53 65 6c 65 63  (sqlite3*, Selec
18c00 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69  t *, int, ExprLi
18c10 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63  st *);../*.** Sc
18c20 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 65  an through the e
18c30 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
18c40 20 20 52 65 70 6c 61 63 65 20 65 76 65 72 79 20    Replace every 
18c50 72 65 66 65 72 65 6e 63 65 20 74 6f 0a 2a 2a 20  reference to.** 
18c60 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
18c70 65 20 6e 75 6d 62 65 72 20 69 54 61 62 6c 65 20  e number iTable 
18c80 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
18c90 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a  he iColumn-th.**
18ca0 20 65 6e 74 72 79 20 69 6e 20 70 45 4c 69 73 74   entry in pEList
18cb0 2e 20 20 28 42 75 74 20 6c 65 61 76 65 20 72 65  .  (But leave re
18cc0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
18cd0 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  ROWID column .**
18ce0 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a 2a 2a 0a   unchanged.).**.
18cf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18d00 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  is part of the f
18d10 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f 63 65 64  lattening proced
18d20 75 72 65 2e 20 20 41 20 73 75 62 71 75 65 72 79  ure.  A subquery
18d30 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73 75 6c 74  .** whose result
18d40 20 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20   set is defined 
18d50 62 79 20 70 45 4c 69 73 74 20 61 70 70 65 61 72  by pEList appear
18d60 73 20 61 73 20 65 6e 74 72 79 20 69 6e 20 74 68  s as entry in th
18d70 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65  e.** FROM clause
18d80 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 75 63   of a SELECT suc
18d90 68 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20  h that the VDBE 
18da0 63 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20  cursor assigned 
18db0 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f 52 4d 20  to that.** FORM 
18dc0 63 6c 61 75 73 65 20 65 6e 74 72 79 20 69 73 20  clause entry is 
18dd0 69 54 61 62 6c 65 2e 20 20 54 68 69 73 20 72 6f  iTable.  This ro
18de0 75 74 69 6e 65 20 6d 61 6b 65 20 74 68 65 20 6e  utine make the n
18df0 65 63 65 73 73 61 72 79 20 0a 2a 2a 20 63 68 61  ecessary .** cha
18e00 6e 67 65 73 20 74 6f 20 70 45 78 70 72 20 73 6f  nges to pExpr so
18e10 20 74 68 61 74 20 69 74 20 72 65 66 65 72 73 20   that it refers 
18e20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
18e30 73 6f 75 72 63 65 20 74 61 62 6c 65 0a 2a 2a 20  source table.** 
18e40 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
18e50 72 61 74 68 65 72 20 74 68 65 20 72 65 73 75 6c  rather the resul
18e60 74 20 73 65 74 20 6f 66 20 74 68 65 20 73 75 62  t set of the sub
18e70 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  query..*/.static
18e80 20 45 78 70 72 20 2a 73 75 62 73 74 45 78 70 72   Expr *substExpr
18e90 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
18ea0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
18eb0 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
18ec0 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  to this connecti
18ed0 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  on */.  Expr *pE
18ee0 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45  xpr,        /* E
18ef0 78 70 72 20 69 6e 20 77 68 69 63 68 20 73 75 62  xpr in which sub
18f00 73 74 69 74 75 74 69 6f 6e 20 6f 63 63 75 72 73  stitution occurs
18f10 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
18f20 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ,         /* Tab
18f30 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
18f40 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
18f50 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
18f60 20 53 75 62 73 74 69 74 75 74 65 20 65 78 70 72   Substitute expr
18f70 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  essions */.){.  
18f80 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
18f90 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
18fa0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
18fb0 55 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54  UMN && pExpr->iT
18fc0 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 29 7b 0a  able==iTable ){.
18fd0 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
18fe0 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
18ff0 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
19000 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _NULL;.    }else
19010 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e  {.      Expr *pN
19020 65 77 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ew;.      assert
19030 28 20 70 45 4c 69 73 74 21 3d 30 20 26 26 20 70  ( pEList!=0 && p
19040 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70 45  Expr->iColumn<pE
19050 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
19060 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
19070 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
19080 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
19090 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   );.      pNew =
190a0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
190b0 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 70 45  db, pEList->a[pE
190c0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 70 45  xpr->iColumn].pE
190d0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  xpr, 0);.      s
190e0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
190f0 28 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  (db, pExpr);.   
19100 20 20 20 70 45 78 70 72 20 3d 20 70 4e 65 77 3b     pExpr = pNew;
19110 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
19120 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
19130 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
19140 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 69   pExpr->pLeft, i
19150 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
19160 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
19170 74 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  t = substExpr(db
19180 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
19190 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
191a0 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
191b0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
191c0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
191d0 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65 6c  {.      substSel
191e0 65 63 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ect(db, pExpr->x
191f0 2e 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65  .pSelect, iTable
19200 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d  , pEList);.    }
19210 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 75 62 73  else{.      subs
19220 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 45  tExprList(db, pE
19230 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 54  xpr->x.pList, iT
19240 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
19250 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19260 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74 61 74 69  n pExpr;.}.stati
19270 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70 72  c void substExpr
19280 4c 69 73 74 28 0a 20 20 73 71 6c 69 74 65 33 20  List(.  sqlite3 
19290 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
192a0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
192b0 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 45  rors here */.  E
192c0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
192d0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 6f 20 73      /* List to s
192e0 63 61 6e 20 61 6e 64 20 69 6e 20 77 68 69 63 68  can and in which
192f0 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
19300 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  utes */.  int iT
19310 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
19320 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
19330 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
19340 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
19350 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
19360 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  e values */.){. 
19370 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
19380 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
19390 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
193a0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
193b0 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 69  {.    pList->a[i
193c0 5d 2e 70 45 78 70 72 20 3d 20 73 75 62 73 74 45  ].pExpr = substE
193d0 78 70 72 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  xpr(db, pList->a
193e0 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54 61 62 6c  [i].pExpr, iTabl
193f0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a  e, pEList);.  }.
19400 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  }.static void su
19410 62 73 74 53 65 6c 65 63 74 28 0a 20 20 73 71 6c  bstSelect(.  sql
19420 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
19430 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
19440 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
19450 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
19460 20 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45           /* SELE
19470 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  CT statement in 
19480 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
19490 62 73 74 69 74 75 74 69 6f 6e 73 20 2a 2f 0a 20  bstitutions */. 
194a0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
194b0 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
194c0 6f 20 62 65 20 72 65 70 6c 61 63 65 64 20 2a 2f  o be replaced */
194d0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
194e0 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
194f0 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
19500 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  ){.  SrcList *pS
19510 72 63 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  rc;.  struct Src
19520 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19530 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
19540 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !p ) return;.  
19550 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
19560 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 54 61  , p->pEList, iTa
19570 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
19580 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
19590 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  , p->pGroupBy, i
195a0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
195b0 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
195c0 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c  db, p->pOrderBy,
195d0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
195e0 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e 67 20 3d  ;.  p->pHaving =
195f0 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
19600 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54 61 62 6c  ->pHaving, iTabl
19610 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
19620 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74 45  >pWhere = substE
19630 78 70 72 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  xpr(db, p->pWher
19640 65 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  e, iTable, pELis
19650 74 29 3b 0a 20 20 73 75 62 73 74 53 65 6c 65 63  t);.  substSelec
19660 74 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  t(db, p->pPrior,
19670 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
19680 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53  ;.  pSrc = p->pS
19690 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
196a0 72 63 20 29 3b 20 20 2f 2a 20 45 76 65 6e 20 66  rc );  /* Even f
196b0 6f 72 20 28 53 45 4c 45 43 54 20 31 29 20 77 65  or (SELECT 1) we
196c0 20 68 61 76 65 3a 20 70 53 72 63 21 3d 30 20 62   have: pSrc!=0 b
196d0 75 74 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 30  ut pSrc->nSrc==0
196e0 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
196f0 28 70 53 72 63 29 20 29 7b 0a 20 20 20 20 66 6f  (pSrc) ){.    fo
19700 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2c 20  r(i=pSrc->nSrc, 
19710 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61 3b 20 69  pItem=pSrc->a; i
19720 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
19730 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 53 65  ){.      substSe
19740 6c 65 63 74 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lect(db, pItem->
19750 70 53 65 6c 65 63 74 2c 20 69 54 61 62 6c 65 2c  pSelect, iTable,
19760 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
19770 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
19780 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
19790 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
197a0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
197b0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a  E_OMIT_VIEW) */.
197c0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
197d0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
197e0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
197f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
19800 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
19810 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f  tine attempts to
19820 20 66 6c 61 74 74 65 6e 20 73 75 62 71 75 65 72   flatten subquer
19830 69 65 73 20 61 73 20 61 20 70 65 72 66 6f 72 6d  ies as a perform
19840 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
19850 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
19860 6e 65 20 72 65 74 75 72 6e 73 20 31 20 69 66 20  ne returns 1 if 
19870 69 74 20 6d 61 6b 65 73 20 63 68 61 6e 67 65 73  it makes changes
19880 20 61 6e 64 20 30 20 69 66 20 6e 6f 20 66 6c 61   and 0 if no fla
19890 74 74 65 6e 69 6e 67 20 6f 63 63 75 72 73 2e 0a  ttening occurs..
198a0 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65 72 73 74  **.** To underst
198b0 61 6e 64 20 74 68 65 20 63 6f 6e 63 65 70 74 20  and the concept 
198c0 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 2c 20 63  of flattening, c
198d0 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c 6c  onsider the foll
198e0 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72 79 3a 0a  owing.** query:.
198f0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
19900 20 61 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20   a FROM (SELECT 
19910 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31  x+y AS a FROM t1
19920 20 57 48 45 52 45 20 7a 3c 31 30 30 29 20 57 48   WHERE z<100) WH
19930 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  ERE a>5.**.** Th
19940 65 20 64 65 66 61 75 6c 74 20 77 61 79 20 6f 66  e default way of
19950 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
19960 69 73 20 71 75 65 72 79 20 69 73 20 74 6f 20 65  is query is to e
19970 78 65 63 75 74 65 20 74 68 65 0a 2a 2a 20 73 75  xecute the.** su
19980 62 71 75 65 72 79 20 66 69 72 73 74 20 61 6e 64  bquery first and
19990 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
199a0 74 73 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ts in a temporar
199b0 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 0a 2a 2a  y table, then.**
199c0 20 72 75 6e 20 74 68 65 20 6f 75 74 65 72 20 71   run the outer q
199d0 75 65 72 79 20 6f 6e 20 74 68 61 74 20 74 65 6d  uery on that tem
199e0 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 20 54  porary table.  T
199f0 68 69 73 20 72 65 71 75 69 72 65 73 20 74 77 6f  his requires two
19a00 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76 65 72 20  .** passes over 
19a10 74 68 65 20 64 61 74 61 2e 20 20 46 75 72 74 68  the data.  Furth
19a20 65 72 6d 6f 72 65 2c 20 62 65 63 61 75 73 65 20  ermore, because 
19a30 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
19a40 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f 20 69 6e  ble.** has no in
19a50 64 69 63 65 73 2c 20 74 68 65 20 57 48 45 52 45  dices, the WHERE
19a60 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20 6f   clause on the o
19a70 75 74 65 72 20 71 75 65 72 79 20 63 61 6e 6e 6f  uter query canno
19a80 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 65  t be.** optimize
19a90 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
19aa0 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73 20 74  utine attempts t
19ab0 6f 20 72 65 77 72 69 74 65 20 71 75 65 72 69 65  o rewrite querie
19ac0 73 20 73 75 63 68 20 61 73 20 74 68 65 20 61 62  s such as the ab
19ad0 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  ove into.** a si
19ae0 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c 65 63 74  ngle flat select
19af0 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  , like this:.**.
19b00 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b  **     SELECT x+
19b10 79 20 41 53 20 61 20 46 52 4f 4d 20 74 31 20 57  y AS a FROM t1 W
19b20 48 45 52 45 20 7a 3c 31 30 30 20 41 4e 44 20 61  HERE z<100 AND a
19b30 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  >5.**.** The cod
19b40 65 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20  e generated for 
19b50 74 68 69 73 20 73 69 6d 70 69 66 69 63 61 74 69  this simpificati
19b60 6f 6e 20 67 69 76 65 73 20 74 68 65 20 73 61 6d  on gives the sam
19b70 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62 75 74 20  e result.** but 
19b80 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73 63 61 6e  only has to scan
19b90 20 74 68 65 20 64 61 74 61 20 6f 6e 63 65 2e 20   the data once. 
19ba0 20 41 6e 64 20 62 65 63 61 75 73 65 20 69 6e 64   And because ind
19bb0 69 63 65 73 20 6d 69 67 68 74 20 0a 2a 2a 20 65  ices might .** e
19bc0 78 69 73 74 20 6f 6e 20 74 68 65 20 74 61 62 6c  xist on the tabl
19bd0 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c 65 74 65  e t1, a complete
19be0 20 73 63 61 6e 20 6f 66 20 74 68 65 20 64 61 74   scan of the dat
19bf0 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 76  a might be.** av
19c00 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61  oided..**.** Fla
19c10 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e 6c 79 20  ttening is only 
19c20 61 74 74 65 6d 70 74 65 64 20 69 66 20 61 6c 6c  attempted if all
19c30 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
19c40 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
19c50 2a 20 20 20 28 31 29 20 20 54 68 65 20 73 75 62  *   (1)  The sub
19c60 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
19c70 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
19c80 20 62 6f 74 68 20 75 73 65 20 61 67 67 72 65 67   both use aggreg
19c90 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 32  ates..**.**   (2
19ca0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
19cb0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
19cc0 61 74 65 20 6f 72 20 74 68 65 20 6f 75 74 65 72  ate or the outer
19cd0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
19ce0 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 33  join..**.**   (3
19cf0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
19d00 69 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  is not the right
19d10 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
19d20 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e 0a 2a 2a  ft outer join.**
19d30 20 20 20 20 20 20 20 20 28 4f 72 69 67 69 6e 61          (Origina
19d40 6c 6c 79 20 74 69 63 6b 65 74 20 23 33 30 36 2e  lly ticket #306.
19d50 20 20 53 74 72 65 6e 67 74 68 65 6e 65 64 20 62    Strengthened b
19d60 79 20 74 69 63 6b 65 74 20 23 33 33 30 30 29 0a  y ticket #3300).
19d70 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20 54 68 65  **.**   (4)  The
19d80 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
19d90 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a   DISTINCT..**.**
19da0 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e 65 20 70    (**)  At one p
19db0 6f 69 6e 74 20 72 65 73 74 72 69 63 74 69 6f 6e  oint restriction
19dc0 73 20 28 34 29 20 61 6e 64 20 28 35 29 20 64 65  s (4) and (5) de
19dd0 66 69 6e 65 64 20 61 20 73 75 62 73 65 74 20 6f  fined a subset o
19de0 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20 20 20  f DISTINCT.**   
19df0 20 20 20 20 20 73 75 62 2d 71 75 65 72 69 65 73       sub-queries
19e00 20 74 68 61 74 20 77 65 72 65 20 65 78 63 6c 75   that were exclu
19e10 64 65 64 20 66 72 6f 6d 20 74 68 69 73 20 6f 70  ded from this op
19e20 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52 65 73 74  timization. Rest
19e30 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  riction .**     
19e40 20 20 20 28 34 29 20 68 61 73 20 73 69 6e 63 65     (4) has since
19e50 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 74   been expanded t
19e60 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 44 49  o exclude all DI
19e70 53 54 49 4e 43 54 20 73 75 62 71 75 65 72 69 65  STINCT subquerie
19e80 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36 29 20 20  s..**.**   (6)  
19e90 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
19ea0 73 20 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67  s not use aggreg
19eb0 61 74 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65  ates or the oute
19ec0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
19ed0 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
19ee0 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37 29 20 20  T..**.**   (7)  
19ef0 54 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  The subquery has
19f00 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
19f10 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73 75 62 71   TODO:  For subq
19f20 75 65 72 69 65 73 20 77 69 74 68 6f 75 74 0a 2a  ueries without.*
19f30 2a 20 20 20 20 20 20 20 20 41 20 46 52 4f 4d 20  *        A FROM 
19f40 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69 64 65 72  clause, consider
19f50 20 61 64 64 69 6e 67 20 61 20 46 52 4f 4d 20 63   adding a FROM c
19f60 6c 6f 73 65 20 77 69 74 68 20 74 68 65 20 73 70  lose with the sp
19f70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ecial.**        
19f80 74 61 62 6c 65 20 73 71 6c 69 74 65 5f 6f 6e 63  table sqlite_onc
19f90 65 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  e that consists 
19fa0 6f 66 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  of a single row 
19fb0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a 20  containing a.** 
19fc0 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20 4e 55         single NU
19fd0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 38 29 20  LL..**.**   (8) 
19fe0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
19ff0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1a000 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1a010 65 72 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69  ery is not a joi
1a020 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39 29 20 20  n..**.**   (9)  
1a030 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
1a040 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
1a050 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
1a060 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a  ry does not use.
1a070 2a 2a 20 20 20 20 20 20 20 20 61 67 67 72 65 67  **        aggreg
1a080 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 30  ates..**.**  (10
1a090 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1a0a0 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
1a0b0 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
1a0c0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1a0d0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 75 73  not.**        us
1a0e0 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
1a0f0 28 31 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (11)  The subque
1a100 72 79 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72  ry and the outer
1a110 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1a120 74 68 20 68 61 76 65 20 4f 52 44 45 52 20 42 59  th have ORDER BY
1a130 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1a140 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d 70 6c 65   (**)  Not imple
1a150 6d 65 6e 74 65 64 2e 20 20 53 75 62 73 75 6d 65  mented.  Subsume
1a160 64 20 69 6e 74 6f 20 72 65 73 74 72 69 63 74 69  d into restricti
1a170 6f 6e 20 28 33 29 2e 20 20 57 61 73 20 70 72 65  on (3).  Was pre
1a180 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20 20 20 20  viously.**      
1a190 20 20 61 20 73 65 70 61 72 61 74 65 20 72 65 73    a separate res
1a1a0 74 72 69 63 74 69 6f 6e 20 64 65 72 69 76 69 6e  triction derivin
1a1b0 67 20 66 72 6f 6d 20 74 69 63 6b 65 74 20 23 33  g from ticket #3
1a1c0 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 33 29 20  50..**.**  (13) 
1a1d0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1a1e0 64 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  d outer query do
1a1f0 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 4c 49   not both use LI
1a200 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 34 29  MIT..**.**  (14)
1a210 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
1a220 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f 46 46 53  oes not use OFFS
1a230 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 35 29 20  ET..**.**  (15) 
1a240 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1a250 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
1a260 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
1a270 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20 20 20 20  t or the.**     
1a280 20 20 20 73 75 62 71 75 65 72 79 20 64 6f 65 73     subquery does
1a290 20 6e 6f 74 20 68 61 76 65 20 61 20 4c 49 4d 49   not have a LIMI
1a2a0 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 20 20 20  T clause..**    
1a2b0 20 20 20 20 28 53 65 65 20 74 69 63 6b 65 74 20      (See ticket 
1a2c0 23 32 33 33 39 20 61 6e 64 20 74 69 63 6b 65 74  #2339 and ticket
1a2d0 20 5b 30 32 61 38 65 38 31 64 34 34 5d 29 2e 0a   [02a8e81d44])..
1a2e0 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20 54 68 65  **.**  (16)  The
1a2f0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1a300 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
1a310 20 6f 72 20 74 68 65 20 73 75 62 71 75 65 72 79   or the subquery
1a320 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20 20 20 20   does.**        
1a330 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  not contain ORDE
1a340 52 20 42 59 2e 20 20 28 54 69 63 6b 65 74 20 23  R BY.  (Ticket #
1a350 32 39 34 32 29 20 20 54 68 69 73 20 75 73 65 64  2942)  This used
1a360 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65 72 0a 2a   to not matter.*
1a370 2a 20 20 20 20 20 20 20 20 75 6e 74 69 6c 20 77  *        until w
1a380 65 20 69 6e 74 72 6f 64 75 63 65 64 20 74 68 65  e introduced the
1a390 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 29 20   group_concat() 
1a3a0 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  function.  .**.*
1a3b0 2a 20 20 28 31 37 29 20 20 54 68 65 20 73 75 62  *  (17)  The sub
1a3c0 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20  -query is not a 
1a3d0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1a3e0 20 6f 72 20 69 74 20 69 73 20 61 20 55 4e 49 4f   or it is a UNIO
1a3f0 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20 20 20 20  N ALL .**       
1a400 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61 75 73 65   compound clause
1a410 20 6d 61 64 65 20 75 70 20 65 6e 74 69 72 65 6c   made up entirel
1a420 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72 65 67 61  y of non-aggrega
1a430 74 65 20 71 75 65 72 69 65 73 2c 20 61 6e 64 20  te queries, and 
1a440 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 70  .**        the p
1a450 61 72 65 6e 74 20 71 75 65 72 79 3a 0a 2a 2a 0a  arent query:.**.
1a460 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1a470 20 6e 6f 74 20 69 74 73 65 6c 66 20 70 61 72 74   not itself part
1a480 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1a490 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20 20 20 20  elect,.**       
1a4a0 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 6e 20 61     * is not an a
1a4b0 67 67 72 65 67 61 74 65 20 6f 72 20 44 49 53 54  ggregate or DIST
1a4c0 49 4e 43 54 20 71 75 65 72 79 2c 20 61 6e 64 0a  INCT query, and.
1a4d0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1a4e0 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a   not a join.**.*
1a4f0 2a 20 20 20 20 20 20 20 20 54 68 65 20 70 61 72  *        The par
1a500 65 6e 74 20 61 6e 64 20 73 75 62 2d 71 75 65 72  ent and sub-quer
1a510 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 57 48  y may contain WH
1a520 45 52 45 20 63 6c 61 75 73 65 73 2e 20 53 75 62  ERE clauses. Sub
1a530 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20 20 20 20  ject to.**      
1a540 20 20 72 75 6c 65 73 20 28 31 31 29 2c 20 28 31    rules (11), (1
1a550 33 29 20 61 6e 64 20 28 31 34 29 2c 20 74 68 65  3) and (14), the
1a560 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61  y may also conta
1a570 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a 2a 2a 20  in ORDER BY,.** 
1a580 20 20 20 20 20 20 20 4c 49 4d 49 54 20 61 6e 64         LIMIT and
1a590 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1a5a0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 63    The subquery c
1a5b0 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79 20 63 6f  annot use any co
1a5c0 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1a5d0 20 6f 70 65 72 61 74 6f 72 20 6f 74 68 65 72 20   operator other 
1a5e0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 62  than UNION ALL b
1a5f0 65 63 61 75 73 65 20 61 6c 6c 20 74 68 65 20 6f  ecause all the o
1a600 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a  ther compound.**
1a610 20 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72          operator
1a620 73 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 69 65  s have an implie
1a630 64 20 44 49 53 54 49 4e 43 54 20 77 68 69 63 68  d DISTINCT which
1a640 20 69 73 20 64 69 73 61 6c 6c 6f 77 65 64 20 62   is disallowed b
1a650 79 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 73 74  y.**        rest
1a660 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a 2a 2a 0a  riction (4)..**.
1a670 2a 2a 20 20 20 20 20 20 20 20 41 6c 73 6f 2c 20  **        Also, 
1a680 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f  each component o
1a690 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1a6a0 6d 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  must return the 
1a6b0 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20  same number.**  
1a6c0 20 20 20 20 20 20 6f 66 20 72 65 73 75 6c 74 20        of result 
1a6d0 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73 20 69 73  columns. This is
1a6e0 20 61 63 74 75 61 6c 6c 79 20 61 20 72 65 71 75   actually a requ
1a6f0 69 72 65 6d 65 6e 74 20 66 6f 72 20 61 6e 79 20  irement for any 
1a700 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1a710 20 20 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d     SELECT statem
1a720 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20 74 68 65  ent, but all the
1a730 20 63 6f 64 65 20 68 65 72 65 20 64 6f 65 73 20   code here does 
1a740 69 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  is make sure tha
1a750 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73  t no.**        s
1a760 75 63 68 20 28 69 6c 6c 65 67 61 6c 29 20 73 75  uch (illegal) su
1a770 62 2d 71 75 65 72 79 20 69 73 20 66 6c 61 74 74  b-query is flatt
1a780 65 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  ened. The caller
1a790 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68 65   will detect the
1a7a0 0a 2a 2a 20 20 20 20 20 20 20 20 73 79 6e 74 61  .**        synta
1a7b0 78 20 65 72 72 6f 72 20 61 6e 64 20 72 65 74 75  x error and retu
1a7c0 72 6e 20 61 20 64 65 74 61 69 6c 65 64 20 6d 65  rn a detailed me
1a7d0 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  ssage..**.**  (1
1a7e0 38 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  8)  If the sub-q
1a7f0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1a800 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1a810 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65  all terms of the
1a820 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52 44 45 52  .**        ORDER
1a830 20 62 79 20 63 6c 61 75 73 65 20 6f 66 20 74 68   by clause of th
1a840 65 20 70 61 72 65 6e 74 20 6d 75 73 74 20 62 65  e parent must be
1a850 20 73 69 6d 70 6c 65 20 72 65 66 65 72 65 6e 63   simple referenc
1a860 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 20  es to .**       
1a870 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
1a880 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a  sub-query..**.**
1a890 20 20 28 31 39 29 20 20 54 68 65 20 73 75 62 71    (19)  The subq
1a8a0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
1a8b0 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f  e LIMIT or the o
1a8c0 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73 20  uter query does 
1a8d0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 68 61  not.**        ha
1a8e0 76 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  ve a WHERE claus
1a8f0 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30 29 20 20  e..**.**  (20)  
1a900 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  If the sub-query
1a910 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
1a920 65 6c 65 63 74 2c 20 74 68 65 6e 20 69 74 20 6d  elect, then it m
1a930 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20  ust not use.**  
1a940 20 20 20 20 20 20 61 6e 20 4f 52 44 45 52 20 42        an ORDER B
1a950 59 20 63 6c 61 75 73 65 2e 20 20 54 69 63 6b 65  Y clause.  Ticke
1a960 74 20 23 33 37 37 33 2e 20 20 57 65 20 63 6f 75  t #3773.  We cou
1a970 6c 64 20 72 65 6c 61 78 20 74 68 69 73 20 63 6f  ld relax this co
1a980 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20 20 20 20  nstraint.**     
1a990 20 20 20 73 6f 6d 65 77 68 61 74 20 62 79 20 73     somewhat by s
1a9a0 61 79 69 6e 67 20 74 68 61 74 20 74 68 65 20 74  aying that the t
1a9b0 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
1a9c0 52 20 42 59 20 63 6c 61 75 73 65 20 6d 75 73 74  R BY clause must
1a9d0 0a 2a 2a 20 20 20 20 20 20 20 20 61 70 70 65 61  .**        appea
1a9e0 72 20 61 73 20 75 6e 6d 6f 64 69 66 69 65 64 20  r as unmodified 
1a9f0 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 69  result columns i
1aa00 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1aa10 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a 20 20 20  y.  But we.**   
1aa20 20 20 20 20 20 68 61 76 65 20 6f 74 68 65 72 20       have other 
1aa30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 69 6e  optimizations in
1aa40 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c 20 77 69   mind to deal wi
1aa50 74 68 20 74 68 61 74 20 63 61 73 65 2e 0a 2a 2a  th that case..**
1aa60 0a 2a 2a 20 20 28 32 31 29 20 20 54 68 65 20 73  .**  (21)  The s
1aa70 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1aa80 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1aa90 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
1aaa0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
1aab0 49 53 54 49 4e 43 54 2e 20 20 28 53 65 65 20 74  ISTINCT.  (See t
1aac0 69 63 6b 65 74 20 5b 37 35 32 65 31 36 34 36 66  icket [752e1646f
1aad0 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 32 29  c])..**.**  (22)
1aae0 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
1aaf0 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1ab00 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  e CTE..**.**  (2
1ab10 33 29 20 20 54 68 65 20 70 61 72 65 6e 74 20 69  3)  The parent i
1ab20 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
1ab30 65 20 43 54 45 2c 20 6f 72 20 74 68 65 20 73 75  e CTE, or the su
1ab40 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  b-query is not a
1ab50 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
1ab60 75 6e 64 20 71 75 65 72 79 2e 20 54 68 69 73 20  und query. This 
1ab70 72 65 73 74 72 69 63 74 69 6f 6e 20 69 73 20 62  restriction is b
1ab80 65 63 61 75 73 65 20 74 72 61 6e 73 66 6f 72 6d  ecause transform
1ab90 69 6e 67 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ing the.**      
1aba0 20 20 70 61 72 65 6e 74 20 74 6f 20 61 20 63 6f    parent to a co
1abb0 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 63 6f 6e  mpound query con
1abc0 66 75 73 65 73 20 74 68 65 20 63 6f 64 65 20 74  fuses the code t
1abd0 68 61 74 20 68 61 6e 64 6c 65 73 0a 2a 2a 20 20  hat handles.**  
1abe0 20 20 20 20 20 20 72 65 63 75 72 73 69 76 65 20        recursive 
1abf0 71 75 65 72 69 65 73 20 69 6e 20 6d 75 6c 74 69  queries in multi
1ac00 53 65 6c 65 63 74 28 29 2e 0a 2a 2a 0a 2a 2a 0a  Select()..**.**.
1ac10 2a 2a 20 49 6e 20 74 68 69 73 20 72 6f 75 74 69  ** In this routi
1ac20 6e 65 2c 20 74 68 65 20 22 70 22 20 70 61 72 61  ne, the "p" para
1ac30 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
1ac40 65 72 20 74 6f 20 74 68 65 20 6f 75 74 65 72 20  er to the outer 
1ac50 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75  query..** The su
1ac60 62 71 75 65 72 79 20 69 73 20 70 2d 3e 70 53 72  bquery is p->pSr
1ac70 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73  c->a[iFrom].  is
1ac80 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1ac90 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 0a 2a  he outer query.*
1aca0 2a 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  * uses aggregate
1acb0 73 20 61 6e 64 20 73 75 62 71 75 65 72 79 49 73  s and subqueryIs
1acc0 41 67 67 20 69 73 20 74 72 75 65 20 69 66 20 74  Agg is true if t
1acd0 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73  he subquery uses
1ace0 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a   aggregates..**.
1acf0 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1ad00 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
1ad10 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1ad20 69 73 20 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72  is a no-op and r
1ad30 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20  eturns 0..** If 
1ad40 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 61 74  flattening is at
1ad50 74 65 6d 70 74 65 64 20 74 68 69 73 20 72 6f 75  tempted this rou
1ad60 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 0a  tine returns 1..
1ad70 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65  **.** All of the
1ad80 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c   expression anal
1ad90 79 73 69 73 20 6d 75 73 74 20 6f 63 63 75 72 20  ysis must occur 
1ada0 6f 6e 20 62 6f 74 68 20 74 68 65 20 6f 75 74 65  on both the oute
1adb0 72 20 71 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74  r query and.** t
1adc0 68 65 20 73 75 62 71 75 65 72 79 20 62 65 66 6f  he subquery befo
1add0 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1ade0 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  runs..*/.static 
1adf0 69 6e 74 20 66 6c 61 74 74 65 6e 53 75 62 71 75  int flattenSubqu
1ae00 65 72 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ery(.  Parse *pP
1ae10 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
1ae20 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1ae30 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
1ae40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ae50 70 61 72 65 6e 74 20 6f 72 20 6f 75 74 65 72 20  parent or outer 
1ae60 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ae70 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c   */.  int iFrom,
1ae80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1ae90 64 65 78 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e  dex in p->pSrc->
1aea0 61 5b 5d 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  a[] of the inner
1aeb0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 69   subquery */.  i
1aec0 6e 74 20 69 73 41 67 67 2c 20 20 20 20 20 20 20  nt isAgg,       
1aed0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
1aee0 75 74 65 72 20 53 45 4c 45 43 54 20 75 73 65 73  uter SELECT uses
1aef0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1af00 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75  ions */.  int su
1af10 62 71 75 65 72 79 49 73 41 67 67 20 20 20 20 2f  bqueryIsAgg    /
1af20 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 73 75  * True if the su
1af30 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
1af40 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1af50 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1af60 61 72 20 2a 7a 53 61 76 65 64 41 75 74 68 43 6f  ar *zSavedAuthCo
1af70 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
1af80 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20  zAuthContext;.  
1af90 53 65 6c 65 63 74 20 2a 70 50 61 72 65 6e 74 3b  Select *pParent;
1afa0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 3b  .  Select *pSub;
1afb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1afc0 6e 65 72 20 71 75 65 72 79 20 6f 72 20 22 73 75  ner query or "su
1afd0 62 71 75 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c  bquery" */.  Sel
1afe0 65 63 74 20 2a 70 53 75 62 31 3b 20 20 20 20 20  ect *pSub1;     
1aff0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
1b000 68 65 20 72 69 67 68 74 6d 6f 73 74 20 73 65 6c  he rightmost sel
1b010 65 63 74 20 69 6e 20 73 75 62 2d 71 75 65 72 79  ect in sub-query
1b020 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1b030 53 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  Src;      /* The
1b040 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1b050 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1b060 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1b070 75 62 53 72 63 3b 20 20 20 2f 2a 20 54 68 65 20  ubSrc;   /* The 
1b080 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1b090 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20  he subquery */. 
1b0a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1b0b0 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  ;    /* The resu
1b0c0 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 6f 75  lt set of the ou
1b0d0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ter query */.  i
1b0e0 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  nt iParent;     
1b0f0 20 20 20 2f 2a 20 56 44 42 45 20 63 75 72 73 6f     /* VDBE curso
1b100 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
1b110 70 53 75 62 20 72 65 73 75 6c 74 20 73 65 74 20  pSub result set 
1b120 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
1b130 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1b140 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
1b150 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ter */.  Expr *p
1b160 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
1b170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b180 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
1b190 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1b1a0 74 5f 69 74 65 6d 20 2a 70 53 75 62 69 74 65 6d  t_item *pSubitem
1b1b0 3b 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75  ;   /* The subqu
1b1c0 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1b1d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1b1e0 62 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  b;..  /* Check t
1b1f0 6f 20 73 65 65 20 69 66 20 66 6c 61 74 74 65 6e  o see if flatten
1b200 69 6e 67 20 69 73 20 70 65 72 6d 69 74 74 65 64  ing is permitted
1b210 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
1b220 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ot..  */.  asser
1b230 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
1b240 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
1b250 30 20 29 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20  0 );  /* Unable 
1b260 74 6f 20 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f  to flatten compo
1b270 75 6e 64 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  und queries */. 
1b280 20 69 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f   if( Optimizatio
1b290 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
1b2a0 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
1b2b0 6e 65 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ner) ) return 0;
1b2c0 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  .  pSrc = p->pSr
1b2d0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  c;.  assert( pSr
1b2e0 63 20 26 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26  c && iFrom>=0 &&
1b2f0 20 69 46 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72   iFrom<pSrc->nSr
1b300 63 20 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 20  c );.  pSubitem 
1b310 3d 20 26 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  = &pSrc->a[iFrom
1b320 5d 3b 0a 20 20 69 50 61 72 65 6e 74 20 3d 20 70  ];.  iParent = p
1b330 53 75 62 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72  Subitem->iCursor
1b340 3b 0a 20 20 70 53 75 62 20 3d 20 70 53 75 62 69  ;.  pSub = pSubi
1b350 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
1b360 61 73 73 65 72 74 28 20 70 53 75 62 21 3d 30 20  assert( pSub!=0 
1b370 29 3b 0a 20 20 69 66 28 20 69 73 41 67 67 20 26  );.  if( isAgg &
1b380 26 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  & subqueryIsAgg 
1b390 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1b3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b3b0 65 73 74 72 69 63 74 69 6f 6e 20 28 31 29 20 20  estriction (1)  
1b3c0 2a 2f 0a 20 20 69 66 28 20 73 75 62 71 75 65 72  */.  if( subquer
1b3d0 79 49 73 41 67 67 20 26 26 20 70 53 72 63 2d 3e  yIsAgg && pSrc->
1b3e0 6e 53 72 63 3e 31 20 29 20 72 65 74 75 72 6e 20  nSrc>1 ) return 
1b3f0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  0;          /* R
1b400 65 73 74 72 69 63 74 69 6f 6e 20 28 32 29 20 20  estriction (2)  
1b410 2a 2f 0a 20 20 70 53 75 62 53 72 63 20 3d 20 70  */.  pSubSrc = p
1b420 53 75 62 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73  Sub->pSrc;.  ass
1b430 65 72 74 28 20 70 53 75 62 53 72 63 20 29 3b 0a  ert( pSubSrc );.
1b440 20 20 2f 2a 20 50 72 69 6f 72 20 74 6f 20 76 65    /* Prior to ve
1b450 72 73 69 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65  rsion 3.1.2, whe
1b460 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  n LIMIT and OFFS
1b470 45 54 20 68 61 64 20 74 6f 20 62 65 20 73 69 6d  ET had to be sim
1b480 70 6c 65 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20  ple constants,. 
1b490 20 2a 2a 20 6e 6f 74 20 61 72 62 69 74 72 61 72   ** not arbitrar
1b4a0 79 20 65 78 70 72 65 73 73 73 69 6f 6e 73 2c 20  y expresssions, 
1b4b0 77 65 20 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20  we allowed some 
1b4c0 63 6f 6d 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d  combining of LIM
1b4d0 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
1b4e0 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 79 20  ** because they 
1b4f0 63 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  could be compute
1b500 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1b510 65 2e 20 20 42 75 74 20 77 68 65 6e 20 4c 49 4d  e.  But when LIM
1b520 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 20 20  IT and OFFSET.  
1b530 2a 2a 20 62 65 63 61 6d 65 20 61 72 62 69 74 72  ** became arbitr
1b540 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ary expressions,
1b550 20 77 65 20 77 65 72 65 20 66 6f 72 63 65 64 20   we were forced 
1b560 74 6f 20 61 64 64 20 72 65 73 74 72 69 63 74 69  to add restricti
1b570 6f 6e 73 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e  ons (13).  ** an
1b580 64 20 28 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28  d (14). */.  if(
1b590 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1b5a0 20 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74   p->pLimit ) ret
1b5b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1b5c0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1b5d0 6f 6e 20 28 31 33 29 20 2a 2f 0a 20 20 69 66 28  on (13) */.  if(
1b5e0 20 70 53 75 62 2d 3e 70 4f 66 66 73 65 74 20 29   pSub->pOffset )
1b5f0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b610 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1b620 6f 6e 20 28 31 34 29 20 2a 2f 0a 20 20 69 66 28  on (14) */.  if(
1b630 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 26   p->pRightmost &
1b640 26 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29  & pSub->pLimit )
1b650 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  {.    return 0; 
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b690 73 74 72 69 63 74 69 6f 6e 20 28 31 35 29 20 2a  striction (15) *
1b6a0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1b6b0 53 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72  Src->nSrc==0 ) r
1b6c0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b6e0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 37  * Restriction (7
1b6f0 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1b700 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1b710 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75 72  Distinct ) retur
1b720 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  n 0;           /
1b730 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 35  * Restriction (5
1b740 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  )  */.  if( pSub
1b750 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 53 72  ->pLimit && (pSr
1b760 63 2d 3e 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41  c->nSrc>1 || isA
1b770 67 67 29 20 29 7b 0a 20 20 20 20 20 72 65 74 75  gg) ){.     retu
1b780 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
1b790 20 52 65 73 74 72 69 63 74 69 6f 6e 73 20 28 38   Restrictions (8
1b7a0 29 28 39 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  )(9) */.  }.  if
1b7b0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
1b7c0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1b7d0 20 26 26 20 73 75 62 71 75 65 72 79 49 73 41 67   && subqueryIsAg
1b7e0 67 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  g ){.     return
1b7f0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1b800 65 73 74 72 69 63 74 69 6f 6e 20 28 36 29 20 20  estriction (6)  
1b810 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  */.  }.  if( p->
1b820 70 4f 72 64 65 72 42 79 20 26 26 20 70 53 75 62  pOrderBy && pSub
1b830 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1b840 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1b880 63 74 69 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20  ction (11) */.  
1b890 7d 0a 20 20 69 66 28 20 69 73 41 67 67 20 26 26  }.  if( isAgg &&
1b8a0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1b8b0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1b8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b8d0 73 74 72 69 63 74 69 6f 6e 20 28 31 36 29 20 2a  striction (16) *
1b8e0 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1b8f0 69 6d 69 74 20 26 26 20 70 2d 3e 70 57 68 65 72  imit && p->pWher
1b900 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
1b910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b920 73 74 72 69 63 74 69 6f 6e 20 28 31 39 29 20 2a  striction (19) *
1b930 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c  /.  if( pSub->pL
1b940 69 6d 69 74 20 26 26 20 28 70 2d 3e 73 65 6c 46  imit && (p->selF
1b950 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1b960 63 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 72  ct)!=0 ){.     r
1b970 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1b980 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1b990 28 32 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (21) */.  }.  if
1b9a0 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1b9b0 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
1b9c0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1b9d0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1b9e0 69 6f 6e 20 28 32 32 29 20 20 2a 2f 0a 20 20 69  ion (22)  */.  i
1b9f0 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
1ba00 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 29 20  & SF_Recursive) 
1ba10 26 26 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  && pSub->pPrior 
1ba20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1ba30 20 20 2f 2a 20 28 32 33 29 20 20 2a 2f 0a 0a 20    /* (23)  */.. 
1ba40 20 2f 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   /* OBSOLETE COM
1ba50 4d 45 4e 54 20 31 3a 0a 20 20 2a 2a 20 52 65 73  MENT 1:.  ** Res
1ba60 74 72 69 63 74 69 6f 6e 20 33 3a 20 20 49 66 20  triction 3:  If 
1ba70 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
1ba80 61 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75 72  a join, make sur
1ba90 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  e the subquery i
1baa0 73 20 0a 20 20 2a 2a 20 6e 6f 74 20 75 73 65 64  s .  ** not used
1bab0 20 61 73 20 74 68 65 20 72 69 67 68 74 20 6f 70   as the right op
1bac0 65 72 61 6e 64 20 6f 66 20 61 6e 20 6f 75 74 65  erand of an oute
1bad0 72 20 6a 6f 69 6e 2e 20 20 45 78 61 6d 70 6c 65  r join.  Example
1bae0 73 20 6f 66 20 77 68 79 20 74 68 69 73 0a 20 20  s of why this.  
1baf0 2a 2a 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ** is not allowe
1bb00 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  d:.  **.  **    
1bb10 20 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54       t1 LEFT OUT
1bb20 45 52 20 4a 4f 49 4e 20 28 74 32 20 4a 4f 49 4e  ER JOIN (t2 JOIN
1bb30 20 74 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   t3).  **.  ** I
1bb40 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74 68 65  f we flatten the
1bb50 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64   above, we would
1bb60 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   get.  **.  **  
1bb70 20 20 20 20 20 20 20 28 74 31 20 4c 45 46 54 20         (t1 LEFT 
1bb80 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29 20 4a  OUTER JOIN t2) J
1bb90 4f 49 4e 20 74 33 0a 20 20 2a 2a 0a 20 20 2a 2a  OIN t3.  **.  **
1bba0 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 61 74   which is not at
1bbb0 20 61 6c 6c 20 74 68 65 20 73 61 6d 65 20 74 68   all the same th
1bbc0 69 6e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ing..  **.  ** O
1bbd0 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
1bbe0 32 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  2:.  ** Restrict
1bbf0 69 6f 6e 20 31 32 3a 20 20 49 66 20 74 68 65 20  ion 12:  If the 
1bc00 73 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20  subquery is the 
1bc10 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
1bc20 20 61 20 6c 65 66 74 20 6f 75 74 65 72 0a 20 20   a left outer.  
1bc30 2a 2a 20 6a 6f 69 6e 2c 20 6d 61 6b 65 20 73 75  ** join, make su
1bc40 72 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  re the subquery 
1bc50 68 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  has no WHERE cla
1bc60 75 73 65 2e 0a 20 20 2a 2a 20 41 6e 20 65 78 61  use..  ** An exa
1bc70 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68 69  mples of why thi
1bc80 73 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  s is not allowed
1bc90 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1bca0 20 20 20 20 74 31 20 4c 45 46 54 20 4f 55 54 45      t1 LEFT OUTE
1bcb0 52 20 4a 4f 49 4e 20 28 53 45 4c 45 43 54 20 2a  R JOIN (SELECT *
1bcc0 20 46 52 4f 4d 20 74 32 20 57 48 45 52 45 20 74   FROM t2 WHERE t
1bcd0 32 2e 78 3e 30 29 0a 20 20 2a 2a 0a 20 20 2a 2a  2.x>0).  **.  **
1bce0 20 49 66 20 77 65 20 66 6c 61 74 74 65 6e 20 74   If we flatten t
1bcf0 68 65 20 61 62 6f 76 65 2c 20 77 65 20 77 6f 75  he above, we wou
1bd00 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20 20 2a 2a  ld get.  **.  **
1bd10 20 20 20 20 20 20 20 20 20 28 74 31 20 4c 45 46           (t1 LEF
1bd20 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 74 32 29  T OUTER JOIN t2)
1bd30 20 57 48 45 52 45 20 74 32 2e 78 3e 30 0a 20 20   WHERE t2.x>0.  
1bd40 2a 2a 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  **.  ** But the 
1bd50 74 32 2e 78 3e 30 20 74 65 73 74 20 77 69 6c 6c  t2.x>0 test will
1bd60 20 61 6c 77 61 79 73 20 66 61 69 6c 20 6f 6e 20   always fail on 
1bd70 61 20 4e 55 4c 4c 20 72 6f 77 20 6f 66 20 74 32  a NULL row of t2
1bd80 2c 20 77 68 69 63 68 0a 20 20 2a 2a 20 65 66 66  , which.  ** eff
1bd90 65 63 74 69 76 65 6c 79 20 63 6f 6e 76 65 72 74  ectively convert
1bda0 73 20 74 68 65 20 4f 55 54 45 52 20 4a 4f 49 4e  s the OUTER JOIN
1bdb0 20 69 6e 74 6f 20 61 6e 20 49 4e 4e 45 52 20 4a   into an INNER J
1bdc0 4f 49 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  OIN..  **.  ** T
1bdd0 48 49 53 20 4f 56 45 52 52 49 44 45 53 20 4f 42  HIS OVERRIDES OB
1bde0 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 53 20  SOLETE COMMENTS 
1bdf0 31 20 41 4e 44 20 32 20 41 42 4f 56 45 3a 0a 20  1 AND 2 ABOVE:. 
1be00 20 2a 2a 20 54 69 63 6b 65 74 20 23 33 33 30 30   ** Ticket #3300
1be10 20 73 68 6f 77 73 20 74 68 61 74 20 66 6c 61 74   shows that flat
1be20 74 65 6e 69 6e 67 20 74 68 65 20 72 69 67 68 74  tening the right
1be30 20 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20   term of a LEFT 
1be40 4a 4f 49 4e 0a 20 20 2a 2a 20 69 73 20 66 72 61  JOIN.  ** is fra
1be50 75 67 68 74 20 77 69 74 68 20 64 61 6e 67 65 72  ught with danger
1be60 2e 20 20 42 65 73 74 20 74 6f 20 61 76 6f 69 64  .  Best to avoid
1be70 20 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67   the whole thing
1be80 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 73  .  If the.  ** s
1be90 75 62 71 75 65 72 79 20 69 73 20 74 68 65 20 72  ubquery is the r
1bea0 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20 4c  ight term of a L
1beb0 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65 6e 20 64  EFT JOIN, then d
1bec0 6f 20 6e 6f 74 20 66 6c 61 74 74 65 6e 2e 0a 20  o not flatten.. 
1bed0 20 2a 2f 0a 20 20 69 66 28 20 28 70 53 75 62 69   */.  if( (pSubi
1bee0 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
1bef0 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 29 7b 0a  JT_OUTER)!=0 ){.
1bf00 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1bf10 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 72 69 63 74  }..  /* Restrict
1bf20 69 6f 6e 20 31 37 3a 20 49 66 20 74 68 65 20 73  ion 17: If the s
1bf30 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1bf40 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 74  mpound SELECT, t
1bf50 68 65 6e 20 69 74 20 6d 75 73 74 0a 20 20 2a 2a  hen it must.  **
1bf60 20 75 73 65 20 6f 6e 6c 79 20 74 68 65 20 55 4e   use only the UN
1bf70 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72  ION ALL operator
1bf80 2e 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68  . And none of th
1bf90 65 20 73 69 6d 70 6c 65 20 73 65 6c 65 63 74 20  e simple select 
1bfa0 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 68 61  queries.  ** tha
1bfb0 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 63 6f  t make up the co
1bfc0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 72  mpound SELECT ar
1bfd0 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20  e allowed to be 
1bfe0 61 67 67 72 65 67 61 74 65 20 6f 72 20 64 69 73  aggregate or dis
1bff0 74 69 6e 63 74 0a 20 20 2a 2a 20 71 75 65 72 69  tinct.  ** queri
1c000 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  es..  */.  if( p
1c010 53 75 62 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  Sub->pPrior ){. 
1c020 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1c030 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 72  derBy ){.      r
1c040 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 52 65 73  eturn 0;  /* Res
1c050 74 72 69 63 74 69 6f 6e 20 32 30 20 2a 2f 0a 20  triction 20 */. 
1c060 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 41     }.    if( isA
1c070 67 67 20 7c 7c 20 28 70 2d 3e 73 65 6c 46 6c 61  gg || (p->selFla
1c080 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1c090 29 21 3d 30 20 7c 7c 20 70 53 72 63 2d 3e 6e 53  )!=0 || pSrc->nS
1c0a0 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rc!=1 ){.      r
1c0b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1c0c0 20 20 20 66 6f 72 28 70 53 75 62 31 3d 70 53 75     for(pSub1=pSu
1c0d0 62 3b 20 70 53 75 62 31 3b 20 70 53 75 62 31 3d  b; pSub1; pSub1=
1c0e0 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 29 7b 0a  pSub1->pPrior){.
1c0f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1c100 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73  (pSub1->selFlags
1c110 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
1c120 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d  SF_Aggregate))==
1c130 53 46 5f 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  SF_Distinct );. 
1c140 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1c150 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20  pSub1->selFlags 
1c160 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53  & (SF_Distinct|S
1c170 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53  F_Aggregate))==S
1c180 46 5f 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20  F_Aggregate );. 
1c190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
1c1a0 62 2d 3e 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  b->pSrc!=0 );.  
1c1b0 20 20 20 20 69 66 28 20 28 70 53 75 62 31 2d 3e      if( (pSub1->
1c1c0 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
1c1d0 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
1c1e0 67 61 74 65 29 29 21 3d 30 0a 20 20 20 20 20 20  gate))!=0.      
1c1f0 20 7c 7c 20 28 70 53 75 62 31 2d 3e 70 50 72 69   || (pSub1->pPri
1c200 6f 72 20 26 26 20 70 53 75 62 31 2d 3e 6f 70 21  or && pSub1->op!
1c210 3d 54 4b 5f 41 4c 4c 29 20 0a 20 20 20 20 20 20  =TK_ALL) .      
1c220 20 7c 7c 20 70 53 75 62 31 2d 3e 70 53 72 63 2d   || pSub1->pSrc-
1c230 3e 6e 53 72 63 3c 31 0a 20 20 20 20 20 20 20 7c  >nSrc<1.       |
1c240 7c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  | pSub->pEList->
1c250 6e 45 78 70 72 21 3d 70 53 75 62 31 2d 3e 70 45  nExpr!=pSub1->pE
1c260 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 20  List->nExpr.    
1c270 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
1c280 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
1c290 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c2a0 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1c2b0 3e 31 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >1 );.    }..   
1c2c0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1c2d0 31 38 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  18. */.    if( p
1c2e0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1c2f0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
1c300 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
1c310 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
1c320 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  r; ii++){.      
1c330 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1c340 79 2d 3e 61 5b 69 69 5d 2e 75 2e 78 2e 69 4f 72  y->a[ii].u.x.iOr
1c350 64 65 72 42 79 43 6f 6c 3d 3d 30 20 29 20 72 65  derByCol==0 ) re
1c360 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
1c370 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 2a      }.  }..  /**
1c380 2a 2a 2a 20 49 66 20 77 65 20 72 65 61 63 68 20  *** If we reach 
1c390 74 68 69 73 20 70 6f 69 6e 74 2c 20 66 6c 61 74  this point, flat
1c3a0 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69 74  tening is permit
1c3b0 74 65 64 2e 20 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f  ted. *****/..  /
1c3c0 2a 20 41 75 74 68 6f 72 69 7a 65 20 74 68 65 20  * Authorize the 
1c3d0 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 70 50  subquery */.  pP
1c3e0 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1c3f0 78 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 7a  xt = pSubitem->z
1c400 4e 61 6d 65 3b 0a 20 20 54 45 53 54 4f 4e 4c 59  Name;.  TESTONLY
1c410 28 69 20 3d 29 20 73 71 6c 69 74 65 33 41 75 74  (i =) sqlite3Aut
1c420 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1c430 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
1c440 20 30 2c 20 30 29 3b 0a 20 20 74 65 73 74 63 61   0, 0);.  testca
1c450 73 65 28 20 69 3d 3d 53 51 4c 49 54 45 5f 44 45  se( i==SQLITE_DE
1c460 4e 59 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  NY );.  pParse->
1c470 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
1c480 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1c490 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
1c4a0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1c4b0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1c4c0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 28 62  atement, then (b
1c4d0 79 20 72 65 73 74 72 69 63 74 69 6f 6e 73 0a 20  y restrictions. 
1c4e0 20 2a 2a 20 31 37 20 61 6e 64 20 31 38 20 61 62   ** 17 and 18 ab
1c4f0 6f 76 65 29 20 69 74 20 6d 75 73 74 20 62 65 20  ove) it must be 
1c500 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  a UNION ALL and 
1c510 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1c520 20 6d 75 73 74 20 0a 20 20 2a 2a 20 62 65 20 6f   must .  ** be o
1c530 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
1c540 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1c550 20 3c 65 78 70 72 2d 6c 69 73 74 3e 20 46 52 4f   <expr-list> FRO
1c560 4d 20 28 3c 73 75 62 2d 71 75 65 72 79 3e 29 20  M (<sub-query>) 
1c570 3c 77 68 65 72 65 2d 63 6c 61 75 73 65 3e 20 0a  <where-clause> .
1c580 20 20 2a 2a 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77    **.  ** follow
1c590 65 64 20 62 79 20 61 6e 79 20 4f 52 44 45 52 20  ed by any ORDER 
1c5a0 42 59 2c 20 4c 49 4d 49 54 20 61 6e 64 2f 6f 72  BY, LIMIT and/or
1c5b0 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
1c5c0 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 2a 2a   This block.  **
1c5d0 20 63 72 65 61 74 65 73 20 4e 2d 31 20 63 6f 70   creates N-1 cop
1c5e0 69 65 73 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ies of the paren
1c5f0 74 20 71 75 65 72 79 20 77 69 74 68 6f 75 74 20  t query without 
1c600 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1c610 4d 49 54 20 6f 72 20 0a 20 20 2a 2a 20 4f 46 46  MIT or .  ** OFF
1c620 53 45 54 20 63 6c 61 75 73 65 73 20 61 6e 64 20  SET clauses and 
1c630 6a 6f 69 6e 73 20 74 68 65 6d 20 74 6f 20 74 68  joins them to th
1c640 65 20 6c 65 66 74 2d 68 61 6e 64 2d 73 69 64 65  e left-hand-side
1c650 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
1c660 0a 20 20 2a 2a 20 75 73 69 6e 67 20 55 4e 49 4f  .  ** using UNIO
1c670 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 73 2e  N ALL operators.
1c680 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 4e 20   In this case N 
1c690 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
1c6a0 20 73 69 6d 70 6c 65 0a 20 20 2a 2a 20 73 65 6c   simple.  ** sel
1c6b0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ect statements i
1c6c0 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  n the compound s
1c6d0 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  ub-query..  **. 
1c6e0 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a   ** Example:.  *
1c6f0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1c700 54 20 61 2b 31 20 46 52 4f 4d 20 28 0a 20 20 2a  T a+1 FROM (.  *
1c710 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
1c720 78 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20  x FROM tab.  ** 
1c730 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
1c740 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  .  **        SEL
1c750 45 43 54 20 79 20 46 52 4f 4d 20 74 61 62 0a 20  ECT y FROM tab. 
1c760 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f 4e   **        UNION
1c770 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20 20   ALL.  **       
1c780 20 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29   SELECT abs(z*2)
1c790 20 46 52 4f 4d 20 74 61 62 32 0a 20 20 2a 2a 20   FROM tab2.  ** 
1c7a0 20 20 20 20 29 20 57 48 45 52 45 20 61 21 3d 35      ) WHERE a!=5
1c7b0 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a   ORDER BY 1.  **
1c7c0 0a 20 20 2a 2a 20 54 72 61 6e 73 66 6f 72 6d 65  .  ** Transforme
1c7d0 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  d into:.  **.  *
1c7e0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 2b 31  *     SELECT x+1
1c7f0 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52 45 20   FROM tab WHERE 
1c800 78 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  x+1!=5.  **     
1c810 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1c820 20 20 20 53 45 4c 45 43 54 20 79 2b 31 20 46 52     SELECT y+1 FR
1c830 4f 4d 20 74 61 62 20 57 48 45 52 45 20 79 2b 31  OM tab WHERE y+1
1c840 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49  !=5.  **     UNI
1c850 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1c860 53 45 4c 45 43 54 20 61 62 73 28 7a 2a 32 29 2b  SELECT abs(z*2)+
1c870 31 20 46 52 4f 4d 20 74 61 62 32 20 57 48 45 52  1 FROM tab2 WHER
1c880 45 20 61 62 73 28 7a 2a 32 29 2b 31 21 3d 35 0a  E abs(z*2)+1!=5.
1c890 20 20 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42    **     ORDER B
1c8a0 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  Y 1.  **.  ** We
1c8b0 20 63 61 6c 6c 20 74 68 69 73 20 74 68 65 20 22   call this the "
1c8c0 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72  compound-subquer
1c8d0 79 20 66 6c 61 74 74 65 6e 69 6e 67 22 2e 0a 20  y flattening".. 
1c8e0 20 2a 2f 0a 20 20 66 6f 72 28 70 53 75 62 3d 70   */.  for(pSub=p
1c8f0 53 75 62 2d 3e 70 50 72 69 6f 72 3b 20 70 53 75  Sub->pPrior; pSu
1c900 62 3b 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  b; pSub=pSub->pP
1c910 72 69 6f 72 29 7b 0a 20 20 20 20 53 65 6c 65 63  rior){.    Selec
1c920 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 45 78 70  t *pNew;.    Exp
1c930 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
1c940 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
1c950 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 20     Expr *pLimit 
1c960 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
1c970 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 20 3d   Expr *pOffset =
1c980 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
1c990 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 20   Select *pPrior 
1c9a0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
1c9b0 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
1c9c0 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1c9d0 30 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  0;.    p->pPrior
1c9e0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4c 69   = 0;.    p->pLi
1c9f0 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  mit = 0;.    p->
1ca00 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
1ca10 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   pNew = sqlite3S
1ca20 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2c 20  electDup(db, p, 
1ca30 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73  0);.    p->pOffs
1ca40 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20  et = pOffset;.  
1ca50 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
1ca60 69 6d 69 74 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  imit;.    p->pOr
1ca70 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
1ca80 3b 0a 20 20 20 20 70 2d 3e 70 53 72 63 20 3d 20  ;.    p->pSrc = 
1ca90 70 53 72 63 3b 0a 20 20 20 20 70 2d 3e 6f 70 20  pSrc;.    p->op 
1caa0 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 2d  = TK_ALL;.    p-
1cab0 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 30 3b  >pRightmost = 0;
1cac0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1cad0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
1cae0 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 65 6c   pPrior;.    }el
1caf0 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
1cb00 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1cb10 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69  .      pNew->pRi
1cb20 67 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20  ghtmost = 0;.   
1cb30 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72   }.    p->pPrior
1cb40 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 69 66 28   = pNew;.    if(
1cb50 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1cb60 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  d ) return 1;.  
1cb70 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c  }..  /* Begin fl
1cb80 61 74 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72  attening the iFr
1cb90 6f 6d 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74  om-th entry of t
1cba0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a  he FROM clause .
1cbb0 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65    ** in the oute
1cbc0 72 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  r query..  */.  
1cbd0 70 53 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70  pSub = pSub1 = p
1cbe0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1cbf0 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
1cc00 68 65 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62  he transient tab
1cc10 6c 65 20 73 74 72 75 63 74 75 72 65 20 61 73 73  le structure ass
1cc20 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1cc30 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20  .  ** subquery. 
1cc40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
1cc50 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1cc60 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
1cc70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1cc80 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d  , pSubitem->zNam
1cc90 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1cca0 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1ccb0 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75  ->zAlias);.  pSu
1ccc0 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  bitem->zDatabase
1ccd0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1cce0 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70  ->zName = 0;.  p
1ccf0 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  Subitem->zAlias 
1cd00 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  = 0;.  pSubitem-
1cd10 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20  >pSelect = 0;.. 
1cd20 20 2f 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69   /* Defer deleti
1cd30 6e 67 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  ng the Table obj
1cd40 65 63 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ect associated w
1cd50 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62  ith the.  ** sub
1cd60 71 75 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65  query until code
1cd70 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20   generation is. 
1cd80 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69   ** complete, si
1cd90 6e 63 65 20 74 68 65 72 65 20 6d 61 79 20 73 74  nce there may st
1cda0 69 6c 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70  ill exist Expr.p
1cdb0 54 61 62 20 65 6e 74 72 69 65 73 20 74 68 61 74  Tab entries that
1cdc0 0a 20 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  .  ** refer to t
1cdd0 68 65 20 73 75 62 71 75 65 72 79 20 65 76 65 6e  he subquery even
1cde0 20 61 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e   after flattenin
1cdf0 67 2e 20 20 54 69 63 6b 65 74 20 23 33 33 34 36  g.  Ticket #3346
1ce00 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62  ..  **.  ** pSub
1ce10 69 74 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c  item->pTab is al
1ce20 77 61 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79  ways non-NULL by
1ce30 20 74 65 73 74 20 72 65 73 74 72 69 63 74 69 6f   test restrictio
1ce40 6e 73 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f  ns and tests abo
1ce50 76 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41  ve..  */.  if( A
1ce60 4c 57 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e  LWAYS(pSubitem->
1ce70 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
1ce80 54 61 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c  Table *pTabToDel
1ce90 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61   = pSubitem->pTa
1cea0 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 54  b;.    if( pTabT
1ceb0 6f 44 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b  oDel->nRef==1 ){
1cec0 0a 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 54  .      Parse *pT
1ced0 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
1cee0 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
1cef0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54  Parse);.      pT
1cf00 61 62 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f  abToDel->pNextZo
1cf10 6d 62 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c  mbie = pToplevel
1cf20 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20  ->pZombieTab;.  
1cf30 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70      pToplevel->p
1cf40 5a 6f 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62  ZombieTab = pTab
1cf50 54 6f 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  ToDel;.    }else
1cf60 7b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  {.      pTabToDe
1cf70 6c 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d  l->nRef--;.    }
1cf80 0a 20 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  .    pSubitem->p
1cf90 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Tab = 0;.  }..  
1cfa0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1cfb0 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
1cfc0 66 6f 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e  for each term in
1cfd0 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71   a compound-subq
1cfe0 75 65 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65  uery.  ** flatte
1cff0 6e 69 6e 67 20 28 61 73 20 64 65 73 63 72 69 62  ning (as describ
1d000 65 64 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77  ed above).  If w
1d010 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69  e are doing a di
1d020 66 66 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a  fferent kind.  *
1d030 2a 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20  * of flattening 
1d040 2d 20 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f  - a flattening o
1d050 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70  ther than a comp
1d060 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c  ound-subquery fl
1d070 61 74 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20  attening -.  ** 
1d080 74 68 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f  then this loop o
1d090 6e 6c 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20  nly runs once.. 
1d0a0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
1d0b0 6f 70 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20  op moves all of 
1d0c0 74 68 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74  the FROM element
1d0d0 73 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  s of the subquer
1d0e0 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  y into the.  ** 
1d0f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1d100 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1d110 72 79 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e  ry.  Before doin
1d120 67 20 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72  g this, remember
1d130 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  .  ** the cursor
1d140 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
1d150 6f 72 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71  original outer q
1d160 75 65 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e  uery FROM elemen
1d170 74 20 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e  t in.  ** iParen
1d180 74 2e 20 20 54 68 65 20 69 50 61 72 65 6e 74 20  t.  The iParent 
1d190 63 75 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65  cursor will neve
1d1a0 72 20 62 65 20 75 73 65 64 2e 20 20 53 75 62 73  r be used.  Subs
1d1b0 65 71 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a  equent code.  **
1d1c0 20 77 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65   will scan expre
1d1d0 73 73 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66  ssions looking f
1d1e0 6f 72 20 69 50 61 72 65 6e 74 20 72 65 66 65 72  or iParent refer
1d1f0 65 6e 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63  ences and replac
1d200 65 0a 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66  e.  ** those ref
1d210 65 72 65 6e 63 65 73 20 77 69 74 68 20 65 78 70  erences with exp
1d220 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65  ressions that re
1d230 73 6f 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62  solve to the sub
1d240 71 75 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20  query FROM.  ** 
1d250 65 6c 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20  elements we are 
1d260 6e 6f 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a  now copying in..
1d270 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65    */.  for(pPare
1d280 6e 74 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70  nt=p; pParent; p
1d290 50 61 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e  Parent=pParent->
1d2a0 70 50 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75  pPrior, pSub=pSu
1d2b0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1d2c0 69 6e 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20  int nSubSrc;.   
1d2d0 20 75 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30   u8 jointype = 0
1d2e0 3b 0a 20 20 20 20 70 53 75 62 53 72 63 20 3d 20  ;.    pSubSrc = 
1d2f0 70 53 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20  pSub->pSrc;     
1d300 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  /* FROM clause o
1d310 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20  f subquery */.  
1d320 20 20 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62    nSubSrc = pSub
1d330 53 72 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e  Src->nSrc;  /* N
1d340 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
1d350 6e 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20  n subquery FROM 
1d360 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53  clause */.    pS
1d370 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
1d380 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20  rc;     /* FROM 
1d390 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
1d3a0 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20  ter query */..  
1d3b0 20 20 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20    if( pSrc ){.  
1d3c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1d3d0 65 6e 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69  ent==p );  /* Fi
1d3e0 72 73 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68  rst time through
1d3f0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1d400 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53     jointype = pS
1d410 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ubitem->jointype
1d420 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d430 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1d440 6e 74 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64  nt!=p );  /* 2nd
1d450 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20   and subsequent 
1d460 74 69 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68  times through th
1d470 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20  e loop */.      
1d480 70 53 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e  pSrc = pParent->
1d490 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
1d4a0 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
1d4b0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
1d4c0 69 66 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20  if( pSrc==0 ){. 
1d4d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
1d4e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1d4f0 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
1d500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d510 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71  .    /* The subq
1d520 75 65 72 79 20 75 73 65 73 20 61 20 73 69 6e 67  uery uses a sing
1d530 6c 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46  le slot of the F
1d540 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1d550 65 20 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71  e outer.    ** q
1d560 75 65 72 79 2e 20 20 49 66 20 74 68 65 20 73 75  uery.  If the su
1d570 62 71 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20  bquery has more 
1d580 74 68 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74  than one element
1d590 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61   in its FROM cla
1d5a0 75 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  use,.    ** then
1d5b0 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65   expand the oute
1d5c0 72 20 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20  r query to make 
1d5d0 73 70 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20  space for it to 
1d5e0 68 6f 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  hold all element
1d5f0 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
1d600 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a  subquery..    **
1d610 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a  .    ** Example:
1d620 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1d630 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1d640 74 61 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20  tabA, (SELECT * 
1d650 46 52 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29  FROM sub1, sub2)
1d660 2c 20 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20  , tabB;.    **. 
1d670 20 20 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20     ** The outer 
1d680 71 75 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74  query has 3 slot
1d690 73 20 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c  s in its FROM cl
1d6a0 61 75 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20  ause.  One slot 
1d6b0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  of the.    ** ou
1d6c0 74 65 72 20 71 75 65 72 79 20 28 74 68 65 20 6d  ter query (the m
1d6d0 69 64 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75  iddle slot) is u
1d6e0 73 65 64 20 62 79 20 74 68 65 20 73 75 62 71 75  sed by the subqu
1d6f0 65 72 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20  ery.  The next. 
1d700 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63     ** block of c
1d710 6f 64 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  ode will expand 
1d720 74 68 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f  the out query to
1d730 20 34 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d   4 slots.  The m
1d740 69 64 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f  iddle.    ** slo
1d750 74 20 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f  t is expanded to
1d760 20 74 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72   two slots in or
1d770 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63  der to make spac
1d780 65 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e for the.    **
1d790 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
1d7a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d7b0 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
1d7c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d7d0 20 6e 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20   nSubSrc>1 ){.  
1d7e0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72      pParent->pSr
1d7f0 63 20 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74  c = pSrc = sqlit
1d800 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1d810 28 64 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53  (db, pSrc, nSubS
1d820 72 63 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20  rc-1,iFrom+1);. 
1d830 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
1d840 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1d850 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d860 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d870 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65 20 46  * Transfer the F
1d880 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM clause terms
1d890 20 66 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65   from the subque
1d8a0 72 79 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  ry into the.    
1d8b0 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  ** outer query..
1d8c0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
1d8d0 3d 30 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69  =0; i<nSubSrc; i
1d8e0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1d8f0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1d900 62 2c 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72  b, pSrc->a[i+iFr
1d910 6f 6d 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20  om].pUsing);.   
1d920 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72     pSrc->a[i+iFr
1d930 6f 6d 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61  om] = pSubSrc->a
1d940 5b 69 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  [i];.      memse
1d950 74 28 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d  t(&pSubSrc->a[i]
1d960 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62  , 0, sizeof(pSub
1d970 53 72 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20  Src->a[i]));.   
1d980 20 7d 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69   }.    pSrc->a[i
1d990 46 72 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  From].jointype =
1d9a0 20 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20   jointype;.  .  
1d9b0 20 20 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73    /* Now begin s
1d9c0 75 62 73 74 69 74 75 74 69 6e 67 20 73 75 62 71  ubstituting subq
1d9d0 75 65 72 79 20 72 65 73 75 6c 74 20 73 65 74 20  uery result set 
1d9e0 65 78 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20  expressions for 
1d9f0 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63  .    ** referenc
1da00 65 73 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e  es to the iParen
1da10 74 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  t in the outer q
1da20 75 65 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  uery..    ** .  
1da30 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20    ** Example:.  
1da40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1da50 4c 45 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46  LECT a+5, b*10 F
1da60 52 4f 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20  ROM (SELECT x*3 
1da70 41 53 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20  AS a, y+10 AS b 
1da80 46 52 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61  FROM t1) WHERE a
1da90 3e 62 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20  >b;.    **   \  
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dab0 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
1dac0 5f 20 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f  _ subquery _____
1dad0 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
1dae0 2f 0a 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f  /.    **    \___
1daf0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1db00 5f 5f 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f  __ outer query _
1db10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1db20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20  _____________/. 
1db30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20     **.    ** We 
1db40 6c 6f 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78  look at every ex
1db50 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
1db60 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 20  outer query and 
1db70 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
1db80 65 65 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65  ee.    ** "a" we
1db90 20 73 75 62 73 74 69 74 75 74 65 20 22 78 2a 33   substitute "x*3
1dba0 22 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  " and every plac
1dbb0 65 20 77 65 20 73 65 65 20 22 62 22 20 77 65 20  e we see "b" we 
1dbc0 73 75 62 73 74 69 74 75 74 65 20 22 79 2b 31 30  substitute "y+10
1dbd0 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c  "..    */.    pL
1dbe0 69 73 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ist = pParent->p
1dbf0 45 4c 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69  EList;.    for(i
1dc00 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
1dc10 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
1dc20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  if( pList->a[i].
1dc30 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
1dc40 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
1dc50 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
1dc60 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  p(db, pList->a[i
1dc70 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
1dc80 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
1dc90 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  (zName);.       
1dca0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1dcb0 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
1dcc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75    }.    }.    su
1dcd0 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1dce0 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c  pParent->pEList,
1dcf0 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1dd00 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28  pEList);.    if(
1dd10 20 69 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20   isAgg ){.      
1dd20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
1dd30 2c 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  , pParent->pGrou
1dd40 70 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53  pBy, iParent, pS
1dd50 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  ub->pEList);.   
1dd60 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76     pParent->pHav
1dd70 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
1dd80 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  db, pParent->pHa
1dd90 76 69 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70  ving, iParent, p
1dda0 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1ddb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
1ddc0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1ddd0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1dde0 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  ent->pOrderBy==0
1ddf0 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
1de00 74 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53  t->pOrderBy = pS
1de10 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ub->pOrderBy;.  
1de20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72      pSub->pOrder
1de30 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  By = 0;.    }els
1de40 65 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70  e if( pParent->p
1de50 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
1de60 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
1de70 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64  b, pParent->pOrd
1de80 65 72 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70  erBy, iParent, p
1de90 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sub->pEList);.  
1dea0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62    }.    if( pSub
1deb0 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
1dec0 20 20 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74    pWhere = sqlit
1ded0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
1dee0 75 62 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a  ub->pWhere, 0);.
1def0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1df00 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20   pWhere = 0;.   
1df10 20 7d 0a 20 20 20 20 69 66 28 20 73 75 62 71 75   }.    if( subqu
1df20 65 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20  eryIsAgg ){.    
1df30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1df40 74 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b  t->pHaving==0 );
1df50 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1df60 70 48 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e  pHaving = pParen
1df70 74 2d 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20  t->pWhere;.     
1df80 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65   pParent->pWhere
1df90 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20   = pWhere;.     
1dfa0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1dfb0 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
1dfc0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
1dfd0 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
1dfe0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1dff0 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
1e000 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ng = sqlite3Expr
1e010 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  And(db, pParent-
1e020 3e 70 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20  >pHaving, .     
1e030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e040 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1e050 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
1e060 70 53 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30  pSub->pHaving, 0
1e070 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
1e080 28 20 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75  ( pParent->pGrou
1e090 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
1e0a0 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
1e0b0 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
1e0c0 69 73 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d  istDup(db, pSub-
1e0d0 3e 70 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20  >pGroupBy, 0);. 
1e0e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e0f0 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20  pParent->pWhere 
1e100 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1e110 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c  pParent->pWhere,
1e120 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1e130 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70  pEList);.      p
1e140 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
1e150 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
1e160 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  db, pParent->pWh
1e170 65 72 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  ere, pWhere);.  
1e180 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68    }.  .    /* Th
1e190 65 20 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72  e flattened quer
1e1a0 79 20 69 73 20 64 69 73 74 69 6e 63 74 20 69 66  y is distinct if
1e1b0 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65   either the inne
1e1c0 72 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  r or the.    ** 
1e1d0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 64  outer query is d
1e1e0 69 73 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f  istinct. .    */
1e1f0 0a 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65  .    pParent->se
1e200 6c 46 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e  lFlags |= pSub->
1e210 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1e220 73 74 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f  stinct;.  .    /
1e230 2a 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  *.    ** SELECT 
1e240 2e 2e 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  ... FROM (SELECT
1e250 20 2e 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46   ... LIMIT a OFF
1e260 53 45 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f  SET b) LIMIT x O
1e270 46 46 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a  FFSET y;.    **.
1e280 20 20 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65      ** One is te
1e290 6d 70 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20  mpted to try to 
1e2a0 61 64 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63  add a and b to c
1e2b0 6f 6d 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74  ombine the limit
1e2c0 73 2e 20 20 42 75 74 20 74 68 69 73 0a 20 20 20  s.  But this.   
1e2d0 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   ** does not wor
1e2e0 6b 20 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69  k if either limi
1e2f0 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20  t is negative.. 
1e300 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
1e310 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ub->pLimit ){.  
1e320 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69      pParent->pLi
1e330 6d 69 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d  mit = pSub->pLim
1e340 69 74 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  it;.      pSub->
1e350 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
1e360 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69  }.  }..  /* Fini
1e370 61 6c 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61  ally, delete wha
1e380 74 20 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65  t is left of the
1e390 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 72 65   subquery and re
1e3a0 74 75 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  turn.  ** succes
1e3b0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
1e3c0 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1e3d0 2c 20 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74  , pSub1);..  ret
1e3e0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
1e3f0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
1e400 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1e410 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
1e420 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
1e430 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20  */../*.** Based 
1e440 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
1e450 6f 66 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73  of the AggInfo s
1e460 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
1e470 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 0a  ed by the first.
1e480 2a 2a 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69  ** argument, thi
1e490 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b  s function check
1e4a0 73 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s if the followi
1e4b0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1e4c0 2a 2a 20 20 20 20 2a 20 74 68 65 20 71 75 65 72  **    * the quer
1e4d0 79 20 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20  y contains just 
1e4e0 61 20 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61  a single aggrega
1e4f0 74 65 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20  te function,.** 
1e500 20 20 20 2a 20 74 68 65 20 61 67 67 72 65 67 61     * the aggrega
1e510 74 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  te function is e
1e520 69 74 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d  ither min() or m
1e530 61 78 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  ax(), and.**    
1e540 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  * the argument t
1e550 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
1e560 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f  function is a co
1e570 6c 75 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  lumn value..**.*
1e580 2a 20 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  * If all of the 
1e590 61 62 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20  above are true, 
1e5a0 74 68 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52  then WHERE_ORDER
1e5b0 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f  BY_MIN or WHERE_
1e5c0 4f 52 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69  ORDERBY_MAX.** i
1e5d0 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 61 70  s returned as ap
1e5e0 70 72 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c  propriate. Also,
1e5f0 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
1e600 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
1e610 65 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72  e .** list of ar
1e620 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
1e630 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  o the aggregate 
1e640 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1e650 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
1e660 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62  he conditions ab
1e670 6f 76 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c  ove are not met,
1e680 20 2a 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65   *ppMinMax is se
1e690 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48  t to 0 and.** WH
1e6a0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d  ERE_ORDERBY_NORM
1e6b0 41 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  AL is returned..
1e6c0 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e  */.static u8 min
1e6d0 4d 61 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f  MaxQuery(AggInfo
1e6e0 20 2a 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72   *pAggInfo, Expr
1e6f0 4c 69 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29  List **ppMinMax)
1e700 7b 0a 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57  {.  int eRet = W
1e710 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
1e720 4d 41 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  MAL;          /*
1e730 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1e740 0a 0a 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20  ..  *ppMinMax = 
1e750 30 3b 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66  0;.  if( pAggInf
1e760 6f 2d 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20  o->nFunc==1 ){. 
1e770 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
1e780 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63   pAggInfo->aFunc
1e790 5b 30 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67  [0].pExpr; /* Ag
1e7a0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
1e7b0 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74   */.    ExprList
1e7c0 20 2a 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72   *pEList = pExpr
1e7d0 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20  ->x.pList;      
1e7e0 2f 2a 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20  /* Arguments to 
1e7f0 61 67 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  agg function */.
1e800 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78  .    assert( pEx
1e810 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46  pr->op==TK_AGG_F
1e820 55 4e 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69  UNCTION );.    i
1e830 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
1e840 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26  ist->nExpr==1 &&
1e850 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45   pEList->a[0].pE
1e860 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
1e870 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
1e880 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
1e890 63 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  c = pExpr->u.zTo
1e8a0 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ken;.      if( s
1e8b0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46  qlite3StrICmp(zF
1e8c0 75 6e 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29  unc, "min")==0 )
1e8d0 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d  {.        eRet =
1e8e0 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d   WHERE_ORDERBY_M
1e8f0 49 4e 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d  IN;.        *ppM
1e900 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a  inMax = pEList;.
1e910 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e920 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1e930 46 75 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20  Func, "max")==0 
1e940 29 7b 0a 20 20 20 20 20 20 20 20 65 52 65 74 20  ){.        eRet 
1e950 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
1e960 4d 41 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  MAX;.        *pp
1e970 4d 69 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b  MinMax = pEList;
1e980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e990 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
1e9a0 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a  pMinMax==0 || (*
1e9b0 70 70 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72  ppMinMax)->nExpr
1e9c0 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==1 );.  return 
1e9d0 65 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  eRet;.}../*.** T
1e9e0 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
1e9f0 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
1ea00 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1ea10 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
1ea20 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73   query..** The s
1ea30 65 63 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73  econd argment is
1ea40 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
1ea50 61 67 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f  aggregate-info o
1ea60 62 6a 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20  bject. This .** 
1ea70 66 75 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69  function tests i
1ea80 66 20 74 68 65 20 53 45 4c 45 43 54 20 69 73 20  f the SELECT is 
1ea90 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a  of the form:.**.
1eaa0 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
1eab0 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
1eac0 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c  **.** where tabl
1ead0 65 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  e is a database 
1eae0 74 61 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62  table, not a sub
1eaf0 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e  -select or view.
1eb00 20 49 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a   If the query.**
1eb10 20 64 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73   does match this
1eb20 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61   pattern, then a
1eb30 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1eb40 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70  Table object rep
1eb50 72 65 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62  resenting.** <tb
1eb60 6c 3e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  l> is returned. 
1eb70 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
1eb80 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1eb90 74 69 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d  tic Table *isSim
1eba0 70 6c 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20  pleCount(Select 
1ebb0 2a 70 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  *p, AggInfo *pAg
1ebc0 67 49 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20  gInfo){.  Table 
1ebd0 2a 70 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70  *pTab;.  Expr *p
1ebe0 45 78 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Expr;..  assert(
1ebf0 20 21 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b   !p->pGroupBy );
1ec00 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72  ..  if( p->pWher
1ec10 65 20 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  e || p->pEList->
1ec20 6e 45 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20  nExpr!=1 .   || 
1ec30 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  p->pSrc->nSrc!=1
1ec40 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30   || p->pSrc->a[0
1ec50 5d 2e 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20  ].pSelect.  ){. 
1ec60 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ec70 0a 20 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72  .  pTab = p->pSr
1ec80 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  c->a[0].pTab;.  
1ec90 70 45 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73  pExpr = p->pELis
1eca0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
1ecb0 20 61 73 73 65 72 74 28 20 70 54 61 62 20 26 26   assert( pTab &&
1ecc0 20 21 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20   !pTab->pSelect 
1ecd0 26 26 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69  && pExpr );..  i
1ece0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
1ecf0 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  b) ) return 0;. 
1ed00 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
1ed10 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20  TK_AGG_FUNCTION 
1ed20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1ed30 28 20 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f  ( NEVER(pAggInfo
1ed40 2d 3e 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65  ->nFunc==0) ) re
1ed50 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70  turn 0;.  if( (p
1ed60 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
1ed70 5d 2e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ].pFunc->funcFla
1ed80 67 73 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  gs&SQLITE_FUNC_C
1ed90 4f 55 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72  OUNT)==0 ) retur
1eda0 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1edb0 2d 3e 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69  ->flags&EP_Disti
1edc0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  nct ) return 0;.
1edd0 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
1ede0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
1edf0 73 6f 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d  source-list item
1ee00 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
1ee10 67 75 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65  gument was augme
1ee20 6e 74 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20  nted with an.** 
1ee30 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
1ee40 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c  e, then try to l
1ee50 6f 63 61 74 65 20 74 68 65 20 73 70 65 63 69 66  ocate the specif
1ee60 69 65 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ied index. If th
1ee70 65 72 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20  ere.** was such 
1ee80 61 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65  a clause and the
1ee90 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e   named index can
1eea0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  not be found, re
1eeb0 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
1eec0 45 52 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20  ERROR and leave 
1eed0 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72  an error in pPar
1eee0 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70  se. Otherwise, p
1eef0 6f 70 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f  opulate .** pFro
1ef00 6d 2d 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65  m->pIndex and re
1ef10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
1ef20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e  */.int sqlite3In
1ef30 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61  dexedByLookup(Pa
1ef40 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72  rse *pParse, str
1ef50 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ef60 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
1ef70 70 46 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70  pFrom->pTab && p
1ef80 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a  From->zIndex ){.
1ef90 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1efa0 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
1efb0 20 20 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20     char *zIndex 
1efc0 3d 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b  = pFrom->zIndex;
1efd0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
1efe0 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  ;.    for(pIdx=p
1eff0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20  Tab->pIndex; .  
1f000 20 20 20 20 20 20 70 49 64 78 20 26 26 20 73 71        pIdx && sq
1f010 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 64  lite3StrICmp(pId
1f020 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78  x->zName, zIndex
1f030 29 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  ); .        pIdx
1f040 3d 70 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20  =pIdx->pNext.   
1f050 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64   );.    if( !pId
1f060 78 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  x ){.      sqlit
1f070 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1f080 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
1f090 78 3a 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20  x: %s", zIndex, 
1f0a0 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
1f0b0 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1f0c0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1f0d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1f0e0 20 20 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70    }.    pFrom->p
1f0f0 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
1f100 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1f110 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65  E_OK;.}./*.** De
1f120 74 65 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45  tect compound SE
1f130 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
1f140 74 68 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45  that use an ORDE
1f150 52 20 42 59 20 63 6c 61 75 73 65 20 77 69 74 68  R BY clause with
1f160 20 0a 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74   .** an alternat
1f170 69 76 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ive collating se
1f180 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  quence..**.**   
1f190 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
1f1a0 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
1f1b0 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52  T ... FROM t2 OR
1f1c0 44 45 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54  DER BY .. COLLAT
1f1d0 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  E ....**.** Thes
1f1e0 65 20 61 72 65 20 72 65 77 72 69 74 74 65 6e 20  e are rewritten 
1f1f0 61 73 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a  as a subquery:.*
1f200 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a  *.**    SELECT *
1f210 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e   FROM (SELECT ..
1f220 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
1f230 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
1f240 20 74 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45   t2).**     ORDE
1f250 52 20 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45  R BY ... COLLATE
1f260 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ....**.** This 
1f270 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
1f280 73 20 6e 65 63 65 73 73 61 72 79 20 62 65 63 61  s necessary beca
1f290 75 73 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c  use the multiSel
1f2a0 65 63 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75  ectOrderBy() rou
1f2b0 74 69 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68  tine.** above th
1f2c0 61 74 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  at generates the
1f2d0 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70   code for a comp
1f2e0 6f 75 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68  ound SELECT with
1f2f0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1f300 75 73 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65  use.** uses a me
1f310 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68  rge algorithm th
1f320 61 74 20 72 65 71 75 69 72 65 73 20 74 68 65 20  at requires the 
1f330 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  same collating s
1f340 65 71 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a  equence on the.*
1f350 2a 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  * result columns
1f360 20 61 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52   as on the ORDER
1f370 20 42 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65   BY clause.  See
1f380 20 74 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a   ticket.** http:
1f390 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
1f3a0 2f 73 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37  /src/info/670957
1f3b0 34 64 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  4d2a.**.** This 
1f3c0 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
1f3d0 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f  s only needed fo
1f3e0 72 20 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53  r EXCEPT, INTERS
1f3f0 45 43 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a  ECT, and UNION..
1f400 2a 2a 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ** The UNION ALL
1f410 20 6f 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20   operator works 
1f420 66 69 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53  fine with multiS
1f430 65 6c 65 63 74 4f 72 64 65 72 42 79 28 29 20 65  electOrderBy() e
1f440 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72  ven when.** ther
1f450 65 20 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65  e are COLLATE te
1f460 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
1f470 20 42 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   BY..*/.static i
1f480 6e 74 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75  nt convertCompou
1f490 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65  ndSelectToSubque
1f4a0 72 79 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ry(Walker *pWalk
1f4b0 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
1f4c0 20 20 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63    int i;.  Selec
1f4d0 74 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63  t *pNew;.  Selec
1f4e0 74 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  t *pX;.  sqlite3
1f4f0 20 2a 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45   *db;.  struct E
1f500 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b  xprList_item *a;
1f510 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77  .  SrcList *pNew
1f520 53 72 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Src;.  Parse *pP
1f530 61 72 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75  arse;.  Token du
1f540 6d 6d 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  mmy;..  if( p->p
1f550 50 72 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72  Prior==0 ) retur
1f560 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1f570 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
1f580 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  y==0 ) return WR
1f590 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f  C_Continue;.  fo
1f5a0 72 28 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70  r(pX=p; pX && (p
1f5b0 58 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c  X->op==TK_ALL ||
1f5c0 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45   pX->op==TK_SELE
1f5d0 43 54 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69  CT); pX=pX->pPri
1f5e0 6f 72 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d  or){}.  if( pX==
1f5f0 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
1f600 6f 6e 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70  ontinue;.  a = p
1f610 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20  ->pOrderBy->a;. 
1f620 20 66 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72   for(i=p->pOrder
1f630 42 79 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d  By->nExpr-1; i>=
1f640 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28  0; i--){.    if(
1f650 20 61 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61   a[i].pExpr->fla
1f660 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
1f670 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1f680 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
1f690 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20  WRC_Continue;.. 
1f6a0 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20   /* If we reach 
1f6b0 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74  this point, that
1f6c0 20 6d 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73   means the trans
1f6d0 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71  formation is req
1f6e0 75 69 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61  uired. */..  pPa
1f6f0 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
1f700 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50  Parse;.  db = pP
1f710 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77  arse->db;.  pNew
1f720 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1f730 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
1f740 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
1f750 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
1f760 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1f770 6d 65 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30  memset(&dummy, 0
1f780 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29  , sizeof(dummy))
1f790 3b 0a 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71  ;.  pNewSrc = sq
1f7a0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1f7b0 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
1f7c0 65 2c 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70  e,0,0,0,&dummy,p
1f7d0 4e 65 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20  New,0,0);.  if( 
1f7e0 70 4e 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74  pNewSrc==0 ) ret
1f7f0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1f800 20 2a 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70   *pNew = *p;.  p
1f810 2d 3e 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63  ->pSrc = pNewSrc
1f820 3b 0a 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20  ;.  p->pEList = 
1f830 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
1f840 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
1f850 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1f860 20 54 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20   TK_ALL, 0));.  
1f870 70 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43  p->op = TK_SELEC
1f880 54 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d  T;.  p->pWhere =
1f890 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f   0;.  pNew->pGro
1f8a0 75 70 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77  upBy = 0;.  pNew
1f8b0 2d 3e 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20  ->pHaving = 0;. 
1f8c0 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
1f8d0 3d 20 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  = 0;.  p->pPrior
1f8e0 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
1f8f0 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  imit = 0;.  pNew
1f900 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
1f910 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1f920 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  inue;.}..#ifndef
1f930 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
1f940 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
1f950 70 57 69 74 68 20 28 77 68 69 63 68 20 6d 61 79  pWith (which may
1f960 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69 6e 74 73   be NULL) points
1f970 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73   to a linked lis
1f980 74 20 6f 66 20 6e 65 73 74 65 64 20 0a 2a 2a 20  t of nested .** 
1f990 57 49 54 48 20 63 6f 6e 74 65 78 74 73 2c 20 66  WITH contexts, f
1f9a0 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20 6f 75 74  rom inner to out
1f9b0 65 72 6d 6f 73 74 2e 20 49 66 20 74 68 65 20 74  ermost. If the t
1f9c0 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  able identified 
1f9d0 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61 75  by .** FROM clau
1f9e0 73 65 20 65 6c 65 6d 65 6e 74 20 70 49 74 65 6d  se element pItem
1f9f0 20 69 73 20 72 65 61 6c 6c 79 20 61 20 63 6f 6d   is really a com
1fa00 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70 72 65 73  mon-table-expres
1fa10 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a 2a 20 74  sion (CTE) .** t
1fa20 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69  hen return a poi
1fa30 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20  nter to the CTE 
1fa40 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 74  definition for t
1fa50 68 61 74 20 74 61 62 6c 65 2e 20 4f 74 68 65 72  hat table. Other
1fa60 77 69 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 4e  wise.** return N
1fa70 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
1fa80 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 69  non-NULL value i
1fa90 73 20 72 65 74 75 72 6e 65 64 2c 20 73 65 74 20  s returned, set 
1faa0 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f 20 70 6f  *ppContext to po
1fab0 69 6e 74 20 74 6f 20 74 68 65 20 57 69 74 68 0a  int to the With.
1fac0 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 74  ** object that t
1fad0 68 65 20 72 65 74 75 72 6e 65 64 20 43 54 45 20  he returned CTE 
1fae0 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a 2f 0a 73  belongs to..*/.s
1faf0 74 61 74 69 63 20 73 74 72 75 63 74 20 43 74 65  tatic struct Cte
1fb00 20 2a 73 65 61 72 63 68 57 69 74 68 28 0a 20 20   *searchWith(.  
1fb10 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20  With *pWith,    
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb30 2f 2a 20 43 75 72 72 65 6e 74 20 6f 75 74 65 72  /* Current outer
1fb40 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75 73 65  most WITH clause
1fb50 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1fb60 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1fb70 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ,     /* FROM cl
1fb80 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 74 6f 20  ause element to 
1fb90 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 57 69 74  resolve */.  Wit
1fba0 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74 20 20 20  h **ppContext   
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fbc0 4f 55 54 3a 20 57 49 54 48 20 63 6c 61 75 73 65  OUT: WITH clause
1fbd0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 62 65   return value be
1fbe0 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29 7b 0a 20  longs to */.){. 
1fbf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1fc00 6d 65 3b 0a 20 20 69 66 28 20 70 49 74 65 6d 2d  me;.  if( pItem-
1fc10 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 26 26  >zDatabase==0 &&
1fc20 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d   (zName = pItem-
1fc30 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
1fc40 20 20 57 69 74 68 20 2a 70 3b 0a 20 20 20 20 66    With *p;.    f
1fc50 6f 72 28 70 3d 70 57 69 74 68 3b 20 70 3b 20 70  or(p=pWith; p; p
1fc60 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a 20 20 20  =p->pOuter){.   
1fc70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
1fc80 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
1fc90 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
1fca0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1fcb0 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 2d 3e 61  ICmp(zName, p->a
1fcc0 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
1fcd0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 70 43 6f  .          *ppCo
1fce0 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  ntext = p;.     
1fcf0 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e       return &p->
1fd00 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  a[i];.        }.
1fd10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fd20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1fd30 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  ./* The code gen
1fd40 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e 73  erator maintains
1fd50 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74 69   a stack of acti
1fd60 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73 0a  ve WITH clauses.
1fd70 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e 65  ** with the inne
1fd80 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61 75  r-most WITH clau
1fd90 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65 20  se being at the 
1fda0 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
1fdb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1fdc0 74 69 6e 65 20 70 75 73 68 65 73 20 74 68 65 20  tine pushes the 
1fdd0 57 49 54 48 20 63 6c 61 75 73 65 20 70 61 73 73  WITH clause pass
1fde0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1fdf0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 6f 6e 74   argument.** ont
1fe00 6f 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  o the top of the
1fe10 20 73 74 61 63 6b 2e 20 49 66 20 61 72 67 75 6d   stack. If argum
1fe20 65 6e 74 20 62 46 72 65 65 20 69 73 20 74 72 75  ent bFree is tru
1fe30 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  e, then this.** 
1fe40 57 49 54 48 20 63 6c 61 75 73 65 20 77 69 6c 6c  WITH clause will
1fe50 20 6e 65 76 65 72 20 62 65 20 70 6f 70 70 65 64   never be popped
1fe60 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e   from the stack.
1fe70 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
1fe80 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65 20 66 72  .** should be fr
1fe90 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
1fea0 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e  he Parse object.
1feb0 20 49 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2c   In other cases,
1fec0 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65 65 3d 3d   when.** bFree==
1fed0 30 2c 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  0, the With obje
1fee0 63 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  ct will be freed
1fef0 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20   along with the 
1ff00 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74 61 74 65  SELECT .** state
1ff10 6d 65 6e 74 20 77 69 74 68 20 77 68 69 63 68 20  ment with which 
1ff20 69 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  it is associated
1ff30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ff40 33 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20  3WithPush(Parse 
1ff50 2a 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70  *pParse, With *p
1ff60 57 69 74 68 2c 20 75 38 20 62 46 72 65 65 29 7b  With, u8 bFree){
1ff70 0a 20 20 61 73 73 65 72 74 28 20 62 46 72 65 65  .  assert( bFree
1ff80 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  ==0 || pParse->p
1ff90 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20 69 66 28  With==0 );.  if(
1ffa0 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 70 57   pWith ){.    pW
1ffb0 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d 20 70 50  ith->pOuter = pP
1ffc0 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
1ffd0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
1ffe0 20 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72   pWith;.    pPar
1fff0 73 65 2d 3e 62 46 72 65 65 57 69 74 68 20 3d 20  se->bFreeWith = 
20000 62 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  bFree;.  }.}../*
20010 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20020 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72 67 75  n checks if argu
20030 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66 65 72  ment pFrom refer
20040 73 20 74 6f 20 61 20 43 54 45 20 64 65 63 6c 61  s to a CTE decla
20050 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57 49 54  red by .** a WIT
20060 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68 65 20  H clause on the 
20070 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c 79 20  stack currently 
20080 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 74 68  maintained by th
20090 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c 0a 2a  e parser. And,.*
200a0 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 70  * if currently p
200b0 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54 45 20  rocessing a CTE 
200c0 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66 20 69  expression, if i
200d0 74 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  t is a recursive
200e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
200f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 43 54 45   the current CTE
20100 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
20110 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69 74 68   falls into eith
20120 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 63 61  er of the two ca
20130 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65 2c 20  tegories above, 
20140 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a 20 61  pFrom->pTab.** a
20150 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  nd other fields 
20160 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 61 63  are populated ac
20170 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65 20 63  cordingly. The c
20180 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 68 65  aller should che
20190 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e 70 54  ck.** (pFrom->pT
201a0 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65 72 6d  ab!=0) to determ
201b0 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
201c0 6f 74 20 61 20 73 75 63 63 65 73 73 66 75 6c 20  ot a successful 
201d0 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66 6f 75  match.** was fou
201e0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  nd..**.** Whethe
201f0 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74 63 68  r or not a match
20200 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c 49 54   is found, SQLIT
20210 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
20220 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20   if no error.** 
20230 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20 65 72  occurs. If an er
20240 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
20250 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
20260 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
20270 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e 64 20  e.** parser and 
20280 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 20  some error code 
20290 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
202a0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
202b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 74  /.static int wit
202c0 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c 6b 65  hExpand(.  Walke
202d0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20 20 73  r *pWalker, .  s
202e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
202f0 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20 20 50  em *pFrom.){.  P
20300 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
20310 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
20320 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20330 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 74  pParse->db;.  st
20340 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b 20  ruct Cte *pCte; 
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20360 20 4d 61 74 63 68 65 64 20 43 54 45 20 28 6f 72   Matched CTE (or
20370 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d 61 74 63   NULL if no matc
20380 68 29 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  h) */.  With *pW
20390 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
203a0 20 20 20 20 20 20 20 20 2f 2a 20 57 49 54 48 20          /* WITH 
203b0 63 6c 61 75 73 65 20 74 68 61 74 20 70 43 74 65  clause that pCte
203c0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
203d0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
203e0 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20 20 70  >pTab==0 );..  p
203f0 43 74 65 20 3d 20 73 65 61 72 63 68 57 69 74 68  Cte = searchWith
20400 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68 2c 20  (pParse->pWith, 
20410 70 46 72 6f 6d 2c 20 26 70 57 69 74 68 29 3b 0a  pFrom, &pWith);.
20420 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a 20 20    if( pCte ){.  
20430 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
20440 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
20450 69 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  ist;.    Select 
20460 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65 6c 65 63  *pSel;.    Selec
20470 74 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20 20  t *pLeft;       
20480 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
20490 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73 74 61  -most SELECT sta
204a0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e  tement */.    in
204b0 74 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 3b  t bMayRecursive;
204c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
204d0 72 75 65 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20  rue if compound 
204e0 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49 4f 4e 20  joined by UNION 
204f0 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20 57 69 74  [ALL] */.    Wit
20500 68 20 2a 70 53 61 76 65 64 57 69 74 68 3b 20 20  h *pSavedWith;  
20510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
20520 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  itial value of p
20530 50 61 72 73 65 2d 3e 70 57 69 74 68 20 2a 2f 0a  Parse->pWith */.
20540 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 74 65 2d  .    /* If pCte-
20550 3e 7a 45 72 72 20 69 73 20 6e 6f 6e 2d 4e 55 4c  >zErr is non-NUL
20560 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
20570 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 6e   then this is an
20580 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20 2a 2a 20   illegal.    ** 
20590 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
205a0 6e 63 65 20 74 6f 20 43 54 45 20 70 43 74 65 2e  nce to CTE pCte.
205b0 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
205c0 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
205d0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65 61 72 6c  turn.    ** earl
205e0 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72  y. If pCte->zErr
205f0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
20600 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 63  his is not a rec
20610 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
20620 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73  ..    ** In this
20630 20 63 61 73 65 2c 20 70 72 6f 63 65 65 64 2e 20   case, proceed. 
20640 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 74 65   */.    if( pCte
20650 2d 3e 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->zErr ){.      
20660 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20670 70 50 61 72 73 65 2c 20 70 43 74 65 2d 3e 7a 45  pParse, pCte->zE
20680 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  rr, pCte->zName)
20690 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
206a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
206b0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
206c0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
206d0 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61  ;.    pFrom->pTa
206e0 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69 74  b = pTab = sqlit
206f0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
20700 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
20710 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
20720 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
20730 41 62 6f 72 74 3b 0a 20 20 20 20 70 54 61 62 2d  Abort;.    pTab-
20740 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
20750 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
20760 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
20770 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
20780 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
20790 20 2d 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e   -1;.    pTab->n
207a0 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37 36  RowEst = 1048576
207b0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
207c0 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d  lags |= TF_Ephem
207d0 65 72 61 6c 3b 0a 20 20 20 20 70 46 72 6f 6d 2d  eral;.    pFrom-
207e0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
207f0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
20800 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  pCte->pSelect, 0
20810 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
20820 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
20830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
20840 4d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  M;.    assert( p
20850 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 29 3b  From->pSelect );
20860 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69  ..    /* Check i
20870 66 20 74 68 69 73 20 69 73 20 61 20 72 65 63 75  f this is a recu
20880 72 73 69 76 65 20 43 54 45 2e 20 2a 2f 0a 20 20  rsive CTE. */.  
20890 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e    pSel = pFrom->
208a0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 4d 61  pSelect;.    bMa
208b0 79 52 65 63 75 72 73 69 76 65 20 3d 20 28 20 70  yRecursive = ( p
208c0 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  Sel->op==TK_ALL 
208d0 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f  || pSel->op==TK_
208e0 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  UNION );.    if(
208f0 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 29   bMayRecursive )
20900 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
20910 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53       SrcList *pS
20920 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  rc = pFrom->pSel
20930 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20  ect->pSrc;.     
20940 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63   for(i=0; i<pSrc
20950 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
20960 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
20970 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
20980 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a   = &pSrc->a[i];.
20990 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
209a0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20  m->zDatabase==0 
209b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74  .         && pIt
209c0 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20 0a 20 20  em->zName!=0 .  
209d0 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
209e0 69 74 65 33 53 74 72 49 43 6d 70 28 70 49 74 65  ite3StrICmp(pIte
209f0 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74 65 2d 3e  m->zName, pCte->
20a00 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20  zName).         
20a10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
20a20 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  tem->pTab = pTab
20a30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
20a40 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 3d  m->isRecursive =
20a50 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54   1;.          pT
20a60 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  ab->nRef++;.    
20a70 20 20 20 20 20 20 70 53 65 6c 2d 3e 73 65 6c 46        pSel->selF
20a80 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 63 75 72  lags |= SF_Recur
20a90 73 69 76 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  sive;.        }.
20aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20ab0 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65 20 72     /* Only one r
20ac0 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e  ecursive referen
20ad0 63 65 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e  ce is permitted.
20ae0 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 70 54 61   */ .    if( pTa
20af0 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a 20 20 20  b->nRef>2 ){.   
20b00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20b10 73 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 50  sg(.          pP
20b20 61 72 73 65 2c 20 22 6d 75 6c 74 69 70 6c 65 20  arse, "multiple 
20b30 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 72 65  references to re
20b40 63 75 72 73 69 76 65 20 74 61 62 6c 65 3a 20 25  cursive table: %
20b50 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a  s", pCte->zName.
20b60 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
20b70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
20b80 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  OR;.    }.    as
20b90 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 52 65 66  sert( pTab->nRef
20ba0 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c 2d 3e 73  ==1 || ((pSel->s
20bb0 65 6c 46 6c 61 67 73 26 53 46 5f 52 65 63 75 72  elFlags&SF_Recur
20bc0 73 69 76 65 29 20 26 26 20 70 54 61 62 2d 3e 6e  sive) && pTab->n
20bd0 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20 20 20 20  Ref==2 ));..    
20be0 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 63 69  pCte->zErr = "ci
20bf0 72 63 75 6c 61 72 20 72 65 66 65 72 65 6e 63 65  rcular reference
20c00 3a 20 25 73 22 3b 0a 20 20 20 20 70 53 61 76 65  : %s";.    pSave
20c10 64 57 69 74 68 20 3d 20 70 50 61 72 73 65 2d 3e  dWith = pParse->
20c20 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73  pWith;.    pPars
20c30 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68  e->pWith = pWith
20c40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
20c50 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
20c60 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3f   bMayRecursive ?
20c70 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 3a 20   pSel->pPrior : 
20c80 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pSel);..    for(
20c90 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70 4c 65 66  pLeft=pSel; pLef
20ca0 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c 65 66 74  t->pPrior; pLeft
20cb0 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 29 3b  =pLeft->pPrior);
20cc0 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4c  .    pEList = pL
20cd0 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  eft->pEList;.   
20ce0 20 69 66 28 20 70 43 74 65 2d 3e 70 43 6f 6c 73   if( pCte->pCols
20cf0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
20d00 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 43 74  List->nExpr!=pCt
20d10 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 20  e->pCols->nExpr 
20d20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20d30 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20d40 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
20d50 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25   %d values for %
20d60 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20  d columns",.    
20d70 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e          pCte->zN
20d80 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ame, pEList->nEx
20d90 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr, pCte->pCols-
20da0 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29  >nExpr.        )
20db0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
20dc0 2d 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64  ->pWith = pSaved
20dd0 57 69 74 68 3b 0a 20 20 20 20 20 20 20 20 72 65  With;.        re
20de0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
20df0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
20e00 20 70 45 4c 69 73 74 20 3d 20 70 43 74 65 2d 3e   pEList = pCte->
20e10 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  pCols;.    }..  
20e20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46    selectColumnsF
20e30 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
20e40 73 65 2c 20 70 45 4c 69 73 74 2c 20 26 70 54 61  se, pEList, &pTa
20e50 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
20e60 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  aCol);.    if( b
20e70 4d 61 79 52 65 63 75 72 73 69 76 65 20 29 7b 0a  MayRecursive ){.
20e80 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 2d 3e        if( pSel->
20e90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
20ea0 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
20eb0 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20     pCte->zErr = 
20ec0 22 6d 75 6c 74 69 70 6c 65 20 72 65 63 75 72 73  "multiple recurs
20ed0 69 76 65 20 72 65 66 65 72 65 6e 63 65 73 3a 20  ive references: 
20ee0 25 73 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  %s";.      }else
20ef0 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e  {.        pCte->
20f00 7a 45 72 72 20 3d 20 22 72 65 63 75 72 73 69 76  zErr = "recursiv
20f10 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 61  e reference in a
20f20 20 73 75 62 71 75 65 72 79 3a 20 25 73 22 3b 0a   subquery: %s";.
20f30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
20f40 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
20f50 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a  pWalker, pSel);.
20f60 20 20 20 20 7d 0a 20 20 20 20 70 43 74 65 2d 3e      }.    pCte->
20f70 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 50  zErr = 0;.    pP
20f80 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53  arse->pWith = pS
20f90 61 76 65 64 57 69 74 68 3b 0a 20 20 7d 0a 0a 20  avedWith;.  }.. 
20fa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20fb0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
20fc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20fd0 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  _CTE./*.** If th
20fe0 65 20 53 45 4c 45 43 54 20 70 61 73 73 65 64 20  e SELECT passed 
20ff0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
21000 67 75 6d 65 6e 74 20 68 61 73 20 61 6e 20 61 73  gument has an as
21010 73 6f 63 69 61 74 65 64 20 57 49 54 48 20 0a 2a  sociated WITH .*
21020 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70 20 69 74  * clause, pop it
21030 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 20   from the stack 
21040 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
21050 66 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  f the Parse obje
21060 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ct..**.** This f
21070 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
21080 61 73 20 74 68 65 20 78 53 65 6c 65 63 74 43 61  as the xSelectCa
21090 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c 6c 62 61  llback2() callba
210a0 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69 74 65 33  ck by.** sqlite3
210b0 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77  SelectExpand() w
210c0 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61 20 53 45  hen walking a SE
210d0 4c 45 43 54 20 74 72 65 65 20 74 6f 20 72 65 73  LECT tree to res
210e0 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  olve table.** na
210f0 6d 65 73 20 61 6e 64 20 6f 74 68 65 72 20 46 52  mes and other FR
21100 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e  OM clause elemen
21110 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ts. .*/.static v
21120 6f 69 64 20 73 65 6c 65 63 74 50 6f 70 57 69 74  oid selectPopWit
21130 68 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  h(Walker *pWalke
21140 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
21150 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
21160 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
21170 3b 0a 20 20 69 66 28 20 70 2d 3e 70 57 69 74 68  ;.  if( p->pWith
21180 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
21190 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70  pParse->pWith==p
211a0 2d 3e 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70  ->pWith );.    p
211b0 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70  Parse->pWith = p
211c0 2d 3e 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 3b  ->pWith->pOuter;
211d0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
211e0 66 69 6e 65 20 73 65 6c 65 63 74 50 6f 70 57 69  fine selectPopWi
211f0 74 68 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  th 0.#endif../*.
21200 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21210 69 73 20 61 20 57 61 6c 6b 65 72 20 63 61 6c 6c  is a Walker call
21220 62 61 63 6b 20 66 6f 72 20 22 65 78 70 61 6e 64  back for "expand
21230 69 6e 67 22 20 61 20 53 45 4c 45 43 54 20 73 74  ing" a SELECT st
21240 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 22 45 78 70  atement..** "Exp
21250 61 6e 64 69 6e 67 22 20 6d 65 61 6e 73 20 74 6f  anding" means to
21260 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   do the followin
21270 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  g:.**.**    (1) 
21280 20 4d 61 6b 65 20 73 75 72 65 20 56 44 42 45 20   Make sure VDBE 
21290 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
212a0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
212b0 64 20 74 6f 20 65 76 65 72 79 0a 2a 2a 20 20 20  d to every.**   
212c0 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 20 6f 66        element of
212d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
212e0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
212f0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 54 61 62  Fill in the pTab
21300 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54 61 62 20 66  List->a[].pTab f
21310 69 65 6c 64 73 20 69 6e 20 74 68 65 20 53 72 63  ields in the Src
21320 4c 69 73 74 20 74 68 61 74 20 0a 2a 2a 20 20 20  List that .**   
21330 20 20 20 20 20 20 64 65 66 69 6e 65 73 20 46 52        defines FR
21340 4f 4d 20 63 6c 61 75 73 65 2e 20 20 57 68 65 6e  OM clause.  When
21350 20 76 69 65 77 73 20 61 70 70 65 61 72 20 69 6e   views appear in
21360 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
21370 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 69 6c  ,.**         fil
21380 6c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  l pTabList->a[].
21390 70 53 65 6c 65 63 74 20 77 69 74 68 20 61 20 63  pSelect with a c
213a0 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
213b0 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  T statement.**  
213c0 20 20 20 20 20 20 20 74 68 61 74 20 69 6d 70 6c         that impl
213d0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 2e  ements the view.
213e0 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 64 65    A copy is made
213f0 20 6f 66 20 74 68 65 20 76 69 65 77 27 73 20 53   of the view's S
21400 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  ELECT.**        
21410 20 73 74 61 74 65 6d 65 6e 74 20 73 6f 20 74 68   statement so th
21420 61 74 20 77 65 20 63 61 6e 20 66 72 65 65 6c 79  at we can freely
21430 20 6d 6f 64 69 66 79 20 6f 72 20 64 65 6c 65 74   modify or delet
21440 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
21450 0a 2a 2a 20 20 20 20 20 20 20 20 20 77 69 74 68  .**         with
21460 6f 75 74 20 77 6f 72 72 79 69 6e 67 20 61 62 6f  out worrying abo
21470 75 74 20 6d 65 73 73 69 6e 67 20 75 70 20 74 68  ut messing up th
21480 65 20 70 72 65 73 69 73 74 65 6e 74 20 72 65 70  e presistent rep
21490 72 65 73 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 20  resentation.**  
214a0 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 76 69         of the vi
214b0 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 33 29  ew..**.**    (3)
214c0 20 20 41 64 64 20 74 65 72 6d 73 20 74 6f 20 74    Add terms to t
214d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
214e0 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 74 68  to accomodate th
214f0 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f 72  e NATURAL keywor
21500 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 6e 20  d.**         on 
21510 6a 6f 69 6e 73 20 61 6e 64 20 74 68 65 20 4f 4e  joins and the ON
21520 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
21530 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a  e of joins..**.*
21540 2a 20 20 20 20 28 34 29 20 20 53 63 61 6e 20 74  *    (4)  Scan t
21550 68 65 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  he list of colum
21560 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
21570 20 73 65 74 20 28 70 45 4c 69 73 74 29 20 6c 6f   set (pEList) lo
21580 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  oking.**        
21590 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f   for instances o
215a0 66 20 74 68 65 20 22 2a 22 20 6f 70 65 72 61 74  f the "*" operat
215b0 6f 72 20 6f 72 20 74 68 65 20 54 41 42 4c 45 2e  or or the TABLE.
215c0 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 20 20  * operator..**  
215d0 20 20 20 20 20 20 20 49 66 20 66 6f 75 6e 64 2c         If found,
215e0 20 65 78 70 61 6e 64 20 65 61 63 68 20 22 2a 22   expand each "*"
215f0 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c   to be every col
21600 75 6d 6e 20 69 6e 20 65 76 65 72 79 20 74 61 62  umn in every tab
21610 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 6e  le.**         an
21620 64 20 54 41 42 4c 45 2e 2a 20 74 6f 20 62 65 20  d TABLE.* to be 
21630 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  every column in 
21640 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61  TABLE..**.*/.sta
21650 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 45 78  tic int selectEx
21660 70 61 6e 64 65 72 28 57 61 6c 6b 65 72 20 2a 70  pander(Walker *p
21670 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
21680 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
21690 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70  rse = pWalker->p
216a0 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Parse;.  int i, 
216b0 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c 69 73 74 20  j, k;.  SrcList 
216c0 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 45 78 70  *pTabList;.  Exp
216d0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
216e0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
216f0 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a 20 20 73  item *pFrom;.  s
21700 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
21710 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20  rse->db;.  Expr 
21720 2a 70 45 2c 20 2a 70 52 69 67 68 74 2c 20 2a 70  *pE, *pRight, *p
21730 45 78 70 72 3b 0a 20 20 75 31 36 20 73 65 6c 46  Expr;.  u16 selF
21740 6c 61 67 73 20 3d 20 70 2d 3e 73 65 6c 46 6c 61  lags = p->selFla
21750 67 73 3b 0a 0a 20 20 70 2d 3e 73 65 6c 46 6c 61  gs;..  p->selFla
21760 67 73 20 7c 3d 20 53 46 5f 45 78 70 61 6e 64 65  gs |= SF_Expande
21770 64 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  d;.  if( db->mal
21780 6c 6f 63 46 61 69 6c 65 64 20 20 29 7b 0a 20 20  locFailed  ){.  
21790 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
217a0 72 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45  rt;.  }.  if( NE
217b0 56 45 52 28 70 2d 3e 70 53 72 63 3d 3d 30 29 20  VER(p->pSrc==0) 
217c0 7c 7c 20 28 73 65 6c 46 6c 61 67 73 20 26 20 53  || (selFlags & S
217d0 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
217e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
217f0 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 54  _Prune;.  }.  pT
21800 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
21810 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
21820 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  pEList;.  sqlite
21830 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73 65  3WithPush(pParse
21840 2c 20 70 2d 3e 70 57 69 74 68 2c 20 30 29 3b 0a  , p->pWith, 0);.
21850 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
21860 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
21870 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
21880 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
21890 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
218a0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
218b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
218c0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
218d0 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
218e0 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
218f0 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
21900 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
21910 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
21920 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
21930 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
21940 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
21950 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
21960 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
21970 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
21980 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
21990 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
219a0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
219b0 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
219c0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
219d0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
219e0 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
219f0 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
21a00 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
21a10 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
21a20 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Tab;.    assert(
21a30 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73   pFrom->isRecurs
21a40 69 76 65 3d 3d 30 20 7c 7c 20 70 46 72 6f 6d 2d  ive==0 || pFrom-
21a50 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 69 66 28  >pTab );.    if(
21a60 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63 75 72 73   pFrom->isRecurs
21a70 69 76 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ive ) continue;.
21a80 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70      if( pFrom->p
21a90 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab!=0 ){.      
21aa0 2f 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  /* This statemen
21ab0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
21ac0 65 6e 20 70 72 65 70 61 72 65 64 2e 20 20 54 68  en prepared.  Th
21ad0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20  ere is no need. 
21ae0 20 20 20 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75       ** to go fu
21af0 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  rther. */.      
21b00 61 73 73 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a  assert( i==0 );.
21b10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21b20 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 73 65  MIT_CTE.      se
21b30 6c 65 63 74 50 6f 70 57 69 74 68 28 70 57 61 6c  lectPopWith(pWal
21b40 6b 65 72 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a  ker, p);.#endif.
21b50 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
21b60 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69  _Prune;.    }.#i
21b70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21b80 54 5f 43 54 45 0a 20 20 20 20 69 66 28 20 77 69  T_CTE.    if( wi
21b90 74 68 45 78 70 61 6e 64 28 70 57 61 6c 6b 65 72  thExpand(pWalker
21ba0 2c 20 70 46 72 6f 6d 29 20 29 20 72 65 74 75 72  , pFrom) ) retur
21bb0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
21bc0 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
21bd0 20 29 20 7b 7d 20 65 6c 73 65 0a 23 65 6e 64 69   ) {} else.#endi
21be0 66 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  f.    if( pFrom-
21bf0 3e 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 23 69 66  >zName==0 ){.#if
21c00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21c10 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 20 20  _SUBQUERY.      
21c20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70  Select *pSel = p
21c30 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
21c40 20 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75       /* A sub-qu
21c50 65 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ery in the FROM 
21c60 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
21c70 43 54 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  CT */.      asse
21c80 72 74 28 20 70 53 65 6c 21 3d 30 20 29 3b 0a 20  rt( pSel!=0 );. 
21c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72       assert( pFr
21ca0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20  om->pTab==0 );. 
21cb0 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
21cc0 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20  Select(pWalker, 
21cd0 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 70 46 72  pSel);.      pFr
21ce0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
21cf0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
21d00 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
21d10 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20  (Table));.      
21d20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65  if( pTab==0 ) re
21d30 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
21d40 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
21d50 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 61 62   = 1;.      pTab
21d60 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
21d70 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71  3MPrintf(db, "sq
21d80 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20 28 76 6f  lite_sq_%p", (vo
21d90 69 64 2a 29 70 54 61 62 29 3b 0a 20 20 20 20 20  id*)pTab);.     
21da0 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50   while( pSel->pP
21db0 72 69 6f 72 20 29 7b 20 70 53 65 6c 20 3d 20 70  rior ){ pSel = p
21dc0 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20 7d 0a 20  Sel->pPrior; }. 
21dd0 20 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d       selectColum
21de0 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
21df0 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 45 4c  Parse, pSel->pEL
21e00 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
21e10 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
21e20 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
21e30 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
21e40 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30  ab->nRowEst = 10
21e50 34 38 35 37 36 3b 0a 20 20 20 20 20 20 70 54 61  48576;.      pTa
21e60 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
21e70 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e  F_Ephemeral;.#en
21e80 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
21e90 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
21ea0 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
21eb0 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
21ec0 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
21ed0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
21ee0 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
21ef0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
21f00 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
21f10 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
21f20 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
21f30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
21f40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
21f50 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
21f60 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78  ( pTab->nRef==0x
21f70 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
21f80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
21f90 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
21fa0 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
21fb0 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
21fc0 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
21fd0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
21fe0 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
21ff0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
22000 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
22020 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
22030 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
22040 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
22050 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
22060 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
22070 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
22080 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
22090 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
220a0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
220b0 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
220c0 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
220d0 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
220e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
220f0 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
22100 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
22110 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
22120 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
22130 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
22140 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
22150 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
22160 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
22170 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
22180 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
22190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
221a0 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
221b0 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
221c0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
221d0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
221e0 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
221f0 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
22200 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
22210 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
22220 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
22230 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
22240 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
22250 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
22260 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
22270 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
22280 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
22290 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
222a0 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
222b0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
222c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
222d0 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
222e0 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
222f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
22300 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
22310 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
22320 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
22330 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
22340 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
22350 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
22360 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
22370 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
22380 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
22390 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
223a0 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
223b0 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
223c0 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
223d0 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
223e0 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
223f0 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
22400 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
22410 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
22420 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
22430 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
22440 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
22450 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
22460 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
22470 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
22480 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
22490 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
224a0 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
224b0 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
224c0 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
224d0 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
224e0 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
224f0 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
22500 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
22510 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
22520 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
22530 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
22540 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73  {.    pE = pELis
22550 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
22560 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
22570 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
22580 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
22590 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
225a0 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
225b0 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
225c0 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
225d0 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
225e0 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
225f0 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
22600 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
22610 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
22620 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
22630 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69    }.  if( k<pELi
22640 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
22650 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
22660 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
22670 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
22680 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
22690 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
226a0 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
226b0 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
226c0 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
226d0 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
226e0 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
226f0 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
22700 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
22710 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
22720 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
22730 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
22740 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
22750 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
22760 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
22770 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
22780 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
22790 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
227a0 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
227b0 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20  ames)!=0.       
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
227d0 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
227e0 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
227f0 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  ==0;..    /* Whe
22800 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f  n processing FRO
22810 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
22820 69 65 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79  ies, it is alway
22830 73 20 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a  s the case.    *
22840 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75  * that full_colu
22850 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64  mn_names=OFF and
22860 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61   short_column_na
22870 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20  mes=ON.  The.   
22880 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c   ** sqlite3Resul
22890 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72  tSetOfSelect() r
228a0 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20  outine makes it 
228b0 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  so. */.    asser
228c0 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
228d0 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
228e0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
228f0 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54   ((flags & SQLIT
22900 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d  E_FullColNames)=
22910 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
22920 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c      (flags & SQL
22930 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
22940 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66  s)!=0) );..    f
22950 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
22960 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
22970 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70       pE = a[k].p
22980 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67  Expr;.      pRig
22990 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
229a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
229b0 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
229c0 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
229d0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
229e0 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f  TK_ALL && (pE->o
229f0 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
22a00 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
22a10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
22a20 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
22a30 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
22a40 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
22a50 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
22a60 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
22a70 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
22a80 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
22a90 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
22aa0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
22ab0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
22ac0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
22ad0 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
22ae0 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
22af0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
22b00 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70  ew->nExpr-1].zSp
22b10 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b  an = a[k].zSpan;
22b20 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
22b30 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
22b40 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20       a[k].zSpan 
22b50 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
22b60 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
22b70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 0;.      }el
22b80 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
22b90 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
22ba0 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
22bb0 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
22bc0 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
22bd0 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
22be0 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
22bf0 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
22c00 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
22c10 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
22c20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
22c30 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  TName = 0;      
22c40 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
22c50 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
22c60 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
22c70 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
22c80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
22c90 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
22ca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
22cb0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
22cc0 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e  pE->pLeft, EP_In
22cd0 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
22ce0 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45       zTName = pE
22cf0 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
22d00 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
22d10 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
22d20 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
22d30 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
22d40 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
22d50 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
22d60 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
22d70 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
22d80 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
22d90 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
22da0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
22db0 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
22dc0 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
22dd0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
22de0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b  zSchemaName = 0;
22df0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
22e00 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  Db;.          if
22e10 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b  ( zTabName==0 ){
22e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
22e30 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
22e40 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
22e50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
22e60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
22e70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
22e80 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
22e90 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  | (pSub->selFlag
22ea0 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
22eb0 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
22ec0 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20       pSub = 0;. 
22ed0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
22ee0 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
22ef0 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
22f00 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
22f20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
22f30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22f40 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
22f50 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
22f60 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
22f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63  .            zSc
22f80 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d  hemaName = iDb>=
22f90 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  0 ? db->aDb[iDb]
22fa0 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20  .zName : "*";.  
22fb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22fc0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
22fd0 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
22fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
22ff0 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
23000 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
23010 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
23020 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20   *zColname;  /* 
23030 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c  The computed col
23040 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
23050 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
23060 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c  oFree;   /* Mall
23070 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74  oced string that
23080 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
23090 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
230a0 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65    Token sColname
230b0 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63  ;  /* Computed c
230c0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20  olumn name as a 
230d0 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  token */..      
230e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e        assert( zN
230f0 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ame );.         
23100 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
23110 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20   pSub.          
23120 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74     && sqlite3Mat
23130 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d  chSpanName(pSub-
23140 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
23150 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20  pan, 0, zTName, 
23160 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  0)==0.          
23170 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
23180 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
23190 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
231a0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
231b0 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64  column is marked
231c0 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75   as 'hidden' (cu
231d0 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73  rrently only pos
231e0 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  sible.          
231f0 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c    ** for virtual
23200 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74   tables), do not
23210 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74   include it in t
23220 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20  he expanded.    
23230 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c          ** resul
23240 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20  t-set list..    
23250 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
23260 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64         if( IsHid
23270 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d  denColumn(&pTab-
23280 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20  >aCol[j]) ){.   
23290 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
232a0 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  t(IsVirtual(pTab
232b0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
232c0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
232d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
232e0 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
232f0 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
23300 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
23310 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
23320 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
23330 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  om->jointype & J
23340 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20  T_NATURAL)!=0.  
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
23360 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
23370 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69  ndex(pTabList, i
23380 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20  , zName, 0, 0). 
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
233a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233b0 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
233c0 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
233d0 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
233e0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
233f0 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74        ** table t
23400 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74  o the right of t
23410 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20  he join */.     
23420 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
23430 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
23440 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23450 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
23460 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d  ListIndex(pFrom-
23470 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
23480 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
23490 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
234a0 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
234b0 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
234c0 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
234d0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
234e0 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
234f0 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
23500 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
23510 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
23520 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
23530 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23540 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23550 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
23560 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
23570 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
23580 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a      zColname = z
23590 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
235a0 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20    zToFree = 0;. 
235b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
235c0 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
235d0 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
235e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
235f0 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr *pLeft;.     
23600 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
23610 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
23620 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65   TK_ID, zTabName
23630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
23640 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
23650 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
23660 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
23670 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
23680 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65         if( zSche
23690 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  maName ){.      
236a0 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
236b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
236c0 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61  , TK_ID, zSchema
236d0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
236e0 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
236f0 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
23700 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
23710 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  t, pExpr, 0);.  
23720 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23730 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23740 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
23760 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
23770 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
23780 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
23790 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
237a0 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
237b0 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
237c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
237d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
237e0 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
237f0 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
23800 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23810 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
23820 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
23830 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
23840 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
23850 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d      sColname.z =
23860 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
23870 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
23880 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
23890 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  n30(zColname);. 
238a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
238b0 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
238c0 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  e(pParse, pNew, 
238d0 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20  &sColname, 0);. 
238e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
238f0 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  New && (p->selFl
23900 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
23910 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
23920 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
23930 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
23940 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65  X = &pNew->a[pNe
23950 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  w->nExpr-1];.   
23960 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
23970 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
23980 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
23990 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
239a0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  up(db, pSub->pEL
239b0 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29  ist->a[j].zSpan)
239c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
239d0 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
239e0 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
239f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
23a00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23a10 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
23a20 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
23a30 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20  "%s.%s.%s",.    
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a60 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
23a70 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43  me, zTabName, zC
23a80 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
23a90 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
23aa0 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
23ab0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
23ac0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
23ad0 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20   pX->bSpanIsTab 
23ae0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
23af0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
23b00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23b10 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
23b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
23b30 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
23b40 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
23b50 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
23b60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
23b70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
23b80 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
23b90 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
23ba0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
23bb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23bc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23bd0 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
23be0 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
23bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23c00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
23c10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23c20 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
23c30 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
23c40 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
23c50 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
23c60 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
23c70 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
23c80 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
23c90 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
23ca0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
23cb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
23cc0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
23cd0 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
23ce0 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
23cf0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
23d00 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23d10 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f  nue;.}../*.** No
23d20 2d 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  -op routine for 
23d30 74 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77  the parse-tree w
23d40 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  alker..**.** Whe
23d50 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
23d60 73 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78  s the Walker.xEx
23d70 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
23d80 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
23d90 0a 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77  .** are walked w
23da0 69 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f  ithout any actio
23db0 6e 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61  ns being taken a
23dc0 74 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72  t each node.  Pr
23dd0 65 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65  esumably,.** whe
23de0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
23df0 73 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65  s used for Walke
23e00 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
23e10 74 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e  then .** Walker.
23e20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
23e30 69 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d  is set to do som
23e40 65 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f  ething useful fo
23e50 72 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71  r every .** subq
23e60 75 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73  uery in the pars
23e70 65 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  er tree..*/.stat
23e80 69 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e  ic int exprWalkN
23e90 6f 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55  oop(Walker *NotU
23ea0 73 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73  sed, Expr *NotUs
23eb0 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
23ec0 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
23ed0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
23ee0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
23ef0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nue;.}../*.** Th
23f00 69 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61  is routine "expa
23f10 6e 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74  nds" a SELECT st
23f20 61 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20  atement and all 
23f30 6f 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65  of its subquerie
23f40 73 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69  s..** For additi
23f50 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
23f60 20 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e   on what it mean
23f70 73 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20  s to "expand" a 
23f80 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
23f90 65 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d  ent, see the com
23fa0 6d 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65  ment on the sele
23fb0 63 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20  ctExpand worker 
23fc0 63 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a  callback above..
23fd0 2a 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20  **.** Expanding 
23fe0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
23ff0 6e 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20  nt is the first 
24000 73 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69  step in processi
24010 6e 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  ng a.** SELECT s
24020 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53  tatement.  The S
24030 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
24040 6d 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64  must be expanded
24050 20 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20   before.** name 
24060 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65  resolution is pe
24070 72 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  rformed..**.** I
24080 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
24090 77 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20  wrong, an error 
240a0 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
240b0 65 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a  en into pParse..
240c0 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
240d0 75 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65  unction can dete
240e0 63 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62  ct the problem b
240f0 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61  y looking at pPa
24100 72 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64  rse->nErr.** and
24110 2f 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  /or pParse->db->
24120 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f  mallocFailed..*/
24130 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
24140 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
24150 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
24160 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
24170 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20  {.  Walker w;.  
24180 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69  memset(&w, 0, si
24190 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45  zeof(w));.  w.xE
241a0 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
241b0 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
241c0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
241d0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68  .  if( pParse->h
241e0 61 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20  asCompound ){.  
241f0 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
24200 61 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d  ack = convertCom
24210 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62  poundSelectToSub
24220 71 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74  query;.    sqlit
24230 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
24240 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20   pSelect);.  }. 
24250 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
24260 63 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e  ck = selectExpan
24270 64 65 72 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  der;.  w.xSelect
24280 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65  Callback2 = sele
24290 63 74 50 6f 70 57 69 74 68 3b 0a 20 20 73 71 6c  ctPopWith;.  sql
242a0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
242b0 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a  w, pSelect);.}..
242c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
242d0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
242e0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 57 61  .** This is a Wa
242f0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
24300 62 61 63 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f  back callback fo
24310 72 20 74 68 65 20 73 71 6c 69 74 65 33 53 65 6c  r the sqlite3Sel
24320 65 63 74 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a  ectTypeInfo().**
24330 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a   interface..**.*
24340 2a 20 46 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d  * For each FROM-
24350 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 79 2c  clause subquery,
24360 20 61 64 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70   add Column.zTyp
24370 65 20 61 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  e and Column.zCo
24380 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ll.** informatio
24390 6e 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73  n to the Table s
243a0 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65  tructure that re
243b0 70 72 65 73 65 6e 74 73 20 74 68 65 20 72 65 73  presents the res
243c0 75 6c 74 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68  ult set.** of th
243d0 61 74 20 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a  at subquery..**.
243e0 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
243f0 75 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72  ucture that repr
24400 65 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c  esents the resul
24410 74 20 73 65 74 20 77 61 73 20 63 6f 6e 73 74 72  t set was constr
24420 75 63 74 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65  ucted.** by sele
24430 63 74 45 78 70 61 6e 64 65 72 28 29 20 62 75 74  ctExpander() but
24440 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 63 6f   the type and co
24450 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
24460 69 6f 6e 20 77 61 73 20 6f 6d 69 74 74 65 64 0a  ion was omitted.
24470 2a 2a 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ** at that point
24480 20 62 65 63 61 75 73 65 20 69 64 65 6e 74 69 66   because identif
24490 69 65 72 73 20 68 61 64 20 6e 6f 74 20 79 65 74  iers had not yet
244a0 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
244b0 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
244c0 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
244d0 20 69 64 65 6e 74 69 66 69 65 72 20 72 65 73 6f   identifier reso
244e0 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  lution..*/.stati
244f0 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
24500 53 75 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f  SubqueryTypeInfo
24510 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
24520 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
24530 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
24540 20 69 6e 74 20 69 3b 0a 20 20 53 72 63 4c 69 73   int i;.  SrcLis
24550 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  t *pTabList;.  s
24560 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
24570 65 6d 20 2a 70 46 72 6f 6d 3b 0a 0a 20 20 61 73  em *pFrom;..  as
24580 73 65 72 74 28 20 70 2d 3e 73 65 6c 46 6c 61 67  sert( p->selFlag
24590 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
245a0 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  );.  if( (p->sel
245b0 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79  Flags & SF_HasTy
245c0 70 65 49 6e 66 6f 29 3d 3d 30 20 29 7b 0a 20 20  peInfo)==0 ){.  
245d0 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
245e0 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 3b   SF_HasTypeInfo;
245f0 0a 20 20 20 20 70 50 61 72 73 65 20 3d 20 70 57  .    pParse = pW
24600 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
24610 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
24620 3e 70 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69  >pSrc;.    for(i
24630 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
24640 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
24650 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
24660 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61  rom++){.      Ta
24670 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
24680 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 69  m->pTab;.      i
24690 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 21 3d  f( ALWAYS(pTab!=
246a0 30 29 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62  0) && (pTab->tab
246b0 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
246c0 65 72 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  eral)!=0 ){.    
246d0 20 20 20 20 2f 2a 20 41 20 73 75 62 2d 71 75 65      /* A sub-que
246e0 72 79 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ry in the FROM c
246f0 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
24700 54 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 65 6c  T */.        Sel
24710 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f  ect *pSel = pFro
24720 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
24730 20 20 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a      if( pSel ){.
24740 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
24750 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20   pSel->pPrior ) 
24760 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72  pSel = pSel->pPr
24770 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ior;.          s
24780 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
24790 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70  peAndCollation(p
247a0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65  Parse, pTab, pSe
247b0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
247c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
247d0 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
247e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
247f0 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20  ds datatype and 
24800 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
24810 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ce information t
24820 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73  o.** the Table s
24830 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c  tructures of all
24840 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
24850 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20  queries in a.** 
24860 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24870 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73  ..**.** Use this
24880 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e   routine after n
24890 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ame resolution..
248a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
248b0 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
248c0 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  ypeInfo(Parse *p
248d0 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
248e0 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66  Select){.#ifndef
248f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
24900 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77  QUERY.  Walker w
24910 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
24920 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
24930 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
24940 6b 32 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75  k2 = selectAddSu
24950 62 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a  bqueryTypeInfo;.
24960 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
24970 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
24980 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
24990 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33  Parse;.  sqlite3
249a0 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
249b0 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64 69 66 0a  Select);.#endif.
249c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
249d0 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
249e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
249f0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
24a00 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  .  The.** follow
24a10 69 6e 67 20 69 73 20 61 63 63 6f 6d 70 6c 69 73  ing is accomplis
24a20 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  hed:.**.**     *
24a30 20 20 56 44 42 45 20 43 75 72 73 6f 72 20 6e 75    VDBE Cursor nu
24a40 6d 62 65 72 73 20 61 72 65 20 61 73 73 69 67 6e  mbers are assign
24a50 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f 4d 2d 63  ed to all FROM-c
24a60 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  lause terms..** 
24a70 20 20 20 20 2a 20 20 45 70 68 65 6d 65 72 61 6c      *  Ephemeral
24a80 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 61   Table objects a
24a90 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
24aa0 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ll FROM-clause s
24ab0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 20 20  ubqueries..**   
24ac0 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55 53 49 4e    *  ON and USIN
24ad0 47 20 63 6c 61 75 73 65 73 20 61 72 65 20 73 68  G clauses are sh
24ae0 69 66 74 65 64 20 69 6e 74 6f 20 57 48 45 52 45  ifted into WHERE
24af0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 20   statements.**  
24b00 20 20 20 2a 20 20 57 69 6c 64 63 61 72 64 73 20     *  Wildcards 
24b10 22 2a 22 20 61 6e 64 20 22 54 41 42 4c 45 2e 2a  "*" and "TABLE.*
24b20 22 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 73  " in result sets
24b30 20 61 72 65 20 65 78 70 61 6e 64 65 64 2e 0a 2a   are expanded..*
24b40 2a 20 20 20 20 20 2a 20 20 49 64 65 6e 74 69 66  *     *  Identif
24b50 69 65 72 73 20 69 6e 20 65 78 70 72 65 73 73 69  iers in expressi
24b60 6f 6e 20 61 72 65 20 6d 61 74 63 68 65 64 20 74  on are matched t
24b70 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  o tables..**.** 
24b80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74  This routine act
24b90 73 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e  s recursively on
24ba0 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 20   all subqueries 
24bb0 77 69 74 68 69 6e 20 74 68 65 20 53 45 4c 45 43  within the SELEC
24bc0 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
24bd0 65 33 53 65 6c 65 63 74 50 72 65 70 28 0a 20 20  e3SelectPrep(.  
24be0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
24bf0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
24c00 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
24c10 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
24c20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24c30 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
24c40 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
24c50 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
24c60 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
24c70 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 63 6f  e context for co
24c80 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b 0a 20 20  ntainer */.){.  
24c90 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
24ca0 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
24cb0 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20   return;.  db = 
24cc0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
24cd0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
24ce0 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
24cf0 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
24d00 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 20   SF_HasTypeInfo 
24d10 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
24d20 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
24d30 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 69 66  pParse, p);.  if
24d40 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
24d50 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
24d60 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  ed ) return;.  s
24d70 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
24d80 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
24d90 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
24da0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
24db0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
24dc0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
24dd0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 41    sqlite3SelectA
24de0 64 64 54 79 70 65 49 6e 66 6f 28 70 50 61 72 73  ddTypeInfo(pPars
24df0 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e, p);.}../*.** 
24e00 52 65 73 65 74 20 74 68 65 20 61 67 67 72 65 67  Reset the aggreg
24e10 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 2e  ate accumulator.
24e20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67 67 72 65  .**.** The aggre
24e30 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
24e40 20 69 73 20 61 20 73 65 74 20 6f 66 20 6d 65 6d   is a set of mem
24e50 6f 72 79 20 63 65 6c 6c 73 20 74 68 61 74 20 68  ory cells that h
24e60 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d 65 64 69  old.** intermedi
24e70 61 74 65 20 72 65 73 75 6c 74 73 20 77 68 69 6c  ate results whil
24e80 65 20 63 61 6c 63 75 6c 61 74 69 6e 67 20 61 6e  e calculating an
24e90 20 61 67 67 72 65 67 61 74 65 2e 20 20 54 68 69   aggregate.  Thi
24ea0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  s.** routine gen
24eb0 65 72 61 74 65 73 20 63 6f 64 65 20 74 68 61 74  erates code that
24ec0 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73 20 69 6e   stores NULLs in
24ed0 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65 20 6d 65   all of those me
24ee0 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73 2e 0a 2a  mory.** cells..*
24ef0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
24f00 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 50  setAccumulator(P
24f10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
24f20 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
24f30 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
24f40 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
24f50 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
24f60 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 75  ggInfo_func *pFu
24f70 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65 67 20 3d  nc;.  int nReg =
24f80 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63   pAggInfo->nFunc
24f90 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f   + pAggInfo->nCo
24fa0 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e 52 65 67  lumn;.  if( nReg
24fb0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
24fc0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
24fd0 47 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  G.  /* Verify th
24fe0 61 74 20 61 6c 6c 20 41 67 67 49 6e 66 6f 20 72  at all AggInfo r
24ff0 65 67 69 73 74 65 72 73 20 61 72 65 20 77 69 74  egisters are wit
25000 68 69 6e 20 74 68 65 20 72 61 6e 67 65 20 73 70  hin the range sp
25010 65 63 69 66 69 65 64 20 62 79 0a 20 20 2a 2a 20  ecified by.  ** 
25020 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 2e 2e 41  AggInfo.mnReg..A
25030 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 2a 2f 0a  ggInfo.mxReg */.
25040 20 20 61 73 73 65 72 74 28 20 6e 52 65 67 3d 3d    assert( nReg==
25050 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 2d  pAggInfo->mxReg-
25060 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2b  pAggInfo->mnReg+
25070 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1 );.  for(i=0; 
25080 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  i<pAggInfo->nCol
25090 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  umn; i++){.    a
250a0 73 73 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d  ssert( pAggInfo-
250b0 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3e 3d 70  >aCol[i].iMem>=p
250c0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20  AggInfo->mnReg. 
250d0 20 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49          && pAggI
250e0 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65  nfo->aCol[i].iMe
250f0 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
25100 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  eg );.  }.  for(
25110 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
25120 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  >nFunc; i++){.  
25130 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
25140 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
25150 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  m>=pAggInfo->mnR
25160 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  eg.         && p
25170 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
25180 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
25190 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 23  ->mxReg );.  }.#
251a0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56  endif.  sqlite3V
251b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
251c0 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67 49 6e 66  Null, 0, pAggInf
251d0 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67 67 49 6e  o->mnReg, pAggIn
251e0 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20 20 66 6f  fo->mxReg);.  fo
251f0 72 28 70 46 75 6e 63 3d 70 41 67 67 49 6e 66 6f  r(pFunc=pAggInfo
25200 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b 20 69 3c  ->aFunc, i=0; i<
25210 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
25220 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b 29 7b 0a   i++, pFunc++){.
25230 20 20 20 20 69 66 28 20 70 46 75 6e 63 2d 3e 69      if( pFunc->i
25240 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20  Distinct>=0 ){. 
25250 20 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20       Expr *pE = 
25260 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b 0a 20 20  pFunc->pExpr;.  
25270 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
25280 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
25290 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
252a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e  ;.      if( pE->
252b0 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 45  x.pList==0 || pE
252c0 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ->x.pList->nExpr
252d0 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
252e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
252f0 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43 54  Parse, "DISTINCT
25300 20 61 67 67 72 65 67 61 74 65 73 20 6d 75 73 74   aggregates must
25310 20 68 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e   have exactly on
25320 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  e ".           "
25330 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 20 20  argument");.    
25340 20 20 20 20 70 46 75 6e 63 2d 3e 69 44 69 73 74      pFunc->iDist
25350 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20  inct = -1;.     
25360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
25370 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
25380 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  o = keyInfoFromE
25390 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
253a0 70 45 2d 3e 78 2e 70 4c 69 73 74 2c 20 30 29 3b  pE->x.pList, 0);
253b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
253c0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
253d0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
253e0 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
253f0 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
25420 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
25430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25440 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
25450 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
25460 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
25470 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
25480 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
25490 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
254a0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
254b0 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
254c0 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
254d0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
254e0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
254f0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
25500 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
25510 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
25520 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
25530 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
25540 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
25550 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
25560 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
25570 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
25580 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
25590 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
255a0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
255b0 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
255c0 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
255d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
255e0 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
255f0 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
25600 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
25610 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25630 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
25640 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
25650 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
25660 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
25670 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
25680 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
25690 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
256a0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
256b0 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
256c0 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
256d0 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
256e0 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
256f0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
25700 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
25710 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
25720 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
25730 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
25740 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
25750 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
25760 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
25770 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
25780 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
25790 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
257a0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
257b0 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
257c0 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
257d0 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
257e0 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
257f0 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
25800 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
25810 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
25820 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
25830 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
25840 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
25850 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
25860 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
25870 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
25880 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
25890 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
258a0 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
258b0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
258c0 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
258d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
258e0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
258f0 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
25900 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  Agg, SQLITE_ECEL
25910 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
25920 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
25930 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
25940 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
25950 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
25960 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
25970 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
25980 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
25990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
259a0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
259b0 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
259c0 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
259d0 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
259e0 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
259f0 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
25a00 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
25a10 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
25a20 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
25a30 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
25a40 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
25a50 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
25a60 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
25a70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
25a80 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
25a90 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
25aa0 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
25ab0 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
25ac0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
25ad0 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
25ae0 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
25af0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
25b00 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
25b10 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
25b20 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
25b30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25b40 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
25b50 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
25b60 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
25b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25b80 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
25b90 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
25ba0 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
25bb0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
25bc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
25bd0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
25be0 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
25bf0 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
25c00 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
25c10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
25c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
25c30 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
25c40 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
25c50 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
25c60 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
25c70 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
25c80 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
25c90 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
25ca0 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
25cb0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
25cc0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
25cd0 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
25ce0 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
25cf0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
25d00 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
25d10 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
25d20 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
25d30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
25d40 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
25d50 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
25d60 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
25d70 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
25d80 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
25d90 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
25da0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
25db0 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
25dc0 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
25dd0 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
25de0 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
25df0 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
25e00 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
25e10 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
25e20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
25e30 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
25e40 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
25e50 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
25e60 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
25e70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
25e80 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
25e90 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
25ea0 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
25eb0 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
25ec0 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
25ed0 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
25ee0 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
25ef0 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
25f00 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
25f10 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
25f20 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
25f30 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
25f40 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
25f50 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
25f60 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
25f70 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
25f80 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
25f90 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
25fa0 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
25fb0 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
25fc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
25fd0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
25fe0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
25ff0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
26000 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
26010 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
26020 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
26030 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
26040 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
26050 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
26060 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
26070 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
26080 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
26090 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
260a0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
260b0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
260c0 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
260d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
260e0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
260f0 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
26100 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
26110 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
26120 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
26130 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
26140 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
26150 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
26160 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
26170 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
26180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26190 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
261a0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
261b0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
261c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
261d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
261e0 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
261f0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
26200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26210 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
26220 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
26230 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26250 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
26260 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
26270 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
26280 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
26290 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
262a0 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
262b0 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
262c0 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
262d0 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
262e0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
262f0 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f   .        pIdx ?
26300 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
26310 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
26320 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 70          pIdx ? p
26330 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
26340 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
26350 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
26360 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
26370 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  dbe, OP_Explain,
26380 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
26390 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20  Id, 0, 0, zEqp, 
263a0 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29  P4_DYNAMIC.    )
263b0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
263c0 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69  define explainSi
263d0 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29  mpleCount(a,b,c)
263e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
263f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
26400 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
26410 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
26420 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
26430 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
26440 74 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  ts are returned 
26450 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
26460 20 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75   SelectDest stru
26470 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  cture..** See co
26480 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c 69 74 65  mments in sqlite
26490 49 6e 74 2e 68 20 66 6f 72 20 66 75 72 74 68 65  Int.h for furthe
264a0 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  r information..*
264b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
264c0 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  e returns the nu
264d0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
264e0 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
264f0 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  re.** encountere
26500 64 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f  d, then an appro
26510 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
26520 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a  sage is left in.
26530 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
26540 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sg..**.** This r
26550 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20  outine does NOT 
26560 66 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20  free the Select 
26570 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  structure passed
26580 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c   in.  The.** cal
26590 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65  ling function ne
265a0 65 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a  eds to do that..
265b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
265c0 6c 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70  lect(.  Parse *p
265d0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
265e0 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
265f0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
26600 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
26610 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
26620 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
26630 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  oded. */.  Selec
26640 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
26650 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
26660 77 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72  with the query r
26670 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  esults */.){.  i
26680 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
26690 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
266a0 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72  unters */.  Wher
266b0 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20  eInfo *pWInfo;  
266c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f     /* Return fro
266d0 6d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  m sqlite3WhereBe
266e0 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20  gin() */.  Vdbe 
266f0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
26700 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c    /* The virtual
26710 20 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63   machine under c
26720 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  onstruction */. 
26730 20 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20   int isAgg;     
26740 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26750 66 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73  for select lists
26760 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22   like "count(*)"
26770 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
26780 70 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20  pEList;      /* 
26790 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  List of columns 
267a0 74 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20  to extract. */. 
267b0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
267c0 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st;     /* List 
267d0 6f 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c  of tables to sel
267e0 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78  ect from */.  Ex
267f0 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20  pr *pWhere;     
26800 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
26810 45 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  E clause.  May b
26820 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
26830 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
26840 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
26850 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
26860 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
26870 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b  rList *pGroupBy;
26880 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
26890 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79   BY clause.  May
268a0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78   be NULL */.  Ex
268b0 70 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20  pr *pHaving;    
268c0 20 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49       /* The HAVI
268d0 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  NG clause.  May 
268e0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
268f0 20 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20   rc = 1;        
26900 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20      /* Value to 
26910 72 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73  return from this
26920 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
26930 6e 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  nt addrSortIndex
26940 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
26950 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70   of an OP_OpenEp
26960 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
26970 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63  ion */.  Distinc
26980 74 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20  tCtx sDistinct; 
26990 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74  /* Info on how t
269a0 6f 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49  o code the DISTI
269b0 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20  NCT keyword */. 
269c0 20 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66   AggInfo sAggInf
269d0 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72  o;      /* Infor
269e0 6d 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61  mation used by a
269f0 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
26a00 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20   */.  int iEnd; 
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65  Address of the e
26a30 6e 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  nd of the query 
26a40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
26a50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
26a60 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
26a70 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64  ection */..#ifnd
26a80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
26a90 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65  XPLAIN.  int iRe
26aa0 73 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20  storeSelectId = 
26ab0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
26ac0 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65  d;.  pParse->iSe
26ad0 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d  lectId = pParse-
26ae0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b  >iNextSelectId++
26af0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d  ;.#endif..  db =
26b00 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
26b10 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d  f( p==0 || db->m
26b20 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
26b30 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
26b40 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
26b50 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
26b60 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
26b70 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30  SQLITE_SELECT, 0
26b80 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
26b90 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41   1;.  memset(&sA
26ba0 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  ggInfo, 0, sizeo
26bb0 66 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20  f(sAggInfo));.. 
26bc0 20 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72   if( IgnorableOr
26bd0 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
26be0 20 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74      assert(pDest
26bf0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69  ->eDest==SRT_Exi
26c00 73 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44  sts || pDest->eD
26c10 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c  est==SRT_Union |
26c20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44  | .           pD
26c30 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
26c40 45 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d  Except || pDest-
26c50 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63  >eDest==SRT_Disc
26c60 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ard);.    /* If 
26c70 4f 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e  ORDER BY makes n
26c80 6f 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20  o difference in 
26c90 74 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20  the output then 
26ca0 6e 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20  neither does.   
26cb0 20 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20   ** DISTINCT so 
26cc0 69 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  it can be remove
26cd0 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71  d too. */.    sq
26ce0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
26cf0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ete(db, p->pOrde
26d00 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rBy);.    p->pOr
26d10 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
26d20 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
26d30 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  F_Distinct;.  }.
26d40 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
26d50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30  rep(pParse, p, 0
26d60 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
26d70 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70  p->pOrderBy;.  p
26d80 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
26d90 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  c;.  pEList = p-
26da0 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  >pEList;.  if( p
26db0 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
26dc0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
26dd0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  ){.    goto sele
26de0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73  ct_end;.  }.  is
26df0 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61  Agg = (p->selFla
26e00 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
26e10 65 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28  e)!=0;.  assert(
26e20 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20   pEList!=0 );.. 
26e30 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
26e40 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  ting code..  */.
26e50 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
26e60 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
26e70 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
26e80 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f  select_end;..  /
26e90 2a 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20  * If writing to 
26ea0 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61  memory or genera
26eb0 74 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20  ting a set.  ** 
26ec0 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f  only a single co
26ed0 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70  lumn may be outp
26ee0 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ut..  */.#ifndef
26ef0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
26f00 51 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63  QUERY.  if( chec
26f10 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
26f20 65 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73  electError(pPars
26f30 65 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74  e, pDest, pEList
26f40 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ->nExpr) ){.    
26f50 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
26f60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
26f70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
26f80 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72  for all sub-quer
26f90 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ies in the FROM 
26fa0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20  clause.  */.#if 
26fb0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
26fc0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
26fd0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
26fe0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66  E_OMIT_VIEW).  f
26ff0 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69  or(i=0; !p->pPri
27000 6f 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74  or && i<pTabList
27010 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
27020 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
27030 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
27040 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pTabList->a[i];.
27050 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
27060 65 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20  est;.    Select 
27070 2a 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pSub = pItem->p
27080 53 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20  Select;.    int 
27090 69 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69  isAggSub;..    i
270a0 66 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e  f( pSub==0 ) con
270b0 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  tinue;..    /* S
270c0 6f 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64  ometimes the cod
270d0 65 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79  e for a subquery
270e0 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
270f0 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ed more than.   
27100 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65   ** once, if the
27110 20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72   subquery is par
27120 74 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  t of the WHERE c
27130 6c 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20  lause in a LEFT 
27140 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72  JOIN,.    ** for
27150 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68   example.  In th
27160 61 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20  at case, do not 
27170 72 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63  regenerate the c
27180 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a  ode to manifest.
27190 20 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72      ** a view or
271a0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
271b0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76  to implement a v
271c0 69 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20  iew.  The first 
271d0 69 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20  instance.    ** 
271e0 69 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74  is sufficient, t
271f0 68 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75  hough the subrou
27200 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74  tine to manifest
27210 20 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e   the view does n
27220 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
27230 20 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20   invoked again. 
27240 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  */.    if( pItem
27250 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b  ->addrFillSub ){
27260 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
27270 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d  ->viaCoroutine==
27280 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
27290 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
272a0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65  , OP_Gosub, pIte
272b0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49  m->regReturn, pI
272c0 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
272d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
272e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
272f0 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  ..    /* Increme
27300 6e 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74  nt Parse.nHeight
27310 20 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f   by the height o
27320 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78  f the largest ex
27330 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
27340 74 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f  tree referred to
27350 20 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61   by this, the pa
27360 72 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65  rent select. The
27370 20 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20   child select.  
27380 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e    ** may contain
27390 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
273a0 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20  s of at most.   
273b0 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f   ** (SQLITE_MAX_
273c0 45 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65  EXPR_DEPTH-Parse
273d0 2e 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74  .nHeight) height
273e0 2e 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a  . This is a bit.
273f0 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73      ** more cons
27400 65 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65  ervative than ne
27410 63 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63  cessary, but muc
27420 68 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e  h easier than en
27430 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61  forcing.    ** a
27440 6e 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20  n exact limit.. 
27450 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65     */.    pParse
27460 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c  ->nHeight += sql
27470 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
27480 69 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73  ight(p);..    is
27490 41 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e  AggSub = (pSub->
274a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
274b0 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20  gregate)!=0;.   
274c0 20 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71   if( flattenSubq
274d0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
274e0 69 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53  i, isAgg, isAggS
274f0 75 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ub) ){.      /* 
27500 54 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61  This subquery ca
27510 6e 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e  n be absorbed in
27520 74 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a  to its parent. *
27530 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67  /.      if( isAg
27540 67 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  gSub ){.        
27550 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  isAgg = 1;.     
27560 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
27570 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a  = SF_Aggregate;.
27580 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20        }.      i 
27590 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = -1;.    }else 
275a0 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
275b0 72 63 3d 3d 31 20 26 26 20 28 70 2d 3e 73 65 6c  rc==1 && (p->sel
275c0 46 6c 61 67 73 20 26 20 53 46 5f 4d 61 74 65 72  Flags & SF_Mater
275d0 69 61 6c 69 7a 65 29 3d 3d 30 0a 20 20 20 20 20  ialize)==0.     
275e0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
275f0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
27600 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65  TE_SubqCoroutine
27610 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
27620 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f  * Implement a co
27630 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69  -routine that wi
27640 6c 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67  ll return a sing
27650 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
27660 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
27670 74 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61  t on each invoca
27680 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
27690 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
276a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
276b0 45 6f 66 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  Eof;.      pItem
276c0 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
276d0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
276e0 20 20 20 20 61 64 64 72 45 6f 66 20 3d 20 2b 2b      addrEof = ++
276f0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
27700 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 63 6f      /* Before co
27710 64 69 6e 67 20 74 68 65 20 4f 50 5f 47 6f 74 6f  ding the OP_Goto
27720 20 74 6f 20 6a 75 6d 70 20 74 6f 20 74 68 65 20   to jump to the 
27730 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 61 69  start of the mai
27740 6e 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20  n routine,.     
27750 20 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20   ** ensure that 
27760 74 68 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  the jump to the 
27770 76 65 72 69 66 79 2d 73 63 68 65 6d 61 20 72 6f  verify-schema ro
27780 75 74 69 6e 65 20 68 61 73 20 61 6c 72 65 61 64  utine has alread
27790 79 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20  y.      ** been 
277a0 63 6f 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65  coded. Otherwise
277b0 2c 20 74 68 65 20 76 65 72 69 66 79 2d 73 63 68  , the verify-sch
277c0 65 6d 61 20 77 6f 75 6c 64 20 6c 69 6b 65 6c 79  ema would likely
277d0 20 62 65 20 63 6f 64 65 64 20 61 73 20 0a 20 20   be coded as .  
277e0 20 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74      ** part of t
277f0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49  he co-routine. I
27800 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69  f the main routi
27810 6e 65 20 74 68 65 6e 20 61 63 63 65 73 73 65 64  ne then accessed
27820 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 64   the .      ** d
27830 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 69  atabase before i
27840 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 2d 72  nvoking the co-r
27850 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 66  outine for the f
27860 69 72 73 74 20 74 69 6d 65 20 28 66 6f 72 20 0a  irst time (for .
27870 20 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65        ** example
27880 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
27890 20 4c 49 4d 49 54 20 72 65 67 69 73 74 65 72 20   LIMIT register 
278a0 66 72 6f 6d 20 61 20 73 75 62 2d 73 65 6c 65 63  from a sub-selec
278b0 74 29 2c 20 69 74 20 77 6f 75 6c 64 20 0a 20 20  t), it would .  
278c0 20 20 20 20 2a 2a 20 62 65 20 64 6f 69 6e 67 20      ** be doing 
278d0 73 6f 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  so without havin
278e0 67 20 76 65 72 69 66 69 65 64 20 74 68 65 20 73  g verified the s
278f0 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 61 6e  chema version an
27900 64 20 6f 62 74 61 69 6e 65 64 20 0a 20 20 20 20  d obtained .    
27910 20 20 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65    ** the require
27920 64 20 64 62 20 6c 6f 63 6b 73 2e 20 53 65 65 20  d db locks. See 
27930 74 69 63 6b 65 74 20 64 36 62 33 36 62 65 33 38  ticket d6b36be38
27940 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  .  */.      sqli
27950 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
27960 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
27970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27980 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
27990 6f 74 6f 29 3b 0a 20 20 20 20 20 20 61 64 64 72  oto);.      addr
279a0 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
279b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 70  eAddOp1(v, OP_Op
279c0 65 6e 50 73 65 75 64 6f 2c 20 70 49 74 65 6d 2d  enPseudo, pItem-
279d0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
279e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
279f0 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20  geP5(v, 1);.    
27a00 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
27a10 2c 20 22 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  , "coroutine for
27a20 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
27a30 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
27a40 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
27a50 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
27a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27a70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
27a80 74 65 67 65 72 2c 20 30 2c 20 61 64 64 72 45 6f  teger, 0, addrEo
27a90 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
27aa0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
27ab0 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
27ac0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
27ad0 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
27ae0 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
27af0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
27b00 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
27b10 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
27b20 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
27b30 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
27b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
27b50 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
27b60 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
27b70 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
27b80 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
27b90 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  )pSub->nSelectRo
27ba0 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  w;.      pItem->
27bb0 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
27bc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27bd0 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
27be0 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 69 53 64  ddrTop, dest.iSd
27bf0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
27c00 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
27c10 2c 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74 2e  , addrTop, dest.
27c20 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
27c30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27c40 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
27c50 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20 20 20  , addrEof);.    
27c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
27c70 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
27c80 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
27c90 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  n);.      VdbeCo
27ca0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25  mment((v, "end %
27cb0 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d  s", pItem->pTab-
27cc0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
27cd0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
27ce0 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31  ere(v, addrTop-1
27cf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27d00 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
27d10 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
27d20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47  else{.      /* G
27d30 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
27d40 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66  tine that will f
27d50 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ill an ephemeral
27d60 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20   table with.    
27d70 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
27d80 20 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72   of this subquer
27d90 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  y.  pItem->addrF
27da0 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e  illSub will poin
27db0 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68  t.      ** to th
27dc0 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
27dd0 20 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f   generated subro
27de0 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72  utine.  pItem->r
27df0 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  egReturn.      *
27e00 2a 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20  * is a register 
27e10 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c  allocated to hol
27e20 64 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  d the subroutine
27e30 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a   return address.
27e40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
27e50 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20  nt topAddr;.    
27e60 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d    int onceAddr =
27e70 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   0;.      int re
27e80 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73  tAddr;.      ass
27e90 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72  ert( pItem->addr
27ea0 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20  FillSub==0 );.  
27eb0 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
27ec0 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d  turn = ++pParse-
27ed0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70  >nMem;.      top
27ee0 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  Addr = sqlite3Vd
27ef0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
27f00 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d  nteger, 0, pItem
27f10 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
27f20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
27f30 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72  illSub = topAddr
27f40 2b 31 3b 0a 20 20 20 20 20 20 56 64 62 65 4e 6f  +1;.      VdbeNo
27f50 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d  opComment((v, "m
27f60 61 74 65 72 69 61 6c 69 7a 65 20 25 73 22 2c 20  aterialize %s", 
27f70 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
27f80 6d 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me));.      if( 
27f90 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61  pItem->isCorrela
27fa0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ted==0 ){.      
27fb0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71    /* If the subq
27fc0 75 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72  uery is not corr
27fd0 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65  elated and if we
27fe0 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20   are not inside 
27ff0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  of.        ** a 
28000 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65  trigger, then we
28010 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f   only need to co
28020 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20  mpute the value 
28030 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a  of the subquery.
28040 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e          ** once.
28050 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65   */.        once
28060 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f  Addr = sqlite3Co
28070 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a  deOnce(pParse);.
28080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
28090 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
280a0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45  nit(&dest, SRT_E
280b0 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e  phemTab, pItem->
280c0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
280d0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
280e0 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
280f0 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
28100 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
28110 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
28120 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
28130 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
28140 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
28150 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
28160 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  )pSub->nSelectRo
28170 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  w;.      if( onc
28180 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
28190 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
281a0 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
281b0 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
281c0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
281d0 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
281e0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
281f0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
28200 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
28210 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
28220 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28230 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
28240 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
28250 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28260 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
28270 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
28280 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73  .    if( /*pPars
28290 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d  e->nErr ||*/ db-
282a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
282b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
282c0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
282d0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
282e0 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
282f0 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
28300 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
28310 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28  p->pSrc;.    if(
28320 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
28330 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
28340 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
28350 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
28360 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
28370 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69  p->pEList;.#endi
28380 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  f.  pWhere = p->
28390 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
283a0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
283b0 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
283c0 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
283d0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
283e0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
283f0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
28400 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28410 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
28420 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ECT.  /* If ther
28430 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
28440 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
28450 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
28460 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
28470 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
28480 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  ){.    if( p->pR
28490 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20  ightmost==0 ){. 
284a0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f       Select *pLo
284b0 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b  op, *pRight = 0;
284c0 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
284d0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78   0;.      int mx
284e0 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f  Select;.      fo
284f0 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70  r(pLoop=p; pLoop
28500 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70  ; pLoop=pLoop->p
28510 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20  Prior, cnt++){. 
28520 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52         pLoop->pR
28530 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20  ightmost = p;.  
28540 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65        pLoop->pNe
28550 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20  xt = pRight;.   
28560 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
28570 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oop;.      }.   
28580 20 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62     mxSelect = db
28590 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
285a0 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
285b0 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66  ELECT];.      if
285c0 28 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e  ( mxSelect && cn
285d0 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20  t>mxSelect ){.  
285e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
285f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
28600 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e  oo many terms in
28610 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
28620 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ");.        goto
28630 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
28640 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
28650 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28  c = multiSelect(
28660 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74  pParse, p, pDest
28670 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65  );.    explainSe
28680 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d  tInteger(pParse-
28690 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73  >iSelectId, iRes
286a0 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20  toreSelectId);. 
286b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
286c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  }.#endif..  /* I
286d0 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20  f there is both 
286e0 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61  a GROUP BY and a
286f0 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
28700 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20  e and they are. 
28710 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74   ** identical, t
28720 68 65 6e 20 64 69 73 61 62 6c 65 20 74 68 65 20  hen disable the 
28730 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
28740 73 69 6e 63 65 20 74 68 65 20 47 52 4f 55 50 20  since the GROUP 
28750 42 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75  BY.  ** will cau
28760 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63  se elements to c
28770 6f 6d 65 20 6f 75 74 20 69 6e 20 74 68 65 20 63  ome out in the c
28780 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 20 54  orrect order.  T
28790 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f  his is.  ** an o
287a0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68  ptimization - th
287b0 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72  e correct answer
287c0 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72   should result r
287d0 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20  egardless..  ** 
287e0 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47  Use the SQLITE_G
287f0 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67  roupByOrder flag
28800 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53   with SQLITE_TES
28810 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a  TCTRL_OPTIMIZER.
28820 20 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65 20    ** to disable 
28830 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f  this optimizatio
28840 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  n for testing pu
28850 72 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69  rposes..  */.  i
28860 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  f( sqlite3ExprLi
28870 73 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72  stCompare(p->pGr
28880 6f 75 70 42 79 2c 20 70 4f 72 64 65 72 42 79 2c  oupBy, pOrderBy,
28890 20 2d 31 29 3d 3d 30 0a 20 20 20 20 20 20 20 20   -1)==0.        
288a0 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
288b0 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  Enabled(db, SQLI
288c0 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29  TE_GroupByOrder)
288d0 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
288e0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
288f0 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
28900 44 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e  DISTINCT with an
28910 20 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73   ORDER BY but is
28920 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
28930 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20  e, and .  ** if 
28940 74 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  the select-list 
28950 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
28960 68 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74  he ORDER BY list
28970 2c 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72  , then this quer
28980 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65  y.  ** can be re
28990 77 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f  written as a GRO
289a0 55 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20  UP BY. In other 
289b0 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a  words, this:.  *
289c0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
289d0 54 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46  T DISTINCT xyz F
289e0 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59  ROM ... ORDER BY
289f0 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69   xyz.  **.  ** i
28a00 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  s transformed to
28a10 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
28a20 53 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20  SELECT xyz FROM 
28a30 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a  ... GROUP BY xyz
28a40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73  .  **.  ** The s
28a50 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72  econd form is pr
28a60 65 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e  eferred as a sin
28a70 67 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65  gle index (or te
28a80 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65  mp-table) may be
28a90 20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20   .  ** used for 
28aa0 62 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42  both the ORDER B
28ab0 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70  Y and DISTINCT p
28ac0 72 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72  rocessing. As or
28ad0 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77  iginally .  ** w
28ae0 72 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79  ritten the query
28af0 20 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70   must use a temp
28b00 2d 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65  -table for at le
28b10 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f  ast one of the O
28b20 52 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e  RDER .  ** BY an
28b30 64 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20  d DISTINCT, and 
28b40 61 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61  an index or sepa
28b50 72 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20  rate temp-table 
28b60 66 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20  for the other.. 
28b70 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
28b80 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
28b90 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
28ba0 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
28bb0 74 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  t .   && sqlite3
28bc0 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
28bd0 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c  pOrderBy, p->pEL
28be0 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b  ist, -1)==0.  ){
28bf0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
28c00 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
28c10 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42  ;.    p->pGroupB
28c20 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
28c30 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
28c40 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47  List, 0);.    pG
28c50 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
28c60 75 70 42 79 3b 0a 20 20 20 20 70 4f 72 64 65 72  upBy;.    pOrder
28c70 42 79 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e  By = 0;.    /* N
28c80 6f 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20  otice that even 
28c90 74 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69  thought SF_Disti
28ca0 6e 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65  nct has been cle
28cb0 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c  ared from p->sel
28cc0 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68  Flags,.    ** th
28cd0 65 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  e sDistinct.isTn
28ce0 63 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e  ct is still set.
28cf0 20 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20    Hence, isTnct 
28d00 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20  represents the. 
28d10 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73     ** original s
28d20 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46  etting of the SF
28d30 5f 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20  _Distinct flag, 
28d40 6e 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  not the current 
28d50 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61  setting */.    a
28d60 73 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74  ssert( sDistinct
28d70 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a  .isTnct );.  }..
28d80 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
28d90 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
28da0 75 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73  use, then this s
28db0 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  orting.  ** inde
28dc0 78 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  x might end up b
28dd0 65 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74  eing unused if t
28de0 68 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a  he data can be .
28df0 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69    ** extracted i
28e00 6e 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64  n pre-sorted ord
28e10 65 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20  er.  If that is 
28e20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
28e30 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45  he.  ** OP_OpenE
28e40 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63  phemeral instruc
28e50 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61  tion will be cha
28e60 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f  nged to an OP_No
28e70 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20  op once.  ** we 
28e80 66 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20  figure out that 
28e90 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
28ea0 78 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e  x is not needed.
28eb0 20 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e    The addrSortIn
28ec0 64 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  dex.  ** variabl
28ed0 65 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63  e is used to fac
28ee0 69 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61  ilitate that cha
28ef0 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nge..  */.  if( 
28f00 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
28f10 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
28f20 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  o;.    pKeyInfo 
28f30 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
28f40 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f  rList(pParse, pO
28f50 72 64 65 72 42 79 2c 20 30 29 3b 0a 20 20 20 20  rderBy, 0);.    
28f60 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
28f70 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
28f80 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72  b++;.    p->addr
28f90 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64  OpenEphm[2] = ad
28fa0 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
28fb0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
28fc0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
28fd0 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ff0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
29000 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72  iECursor, pOrder
29010 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a  By->nExpr+2, 0,.
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29030 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
29040 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
29050 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 65 6c 73 65  EYINFO);.  }else
29060 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
29070 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
29080 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
29090 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
290a0 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
290b0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
290c0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
290d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
290e0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
290f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29100 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
29110 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
29120 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74  >iSDParm, pEList
29130 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
29140 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
29150 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
29160 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
29170 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d  keLabel(v);.  p-
29180 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41  >nSelectRow = LA
29190 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63  RGEST_INT64;.  c
291a0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
291b0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
291c0 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
291d0 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61 64 64  iLimit==0 && add
291e0 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
291f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
29200 47 65 74 4f 70 28 76 2c 20 61 64 64 72 53 6f 72  GetOp(v, addrSor
29210 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20  tIndex)->opcode 
29220 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b  = OP_SorterOpen;
29230 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
29240 20 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74 65 72   |= SF_UseSorter
29250 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
29260 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
29270 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
29280 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
29290 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
292a0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
292b0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
292c0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
292d0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
292e0 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
292f0 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
29300 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
29310 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44                sD
29340 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c  istinct.tabTnct,
29350 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29370 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65         (char*)ke
29380 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
29390 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
293a0 69 73 74 2c 20 30 29 2c 0a 20 20 20 20 20 20 20  ist, 0),.       
293b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293c0 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
293d0 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
293e0 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
293f0 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
29400 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  );.    sDistinct
29410 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45  .eTnctType = WHE
29420 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52  RE_DISTINCT_UNOR
29430 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DERED;.  }else{.
29440 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
29450 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
29460 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
29470 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41 67 67   }..  if( !isAgg
29480 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d 30 20   && pGroupBy==0 
29490 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67  ){.    /* No agg
294a0 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
294b0 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
294c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 75   clause */.    u
294d0 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20 3d 20  16 wctrlFlags = 
294e0 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63  (sDistinct.isTnc
294f0 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54 5f 44  t ? WHERE_WANT_D
29500 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20  ISTINCT : 0);.. 
29510 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68 65 20     /* Begin the 
29520 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e 20 2a  database scan. *
29530 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73  /.    pWInfo = s
29540 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
29550 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
29560 74 2c 20 70 57 68 65 72 65 2c 20 70 4f 72 64 65  t, pWhere, pOrde
29570 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 0a  rBy, 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 20 20 20 20 20 77                 w
295a0 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b 0a 20  ctrlFlags, 0);. 
295b0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
295c0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
295d0 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  nd;.    if( sqli
295e0 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
295f0 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c  wCount(pWInfo) <
29600 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29   p->nSelectRow )
29610 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
29620 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 57  ctRow = sqlite3W
29630 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
29640 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nt(pWInfo);.    
29650 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73 74 69  }.    if( sDisti
29660 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20 73 71  nct.isTnct && sq
29670 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
29680 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a  inct(pWInfo) ){.
29690 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
296a0 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71 6c 69  eTnctType = sqli
296b0 74 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e  te3WhereIsDistin
296c0 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  ct(pWInfo);.    
296d0 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  }.    if( pOrder
296e0 42 79 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  By && sqlite3Whe
296f0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
29700 66 6f 29 20 29 20 70 4f 72 64 65 72 42 79 20 3d  fo) ) pOrderBy =
29710 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73   0;..    /* If s
29720 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
29730 74 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  t was created by
29740 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e   a prior OP_Open
29750 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a  Ephemeral .    *
29760 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e  * instruction en
29770 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69 6e 67  ded up not being
29780 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 63 68   needed, then ch
29790 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e  ange the OP_Open
297a0 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a  Ephemeral.    **
297b0 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70   into an OP_Noop
297c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
297d0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d   addrSortIndex>=
297e0 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d 3d 30  0 && pOrderBy==0
297f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29800 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
29810 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
29820 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  ex);.      p->ad
29830 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20  drOpenEphm[2] = 
29840 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  -1;.    }..    /
29850 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e 64 61  * Use the standa
29860 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a  rd inner loop. *
29870 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65  /.    selectInne
29880 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
29890 20 70 45 4c 69 73 74 2c 20 2d 31 2c 20 70 4f 72   pEList, -1, pOr
298a0 64 65 72 42 79 2c 20 26 73 44 69 73 74 69 6e 63  derBy, &sDistinc
298b0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
298d0 6c 69 74 65 33 57 68 65 72 65 43 6f 6e 74 69 6e  lite3WhereContin
298e0 75 65 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c  ueLabel(pWInfo),
298f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29900 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
29910 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e  eBreakLabel(pWIn
29920 66 6f 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  fo));..    /* En
29930 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
29940 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
29950 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
29960 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
29970 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
29980 69 73 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  is case when the
29990 72 65 20 65 78 69 73 74 20 61 67 67 72 65 67 61  re exist aggrega
299a0 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  te functions or 
299b0 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
299c0 65 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  e.    ** or both
299d0 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74   */.    NameCont
299e0 65 78 74 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e  ext sNC;    /* N
299f0 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
29a00 70 72 6f 63 65 73 73 69 6e 67 20 61 67 67 72 65  processing aggre
29a10 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  gate information
29a20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 4d 65   */.    int iAMe
29a30 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  m;          /* F
29a40 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73 73  irst Mem address
29a50 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 63 75 72   for storing cur
29a60 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20 2a 2f  rent GROUP BY */
29a70 0a 20 20 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20  .    int iBMem; 
29a80 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
29a90 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
29aa0 72 20 70 72 65 76 69 6f 75 73 20 47 52 4f 55 50  r previous GROUP
29ab0 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
29ac0 55 73 65 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  UseFlag;       /
29ad0 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 68 6f  * Mem address ho
29ae0 6c 64 69 6e 67 20 66 6c 61 67 20 69 6e 64 69 63  lding flag indic
29af0 61 74 69 6e 67 20 74 68 61 74 20 61 74 20 6c 65  ating that at le
29b00 61 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ast.            
29b10 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
29b20 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 69 6e  ne row of the in
29b30 70 75 74 20 74 6f 20 74 68 65 20 61 67 67 72 65  put to the aggre
29b40 67 61 74 6f 72 20 68 61 73 20 62 65 65 6e 0a 20  gator has been. 
29b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b60 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
29b70 73 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sed */.    int i
29b80 41 62 6f 72 74 46 6c 61 67 3b 20 20 20 20 20 2f  AbortFlag;     /
29b90 2a 20 4d 65 6d 20 61 64 64 72 65 73 73 20 77 68  * Mem address wh
29ba0 69 63 68 20 63 61 75 73 65 73 20 71 75 65 72 79  ich causes query
29bb0 20 61 62 6f 72 74 20 69 66 20 70 6f 73 69 74 69   abort if positi
29bc0 76 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72  ve */.    int gr
29bd0 6f 75 70 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a  oupBySort;    /*
29be0 20 52 6f 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20   Rows come from 
29bf0 73 6f 75 72 63 65 20 69 6e 20 47 52 4f 55 50 20  source in GROUP 
29c00 42 59 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  BY order */.    
29c10 69 6e 74 20 61 64 64 72 45 6e 64 3b 20 20 20 20  int addrEnd;    
29c20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72      /* End of pr
29c30 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
29c40 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  s SELECT */.    
29c50 69 6e 74 20 73 6f 72 74 50 54 61 62 20 3d 20 30  int sortPTab = 0
29c60 3b 20 20 20 2f 2a 20 50 73 65 75 64 6f 74 61 62  ;   /* Pseudotab
29c70 6c 65 20 75 73 65 64 20 74 6f 20 64 65 63 6f 64  le used to decod
29c80 65 20 73 6f 72 74 69 6e 67 20 72 65 73 75 6c 74  e sorting result
29c90 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72  s */.    int sor
29ca0 74 4f 75 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  tOut = 0;    /* 
29cb0 4f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 20  Output register 
29cc0 66 72 6f 6d 20 74 68 65 20 73 6f 72 74 65 72 20  from the sorter 
29cd0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  */..    /* Remov
29ce0 65 20 61 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c  e any and all al
29cf0 69 61 73 65 73 20 62 65 74 77 65 65 6e 20 74 68  iases between th
29d00 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
29d10 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55   the.    ** GROU
29d20 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  P BY clause..   
29d30 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
29d40 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  upBy ){.      in
29d50 74 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  t k;            
29d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
29d70 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
29d80 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
29d90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
29da0 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
29db0 67 20 6f 76 65 72 20 65 78 70 72 65 73 73 69 6f  g over expressio
29dc0 6e 20 69 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a  n in a list */..
29dd0 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70        for(k=p->p
29de0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49  EList->nExpr, pI
29df0 74 65 6d 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  tem=p->pEList->a
29e00 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65  ; k>0; k--, pIte
29e10 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49  m++){.        pI
29e20 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20  tem->u.x.iAlias 
29e30 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
29e40 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42     for(k=pGroupB
29e50 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  y->nExpr, pItem=
29e60 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30  pGroupBy->a; k>0
29e70 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
29e80 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
29e90 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
29ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29eb0 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e  ( p->nSelectRow>
29ec0 31 30 30 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  100 ) p->nSelect
29ed0 52 6f 77 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d  Row = 100;.    }
29ee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
29ef0 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20  SelectRow = 1;. 
29f00 20 20 20 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43     }.. .    /* C
29f10 72 65 61 74 65 20 61 20 6c 61 62 65 6c 20 74 6f  reate a label to
29f20 20 6a 75 6d 70 20 74 6f 20 77 68 65 6e 20 77 65   jump to when we
29f30 20 77 61 6e 74 20 74 6f 20 61 62 6f 72 74 20 74   want to abort t
29f40 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  he query */.    
29f50 61 64 64 72 45 6e 64 20 3d 20 73 71 6c 69 74 65  addrEnd = sqlite
29f60 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
29f70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65  );..    /* Conve
29f80 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64  rt TK_COLUMN nod
29f90 65 73 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  es into TK_AGG_C
29fa0 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65  OLUMN and make e
29fb0 6e 74 72 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a  ntries in.    **
29fc0 20 73 41 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c   sAggInfo for al
29fd0 6c 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  l TK_AGG_FUNCTIO
29fe0 4e 20 6e 6f 64 65 73 20 69 6e 20 65 78 70 72 65  N nodes in expre
29ff0 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20  ssions of the.  
2a000 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
2a010 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ement..    */.  
2a020 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
2a030 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
2a040 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
2a050 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
2a060 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62  .pSrcList = pTab
2a070 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41  List;.    sNC.pA
2a080 67 67 49 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e  ggInfo = &sAggIn
2a090 66 6f 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  fo;.    sAggInfo
2a0a0 2e 6d 6e 52 65 67 20 3d 20 70 50 61 72 73 65 2d  .mnReg = pParse-
2a0b0 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67  >nMem+1;.    sAg
2a0c0 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2a0d0 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42 79 20  lumn = pGroupBy 
2a0e0 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  ? pGroupBy->nExp
2a0f0 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73 41 67  r+1 : 0;.    sAg
2a100 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d  gInfo.pGroupBy =
2a110 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 73   pGroupBy;.    s
2a120 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
2a130 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70  eAggList(&sNC, p
2a140 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  EList);.    sqli
2a150 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2a160 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f 72 64  gList(&sNC, pOrd
2a170 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  erBy);.    if( p
2a180 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 20 20  Having ){.      
2a190 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2a1a0 7a 65 41 67 67 72 65 67 61 74 65 73 28 26 73 4e  zeAggregates(&sN
2a1b0 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  C, pHaving);.   
2a1c0 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e   }.    sAggInfo.
2a1d0 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73  nAccumulator = s
2a1e0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2a1f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2a200 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20  sAggInfo.nFunc; 
2a210 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
2a220 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2a230 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e 61 46  erty(sAggInfo.aF
2a240 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50  unc[i].pExpr, EP
2a250 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
2a260 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
2a270 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63   |= NC_InAggFunc
2a280 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2a290 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2a2a0 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f  t(&sNC, sAggInfo
2a2b0 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d  .aFunc[i].pExpr-
2a2c0 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  >x.pList);.     
2a2d0 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
2a2e0 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20  ~NC_InAggFunc;. 
2a2f0 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
2a300 6f 2e 6d 78 52 65 67 20 3d 20 70 50 61 72 73 65  o.mxReg = pParse
2a310 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20  ->nMem;.    if( 
2a320 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2a330 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
2a340 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  nd;..    /* Proc
2a350 65 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65  essing for aggre
2a360 67 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50  gates with GROUP
2a370 20 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66   BY is very diff
2a380 65 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a  erent and.    **
2a390 20 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c   much more compl
2a3a0 65 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74  ex than aggregat
2a3b0 65 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f  es without a GRO
2a3c0 55 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  UP BY..    */.  
2a3d0 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
2a3e0 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  {.      KeyInfo 
2a3f0 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b  *pKeyInfo;  /* K
2a400 65 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  eying informatio
2a410 6e 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20  n for the group 
2a420 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  by clause */.   
2a430 20 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20     int j1;      
2a440 20 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42         /* A-vs-B
2a450 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d   comparision jum
2a460 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2a470 64 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f  ddrOutputRow;  /
2a480 2a 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f  * Start of subro
2a490 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75  utine that outpu
2a4a0 74 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20  ts a result row 
2a4b0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67  */.      int reg
2a4c0 4f 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20  OutputRow;   /* 
2a4d0 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72  Return address r
2a4e0 65 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70  egister for outp
2a4f0 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ut subroutine */
2a500 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2a510 65 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65  etAbort;   /* Se
2a520 74 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67  t the abort flag
2a530 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20   and return */. 
2a540 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
2a550 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20  OfLoop;  /* Top 
2a560 6f 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f  of the input loo
2a570 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  p */.      int a
2a580 64 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f  ddrSortingIdx; /
2a590 2a 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  * The OP_OpenEph
2a5a0 65 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73  emeral for the s
2a5b0 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  orting index */.
2a5c0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65        int addrRe
2a5d0 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62  set;      /* Sub
2a5e0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65  routine for rese
2a5f0 74 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75  tting the accumu
2a600 6c 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69  lator */.      i
2a610 6e 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20  nt regReset;    
2a620 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
2a630 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
2a640 72 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69  r reset subrouti
2a650 6e 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ne */..      /* 
2a660 49 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52  If there is a GR
2a670 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65  OUP BY clause we
2a680 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f   might need a so
2a690 72 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20  rting index to. 
2a6a0 20 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e       ** implemen
2a6b0 74 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20  t it.  Allocate 
2a6c0 74 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64  that sorting ind
2a6d0 65 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74  ex now.  If it t
2a6e0 75 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a  urns out.      *
2a6f0 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  * that we do not
2a700 20 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61   need it after a
2a710 6c 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65  ll, the OP_Sorte
2a720 72 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f  rOpen instructio
2a730 6e 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20  n.      ** will 
2a740 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
2a750 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20  o a Noop.  .    
2a760 20 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49    */.      sAggI
2a770 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d  nfo.sortingIdx =
2a780 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2a790 0a 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  .      pKeyInfo 
2a7a0 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70  = keyInfoFromExp
2a7b0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47  rList(pParse, pG
2a7c0 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20  roupBy, 0);.    
2a7d0 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78    addrSortingIdx
2a7e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2a7f0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp4(v, OP_Sorte
2a800 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20 20  rOpen, .        
2a810 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
2a820 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f 2e  ngIdx, sAggInfo.
2a830 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20  nSortingColumn, 
2a840 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28 63  .          0, (c
2a850 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50  har*)pKeyInfo, P
2a860 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20  4_KEYINFO);..   
2a870 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
2a880 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2a890 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50 20  s used by GROUP 
2a8a0 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72 6f  BY aggregate pro
2a8b0 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a 2f  cessing.      */
2a8c0 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67 20  .      iUseFlag 
2a8d0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2a8e0 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46 6c  ;.      iAbortFl
2a8f0 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ag = ++pParse->n
2a900 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f 75  Mem;.      regOu
2a910 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61 72  tputRow = ++pPar
2a920 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2a930 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20  addrOutputRow = 
2a940 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2a950 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 72  abel(v);.      r
2a960 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61 72  egReset = ++pPar
2a970 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2a980 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c 69  addrReset = sqli
2a990 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2a9a0 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65 6d  (v);.      iAMem
2a9b0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20   = pParse->nMem 
2a9c0 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73  + 1;.      pPars
2a9d0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75  e->nMem += pGrou
2a9e0 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  pBy->nExpr;.    
2a9f0 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73 65    iBMem = pParse
2aa00 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20  ->nMem + 1;.    
2aa10 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
2aa20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2aa30 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
2aa40 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2aa50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41 62  _Integer, 0, iAb
2aa60 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20  ortFlag);.      
2aa70 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2aa80 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c 61  "clear abort fla
2aa90 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2aaa0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2aab0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
2aac0 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
2aad0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2aae0 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75 6d   "indicate accum
2aaf0 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29 3b  ulator empty"));
2ab00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2ab10 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e  beAddOp3(v, OP_N
2ab20 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20 69  ull, 0, iAMem, i
2ab30 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e 6e  AMem+pGroupBy->n
2ab40 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20 20  Expr-1);..      
2ab50 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70 20  /* Begin a loop 
2ab60 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61 63  that will extrac
2ab70 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f 77  t all source row
2ab80 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  s in GROUP BY or
2ab90 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  der..      ** Th
2aba0 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76 65  is might involve
2abb0 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c 6f   two separate lo
2abc0 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f 53  ops with an OP_S
2abd0 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c 20  ort in between, 
2abe0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d  or.      ** it m
2abf0 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c 65  ight be a single
2ac00 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73 20   loop that uses 
2ac10 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74 72  an index to extr
2ac20 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  act information.
2ac30 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
2ac40 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20 62  right order to b
2ac50 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20 20  egin with..     
2ac60 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2ac70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2ac80 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
2ac90 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
2aca0 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71       pWInfo = sq
2acb0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2acc0 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
2acd0 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75 70  , pWhere, pGroup
2ace0 42 79 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  By, 0, .        
2acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad00 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 47           WHERE_G
2ad10 52 4f 55 50 42 59 2c 20 30 29 3b 0a 20 20 20 20  ROUPBY, 0);.    
2ad20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
2ad30 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
2ad40 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  d;.      if( sql
2ad50 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72  ite3WhereIsOrder
2ad60 65 64 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20  ed(pWInfo) ){.  
2ad70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 74        /* The opt
2ad80 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20 74  imizer is able t
2ad90 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20 69  o deliver rows i
2ada0 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65 72  n group by order
2adb0 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   so.        ** w
2adc0 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  e do not have to
2add0 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f 4f   sort.  The OP_O
2ade0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61 62  penEphemeral tab
2adf0 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  le will be.     
2ae00 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64 20     ** cancelled 
2ae10 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77 65  later because we
2ae20 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75   still need to u
2ae30 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f 0a  se the pKeyInfo.
2ae40 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2ae50 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2ae60 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
2ae70 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73  .        /* Rows
2ae80 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74 20   are coming out 
2ae90 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64 20  in undetermined 
2aea0 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65 20  order.  We have 
2aeb0 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20 20  to push.        
2aec0 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74 6f  ** each row into
2aed0 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78   a sorting index
2aee0 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  , terminate the 
2aef0 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20 20  first loop,.    
2af00 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70      ** then loop
2af10 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69 6e   over the sortin
2af20 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65 72  g index in order
2af30 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74 70   to get the outp
2af40 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  ut.        ** in
2af50 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20 20   sorted order.  
2af60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2af70 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20 20   int regBase;.  
2af80 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 63        int regRec
2af90 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ord;.        int
2afa0 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69   nCol;.        i
2afb0 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20 20  nt nGroupBy;..  
2afc0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d        explainTem
2afd0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 0a  pTable(pParse, .
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44 69              (sDi
2aff0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26  stinct.isTnct &&
2b000 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46   (p->selFlags&SF
2b010 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20 3f  _Distinct)==0) ?
2b020 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b030 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22 20       "DISTINCT" 
2b040 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a 0a  : "GROUP BY");..
2b050 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79 53          groupByS
2b060 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ort = 1;.       
2b070 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f   nGroupBy = pGro
2b080 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
2b090 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f       nCol = nGro
2b0a0 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20 20  upBy + 1;.      
2b0b0 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31    j = nGroupBy+1
2b0c0 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2b0d0 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43  0; i<sAggInfo.nC
2b0e0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
2b0f0 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67 49         if( sAggI
2b100 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72  nfo.aCol[i].iSor
2b110 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
2b120 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 6c              nCol
2b130 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2b140 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  j++;.          }
2b150 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b160 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c     regBase = sql
2b170 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
2b180 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a  (pParse, nCol);.
2b190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2b1a0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2b1b0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
2b1c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
2b1d0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
2b1e0 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73 65  GroupBy, regBase
2b1f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
2b200 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2b210 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20  v, OP_Sequence, 
2b220 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2b230 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72 6f  Idx,regBase+nGro
2b240 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20 6a  upBy);.        j
2b250 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20   = nGroupBy+1;. 
2b260 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
2b270 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75  i<sAggInfo.nColu
2b280 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
2b290 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49 6e      struct AggIn
2b2a0 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26  fo_col *pCol = &
2b2b0 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d  sAggInfo.aCol[i]
2b2c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b2d0 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f 6c  pCol->iSorterCol
2b2e0 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
2b2f0 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 6a        int r1 = j
2b300 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20   + regBase;.    
2b310 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b 0a          int r2;.
2b320 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32 20  .            r2 
2b330 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
2b340 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73  eGetColumn(pPars
2b350 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b370 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20 70     pCol->pTab, p
2b380 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43  Col->iColumn, pC
2b390 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c 20  ol->iTable, r1, 
2b3a0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
2b3b0 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20 20  if( r1!=r2 ){.  
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b3d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2b3e0 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20 72   OP_SCopy, r2, r
2b3f0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
2b400 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b  }.            j+
2b410 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
2b420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b430 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c   regRecord = sql
2b440 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
2b450 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
2b460 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b470 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
2b480 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  rd, regBase, nCo
2b490 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  l, regRecord);. 
2b4a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2b4b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2b4c0 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41 67  orterInsert, sAg
2b4d0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2b4e0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
2b4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
2b500 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
2b510 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
2b520 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
2b530 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
2b540 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
2b550 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
2b560 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2b570 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
2b580 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2b590 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74 50  gIdxPTab = sortP
2b5a0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
2b5b0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 6f  ab++;.        so
2b5c0 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 47  rtOut = sqlite3G
2b5d0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2b5e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2b5f0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2b600 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 73  OP_OpenPseudo, s
2b610 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75 74  ortPTab, sortOut
2b620 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
2b630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b640 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53  p2(v, OP_SorterS
2b650 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ort, sAggInfo.so
2b660 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45 6e  rtingIdx, addrEn
2b670 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  d);.        Vdbe
2b680 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52 4f  Comment((v, "GRO
2b690 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a 20  UP BY sort"));. 
2b6a0 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2b6b0 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d 20  useSortingIdx = 
2b6c0 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
2b6d0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
2b6e0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
2b6f0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61 6c  }..      /* Eval
2b700 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  uate the current
2b710 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20   GROUP BY terms 
2b720 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30 2c  and store in b0,
2b730 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20 20   b1, b2....     
2b740 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f 72   ** (b0 is memor
2b750 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65 6d  y location iBMem
2b760 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d 2b  +0, b1 is iBMem+
2b770 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  1, and so forth)
2b780 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20 63  .      ** Then c
2b790 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72 65  ompare the curre
2b7a0 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d  nt GROUP BY term
2b7b0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47 52  s against the GR
2b7c0 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20 20  OUP BY terms.   
2b7d0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70     ** from the p
2b7e0 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72 72  revious row curr
2b7f0 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
2b800 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20 20  a0, a1, a2....  
2b810 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64      */.      add
2b820 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c  rTopOfLoop = sql
2b830 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2b840 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2b850 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2b860 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2b870 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2b880 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  rt ){.        sq
2b890 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2b8a0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
2b8b0 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69  , sAggInfo.sorti
2b8c0 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29 3b  ngIdx, sortOut);
2b8d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2b8e0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75 70  or(j=0; j<pGroup
2b8f0 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  By->nExpr; j++){
2b900 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72 6f  .        if( gro
2b910 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2b920 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b930 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
2b940 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c 20  lumn, sortPTab, 
2b950 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  j, iBMem+j);.   
2b960 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20         if( j==0 
2b970 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
2b980 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
2b990 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20  CLEARCACHE);.   
2b9a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b9b0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 64        sAggInfo.d
2b9c0 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20  irectMode = 1;. 
2b9d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b9e0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2b9f0 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e   pGroupBy->a[j].
2ba00 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b  pExpr, iBMem+j);
2ba10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ba20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2ba30 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2ba40 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d 2c  _Compare, iAMem,
2ba50 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79   iBMem, pGroupBy
2ba60 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->nExpr,.       
2ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba80 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
2ba90 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
2baa0 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46  Info), P4_KEYINF
2bab0 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20 73  O);.      j1 = s
2bac0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
2bad0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
2bae0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2baf0 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31  3(v, OP_Jump, j1
2bb00 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20  +1, 0, j1+1);.. 
2bb10 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
2bb20 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73 20   code that runs 
2bb30 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52 4f  whenever the GRO
2bb40 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a 20  UP BY changes.. 
2bb50 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73 20       ** Changes 
2bb60 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  in the GROUP BY 
2bb70 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79 20  are detected by 
2bb80 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
2bb90 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63 6b  e.      ** block
2bba0 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72 65  .  If there were
2bbb0 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68 69   no changes, thi
2bbc0 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70 70  s block is skipp
2bbd0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
2bbe0 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65 20     ** This code 
2bbf0 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20 67  copies current g
2bc00 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69 6e  roup by terms in
2bc10 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20   b0,b1,b2,....  
2bc20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 61      ** over to a
2bc30 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68 65  0,a1,a2.  It the
2bc40 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74 70  n calls the outp
2bc50 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20  ut subroutine.  
2bc60 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74      ** and reset
2bc70 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  s the aggregate 
2bc80 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
2bc90 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72 61  sters in prepara
2bca0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66 6f  tion.      ** fo
2bcb0 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55 50  r the next GROUP
2bcc0 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20 20   BY batch..     
2bcd0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2bce0 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
2bcf0 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41 4d  arse, iBMem, iAM
2bd00 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
2bd10 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
2bd20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2bd30 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
2bd40 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
2bd50 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2bd60 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2bd70 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22 29  output one row")
2bd80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bd90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2bda0 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46 6c  _IfPos, iAbortFl
2bdb0 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  ag, addrEnd);.  
2bdc0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2bdd0 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72 74  (v, "check abort
2bde0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2bdf0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2be00 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2be10 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
2be20 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  et);.      VdbeC
2be30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73 65  omment((v, "rese
2be40 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29 29  t accumulator"))
2be50 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ;..      /* Upda
2be60 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74 65  te the aggregate
2be70 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62 61   accumulators ba
2be80 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
2be90 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  nt of.      ** t
2bea0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a 20  he current row. 
2beb0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2bec0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2bed0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20 20  e(v, j1);.      
2bee0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
2bef0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
2bf00 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
2bf10 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2bf20 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
2bf30 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20 20  iUseFlag);.     
2bf40 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2bf50 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61 20   "indicate data 
2bf60 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  in accumulator")
2bf70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e 64  );..      /* End
2bf80 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20   of the loop.   
2bf90 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2bfa0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
2bfb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2bfc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2bfd0 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67 49  orterNext, sAggI
2bfe0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2bff0 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a  addrTopOfLoop);.
2c000 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c010 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72       sqlite3Wher
2c020 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20  eEnd(pWInfo);.  
2c030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c040 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
2c050 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78 29   addrSortingIdx)
2c060 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2c070 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 66   /* Output the f
2c080 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73 75  inal row of resu
2c090 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  lt.      */.    
2c0a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c0b0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2c0c0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
2c0d0 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2c0e0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2c0f0 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69 6e  ((v, "output fin
2c100 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20 20  al row"));..    
2c110 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20 74    /* Jump over t
2c120 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a 20  he subroutines. 
2c130 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2c140 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c150 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
2c160 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20 20  ddrEnd);..      
2c170 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
2c180 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75  broutine that ou
2c190 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20 72  tputs a single r
2c1a0 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  ow of the result
2c1b0 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 20  .      ** set.  
2c1c0 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  This subroutine 
2c1d0 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20 74  first looks at t
2c1e0 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49 66  he iUseFlag.  If
2c1f0 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20 20   iUseFlag.      
2c200 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ** is less than 
2c210 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
2c220 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  , the subroutine
2c230 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
2c240 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72  .      ** the pr
2c250 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20 66  ocessing calls f
2c260 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
2c270 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62 72  abort, this subr
2c280 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
2c290 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 69  increments the i
2c2a0 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72 79  AbortFlag memory
2c2b0 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72 65   location before
2c2c0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20 20   returning in.  
2c2d0 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f 20      ** order to 
2c2e0 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c 65  signal the calle
2c2f0 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20 20  r to abort..    
2c300 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 53    */.      addrS
2c310 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74 65  etAbort = sqlite
2c320 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2c330 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2c340 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2c350 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 69  OP_Integer, 1, i
2c360 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20  AbortFlag);.    
2c370 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2c380 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c 61  , "set abort fla
2c390 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2c3a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2c3b0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2c3c0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2c3d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2c3e0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
2c3f0 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
2c400 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20    addrOutputRow 
2c410 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2c420 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2c430 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c440 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
2c450 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64 72  , iUseFlag, addr
2c460 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20 20  OutputRow+2);.  
2c470 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c480 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65 73  (v, "Groupby res
2c490 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65 6e  ult generator en
2c4a0 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20 20  try point"));.  
2c4b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2c4c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2c4d0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
2c4e0 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  );.      finaliz
2c4f0 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
2c500 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2c510 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2c520 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
2c530 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72  e, pHaving, addr
2c540 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51 4c  OutputRow+1, SQL
2c550 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2c560 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
2c570 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2c580 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c  , p->pEList, -1,
2c590 20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20   pOrderBy,.     
2c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5b0 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65   &sDistinct, pDe
2c5c0 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
2c5d0 20 20 20 20 20 20 20 20 20 20 61 64 64 72 4f 75            addrOu
2c5e0 74 70 75 74 52 6f 77 2b 31 2c 20 61 64 64 72 53  tputRow+1, addrS
2c5f0 65 74 41 62 6f 72 74 29 3b 0a 20 20 20 20 20 20  etAbort);.      
2c600 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c610 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2c620 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
2c630 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2c640 28 28 76 2c 20 22 65 6e 64 20 67 72 6f 75 70 62  ((v, "end groupb
2c650 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
2c660 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
2c670 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
2c680 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
2c690 20 72 65 73 65 74 20 74 68 65 20 67 72 6f 75 70   reset the group
2c6a0 2d 62 79 20 61 63 63 75 6d 75 6c 61 74 6f 72 0a  -by accumulator.
2c6b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
2c6c0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2c6d0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 52 65  eLabel(v, addrRe
2c6e0 73 65 74 29 3b 0a 20 20 20 20 20 20 72 65 73 65  set);.      rese
2c6f0 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
2c700 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2c710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c720 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
2c730 65 74 75 72 6e 2c 20 72 65 67 52 65 73 65 74 29  eturn, regReset)
2c740 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d 20 2f 2a  ;.     .    } /*
2c750 20 65 6e 64 69 66 20 70 47 72 6f 75 70 42 79 2e   endif pGroupBy.
2c760 20 20 42 65 67 69 6e 20 61 67 67 72 65 67 61 74    Begin aggregat
2c770 65 20 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  e queries withou
2c780 74 20 47 52 4f 55 50 20 42 59 3a 20 2a 2f 0a 20  t GROUP BY: */. 
2c790 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20     else {.      
2c7a0 45 78 70 72 4c 69 73 74 20 2a 70 44 65 6c 20 3d  ExprList *pDel =
2c7b0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
2c7c0 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55  TE_OMIT_BTREECOU
2c7d0 4e 54 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  NT.      Table *
2c7e0 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
2c7f0 28 70 54 61 62 20 3d 20 69 73 53 69 6d 70 6c 65  (pTab = isSimple
2c800 43 6f 75 6e 74 28 70 2c 20 26 73 41 67 67 49 6e  Count(p, &sAggIn
2c810 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  fo))!=0 ){.     
2c820 20 20 20 2f 2a 20 49 66 20 69 73 53 69 6d 70 6c     /* If isSimpl
2c830 65 43 6f 75 6e 74 28 29 20 72 65 74 75 72 6e 73  eCount() returns
2c840 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
2c850 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2c  Table structure,
2c860 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
2c870 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
2c880 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
2c890 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  m:.        **.  
2c8a0 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43        **   SELEC
2c8b0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
2c8c0 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20 20 2a 2a  <tbl>.        **
2c8d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 72  .        ** wher
2c8e0 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
2c8f0 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 72  cture returned r
2c900 65 70 72 65 73 65 6e 74 73 20 74 61 62 6c 65 20  epresents table 
2c910 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20 20 20 2a  <tbl>..        *
2c920 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
2c930 73 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73  s statement is s
2c940 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20 69 74  o common that it
2c950 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 73 70   is optimized sp
2c960 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a 20 20 20  ecially. The.   
2c970 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74       ** OP_Count
2c980 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
2c990 65 78 65 63 75 74 65 64 20 65 69 74 68 65 72 20  executed either 
2c9a0 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79 20 74 61  on the intkey ta
2c9b0 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 20  ble that.       
2c9c0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65   ** contains the
2c9d0 20 64 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20   data for table 
2c9e0 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20  <tbl> or on one 
2c9f0 6f 66 20 69 74 73 20 69 6e 64 65 78 65 73 2e 20  of its indexes. 
2ca00 49 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  It.        ** is
2ca10 20 62 65 74 74 65 72 20 74 6f 20 65 78 65 63 75   better to execu
2ca20 74 65 20 74 68 65 20 6f 70 20 6f 6e 20 61 6e 20  te the op on an 
2ca30 69 6e 64 65 78 2c 20 61 73 20 69 6e 64 65 78 65  index, as indexe
2ca40 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a 20 20 20  s are almost.   
2ca50 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
2ca60 70 72 65 61 64 20 61 63 72 6f 73 73 20 6c 65 73  pread across les
2ca70 73 20 70 61 67 65 73 20 74 68 61 6e 20 74 68 65  s pages than the
2ca80 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ir corresponding
2ca90 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 20   tables..       
2caa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
2cab0 74 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69  t int iDb = sqli
2cac0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
2cad0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
2cae0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
2caf0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69       const int i
2cb00 43 73 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Csr = pParse->nT
2cb10 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 43 75 72  ab++;     /* Cur
2cb20 73 6f 72 20 74 6f 20 73 63 61 6e 20 62 2d 74 72  sor to scan b-tr
2cb30 65 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e  ee */.        In
2cb40 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
2cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb60 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
2cb70 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  ariable */.     
2cb80 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2cb90 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20 20  Info = 0;       
2cba0 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 69 6e          /* Keyin
2cbb0 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65 64 20 69  fo for scanned i
2cbc0 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
2cbd0 49 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30  Index *pBest = 0
2cbe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cbf0 20 20 20 20 20 2f 2a 20 42 65 73 74 20 69 6e 64       /* Best ind
2cc00 65 78 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20  ex found so far 
2cc10 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
2cc20 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e 74 6e 75  Root = pTab->tnu
2cc30 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2cc40 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
2cc50 73 63 61 6e 6e 65 64 20 62 2d 74 72 65 65 20 2a  scanned b-tree *
2cc60 2f 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  /..        sqlit
2cc70 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
2cc80 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
2cc90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2cca0 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
2ccb0 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
2ccc0 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
2ccd0 65 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  e);..        /* 
2cce0 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 69  Search for the i
2ccf0 6e 64 65 78 20 74 68 61 74 20 68 61 73 20 74 68  ndex that has th
2cd00 65 20 6c 6f 77 65 73 74 20 73 63 61 6e 20 63 6f  e lowest scan co
2cd10 73 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  st..        **. 
2cd20 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 31 2d         ** (2011-
2cd30 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f  04-15) Do not do
2cd40 20 61 20 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20   a full scan of 
2cd50 61 6e 20 75 6e 6f 72 64 65 72 65 64 20 69 6e 64  an unordered ind
2cd60 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
2cd70 20 20 20 20 20 20 20 2a 2a 20 28 32 30 31 33 2d         ** (2013-
2cd80 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74 20 63 6f  10-03) Do not co
2cd90 75 6e 74 20 74 68 65 20 65 6e 74 72 69 65 73 20  unt the entries 
2cda0 69 6e 20 61 20 70 61 72 74 69 61 6c 20 69 6e 64  in a partial ind
2cdb0 65 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ex..        **. 
2cdc0 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 70 72 61         ** In pra
2cdd0 63 74 69 63 65 20 74 68 65 20 4b 65 79 49 6e 66  ctice the KeyInf
2cde0 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 6c 6c  o structure will
2cdf0 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 49 74   not be used. It
2ce00 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20   is only .      
2ce10 20 20 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 6b    ** passed to k
2ce20 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  eep OP_OpenRead 
2ce30 68 61 70 70 79 2e 0a 20 20 20 20 20 20 20 20 2a  happy..        *
2ce40 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 48  /.        if( !H
2ce50 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
2ce60 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 33 50  pBest = sqlite3P
2ce70 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
2ce80 54 61 62 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  Tab);.        fo
2ce90 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
2cea0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
2ceb0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
2cec0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
2ced0 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a  ->bUnordered==0.
2cee0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49             && pI
2cef0 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61  dx->szIdxRow<pTa
2cf00 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20 20 20 20  b->szTabRow.    
2cf10 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
2cf20 70 50 61 72 74 49 64 78 57 68 65 72 65 3d 3d 30  pPartIdxWhere==0
2cf30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
2cf40 21 70 42 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e  !pBest || pIdx->
2cf50 73 7a 49 64 78 52 6f 77 3c 70 42 65 73 74 2d 3e  szIdxRow<pBest->
2cf60 73 7a 49 64 78 52 6f 77 29 0a 20 20 20 20 20 20  szIdxRow).      
2cf70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2cf80 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78 3b     pBest = pIdx;
2cf90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2cfa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2cfb0 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20  f( pBest ){.    
2cfc0 20 20 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42        iRoot = pB
2cfd0 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  est->tnum;.     
2cfe0 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20       pKeyInfo = 
2cff0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
2d000 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 42  Index(pParse, pB
2d010 65 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  est);.        }.
2d020 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
2d030 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
2d040 73 6f 72 2c 20 65 78 65 63 75 74 65 20 74 68 65  sor, execute the
2d050 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c 6f 73 65   OP_Count, close
2d060 20 74 68 65 20 63 75 72 73 6f 72 2e 20 2a 2f 0a   the cursor. */.
2d070 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2d080 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
2d090 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 43 73  OP_OpenRead, iCs
2d0a0 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62 2c 20 31  r, iRoot, iDb, 1
2d0b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2d0c0 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
2d0d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d0e0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
2d0f0 28 63 68 61 72 20 2a 29 70 4b 65 79 49 6e 66 6f  (char *)pKeyInfo
2d100 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
2d110 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d120 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d130 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20  p2(v, OP_Count, 
2d140 69 43 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61  iCsr, sAggInfo.a
2d150 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20  Func[0].iMem);. 
2d160 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d170 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
2d180 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20  lose, iCsr);.   
2d190 20 20 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70       explainSimp
2d1a0 6c 65 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20  leCount(pParse, 
2d1b0 70 54 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20  pTab, pBest);.  
2d1c0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
2d1d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2d1e0 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20  BTREECOUNT */.  
2d1f0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a      {.        /*
2d200 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 71 75   Check if the qu
2d210 65 72 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66  ery is of one of
2d220 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
2d230 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  orms:.        **
2d240 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
2d250 4c 45 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d  LECT min(x) FROM
2d260 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20   ....        ** 
2d270 20 20 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20    SELECT max(x) 
2d280 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20  FROM ....       
2d290 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
2d2a0 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73  f it is, then as
2d2b0 6b 20 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68  k the code in wh
2d2c0 65 72 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74  ere.c to attempt
2d2d0 20 74 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73   to sort results
2d2e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69  .        ** as i
2d2f0 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 22  f there was an "
2d300 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22  ORDER ON x" or "
2d310 4f 52 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22  ORDER ON x DESC"
2d320 20 63 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20   clause. .      
2d330 20 20 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20    ** If where.c 
2d340 69 73 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75  is able to produ
2d350 63 65 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65  ce results sorte
2d360 64 20 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c  d in this order,
2d370 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
2d380 20 61 64 64 20 76 64 62 65 20 63 6f 64 65 20 74   add vdbe code t
2d390 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
2d3a0 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f  he processing lo
2d3b0 6f 70 20 61 66 74 65 72 20 74 68 65 20 0a 20 20  op after the .  
2d3c0 20 20 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69        ** first i
2d3d0 74 65 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20  teration (since 
2d3e0 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
2d3f0 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  ion of the loop 
2d400 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  is .        ** g
2d410 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65  uaranteed to ope
2d420 72 61 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20  rate on the row 
2d430 77 69 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d  with the minimum
2d440 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20   or maximum .   
2d450 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
2d460 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77   x, the only row
2d470 20 72 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20   required)..    
2d480 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2d490 2a 20 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67  * A special flag
2d4a0 20 6d 75 73 74 20 62 65 20 70 61 73 73 65 64 20   must be passed 
2d4b0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
2d4c0 65 67 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74  egin() to slight
2d4d0 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f  ly.        ** mo
2d4e0 64 69 66 79 20 62 65 68 61 76 69 6f 72 20 61 73  dify behavior as
2d4f0 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20   follows:.      
2d500 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2d510 20 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79    + If the query
2d520 20 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69   is a "SELECT mi
2d530 6e 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20  n(x)", then the 
2d540 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20  loop coded by.  
2d550 20 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65        **     whe
2d560 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20  re.c should not 
2d570 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79  iterate over any
2d580 20 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e   values with a N
2d590 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20  ULL value.      
2d5a0 20 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a    **     for x..
2d5b0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2d5c0 20 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70     **   + The op
2d5d0 74 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20  timizer code in 
2d5e0 77 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69  where.c (the thi
2d5f0 6e 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20  ng that decides 
2d600 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
2d610 20 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e       index or in
2d620 64 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68  dices to use) sh
2d630 6f 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66  ould place a dif
2d640 66 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20  ferent priority 
2d650 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  on .        **  
2d660 20 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68     satisfying th
2d670 65 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61  e 'ORDER BY' cla
2d680 75 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73  use than it does
2d690 20 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e   in other cases.
2d6a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2d6b0 52 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e  Refer to code an
2d6c0 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68  d comments in wh
2d6d0 65 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c  ere.c for detail
2d6e0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2d6f0 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
2d700 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20  pMinMax = 0;.   
2d710 20 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 57       u8 flag = W
2d720 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52  HERE_ORDERBY_NOR
2d730 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  MAL;.        .  
2d740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
2d750 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
2d760 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d770 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flag==0 );.     
2d780 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e     if( p->pHavin
2d790 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
2d7a0 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d 61 78 51    flag = minMaxQ
2d7b0 75 65 72 79 28 26 73 41 67 67 49 6e 66 6f 2c 20  uery(&sAggInfo, 
2d7c0 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20 20 20 20  &pMinMax);.     
2d7d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2d7e0 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 7c 7c 20  ert( flag==0 || 
2d7f0 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26 26 20 70  (pMinMax!=0 && p
2d800 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
2d810 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ) );..        if
2d820 28 20 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  ( flag ){.      
2d830 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73 71      pMinMax = sq
2d840 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
2d850 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c 20 30 29  (db, pMinMax, 0)
2d860 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 6c  ;.          pDel
2d870 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20 20 20 20   = pMinMax;.    
2d880 20 20 20 20 20 20 69 66 28 20 70 4d 69 6e 4d 61        if( pMinMa
2d890 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  x && !db->malloc
2d8a0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
2d8b0 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
2d8c0 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
2d8d0 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f 52 44 45  flag!=WHERE_ORDE
2d8e0 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20  RBY_MIN ?1:0;.  
2d8f0 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
2d900 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  x->a[0].pExpr->o
2d910 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
2d920 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d930 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 20 20     }.  .        
2d940 2f 2a 20 54 68 69 73 20 63 61 73 65 20 72 75 6e  /* This case run
2d950 73 20 69 66 20 74 68 65 20 61 67 67 72 65 67 61  s if the aggrega
2d960 74 65 20 68 61 73 20 6e 6f 20 47 52 4f 55 50 20  te has no GROUP 
2d970 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
2d980 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65          ** proce
2d990 73 73 69 6e 67 20 69 73 20 6d 75 63 68 20 73 69  ssing is much si
2d9a0 6d 70 6c 65 72 20 73 69 6e 63 65 20 74 68 65 72  mpler since ther
2d9b0 65 20 69 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67  e is only a sing
2d9c0 6c 65 20 72 6f 77 0a 20 20 20 20 20 20 20 20 2a  le row.        *
2d9d0 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a 20 20 20  * of output..   
2d9e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2d9f0 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72  resetAccumulator
2da00 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e  (pParse, &sAggIn
2da10 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 57 49  fo);.        pWI
2da20 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
2da30 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
2da40 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
2da50 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66 6c 61 67  , pMinMax,0,flag
2da60 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
2da70 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20   pWInfo==0 ){.  
2da80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
2da90 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
2daa0 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pDel);.       
2dab0 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
2dac0 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
2dad0 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
2dae0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
2daf0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
2db00 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 69 6e      assert( pMin
2db10 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61  Max==0 || pMinMa
2db20 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20  x->nExpr==1 );. 
2db30 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2db40 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64  e3WhereIsOrdered
2db50 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
2db60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2db70 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2db80 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65 33 57 68  to, 0, sqlite3Wh
2db90 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 70 57  ereBreakLabel(pW
2dba0 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 20 20  Info));.        
2dbb0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2dbc0 2c 20 22 25 73 28 29 20 62 79 20 69 6e 64 65 78  , "%s() by index
2dbd0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2dbe0 20 20 20 28 66 6c 61 67 3d 3d 57 48 45 52 45 5f     (flag==WHERE_
2dbf0 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e  ORDERBY_MIN?"min
2dc00 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20 20 20 20  ":"max")));.    
2dc10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2dc20 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57  lite3WhereEnd(pW
2dc30 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 66  Info);.        f
2dc40 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
2dc50 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
2dc60 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  gInfo);.      }.
2dc70 0a 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20  .      pOrderBy 
2dc80 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
2dc90 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
2dca0 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61  arse, pHaving, a
2dcb0 64 64 72 45 6e 64 2c 20 53 51 4c 49 54 45 5f 4a  ddrEnd, SQLITE_J
2dcc0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2dcd0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
2dce0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
2dcf0 70 45 4c 69 73 74 2c 20 2d 31 2c 20 30 2c 20 30  pEList, -1, 0, 0
2dd00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2dd10 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2c 20           pDest, 
2dd20 61 64 64 72 45 6e 64 2c 20 61 64 64 72 45 6e 64  addrEnd, addrEnd
2dd30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2dd40 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
2dd50 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20 7d 0a  b, pDel);.    }.
2dd60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2dd70 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
2dd80 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 0a 20 20  ddrEnd);.    .  
2dd90 7d 20 2f 2a 20 65 6e 64 69 66 20 61 67 67 72 65  } /* endif aggre
2dda0 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 0a 20  gate query */.. 
2ddb0 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 65   if( sDistinct.e
2ddc0 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
2ddd0 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
2dde0 45 44 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  ED ){.    explai
2ddf0 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
2de00 65 2c 20 22 44 49 53 54 49 4e 43 54 22 29 3b 0a  e, "DISTINCT");.
2de10 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2de20 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
2de30 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 77  Y clause, then w
2de40 65 20 6e 65 65 64 20 74 6f 20 73 6f 72 74 20 74  e need to sort t
2de50 68 65 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20  he results.  ** 
2de60 61 6e 64 20 73 65 6e 64 20 74 68 65 6d 20 74 6f  and send them to
2de70 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e   the callback on
2de80 65 20 62 79 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  e by one..  */. 
2de90 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
2dea0 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
2deb0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 4f  Table(pParse, "O
2dec0 52 44 45 52 20 42 59 22 29 3b 0a 20 20 20 20 67  RDER BY");.    g
2ded0 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c 28  enerateSortTail(
2dee0 70 50 61 72 73 65 2c 20 70 2c 20 76 2c 20 70 45  pParse, p, v, pE
2def0 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 44 65  List->nExpr, pDe
2df00 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  st);.  }..  /* J
2df10 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
2df20 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2f   this query.  */
2df30 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
2df40 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 45  solveLabel(v, iE
2df50 6e 64 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  nd);..  /* The S
2df60 45 4c 45 43 54 20 77 61 73 20 73 75 63 63 65 73  ELECT was succes
2df70 73 66 75 6c 6c 79 20 63 6f 64 65 64 2e 20 20 20  sfully coded.   
2df80 53 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63  Set the return c
2df90 6f 64 65 20 74 6f 20 30 0a 20 20 2a 2a 20 74 6f  ode to 0.  ** to
2dfa0 20 69 6e 64 69 63 61 74 65 20 6e 6f 20 65 72 72   indicate no err
2dfb0 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ors..  */.  rc =
2dfc0 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f   0;..  /* Contro
2dfd0 6c 20 6a 75 6d 70 73 20 74 6f 20 68 65 72 65 20  l jumps to here 
2dfe0 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  if an error is e
2dff0 6e 63 6f 75 6e 74 65 72 65 64 20 61 62 6f 76 65  ncountered above
2e000 2c 20 6f 72 20 75 70 6f 6e 0a 20 20 2a 2a 20 73  , or upon.  ** s
2e010 75 63 63 65 73 73 66 75 6c 20 63 6f 64 69 6e 67  uccessful coding
2e020 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
2e030 20 20 2a 2f 0a 73 65 6c 65 63 74 5f 65 6e 64 3a    */.select_end:
2e040 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
2e050 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
2e060 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
2e070 53 65 6c 65 63 74 49 64 29 3b 0a 0a 20 20 2f 2a  SelectId);..  /*
2e080 20 49 64 65 6e 74 69 66 79 20 63 6f 6c 75 6d 6e   Identify column
2e090 20 6e 61 6d 65 73 20 69 66 20 72 65 73 75 6c 74   names if result
2e0a0 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
2e0b0 61 72 65 20 74 6f 20 62 65 20 6f 75 74 70 75 74  are to be output
2e0c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
2e0d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
2e0e0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
2e0f0 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 67 65  Output ){.    ge
2e100 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
2e110 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
2e120 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st, pEList);.  }
2e130 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
2e140 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
2e150 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Col);.  sqlite3D
2e160 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49 6e  bFree(db, sAggIn
2e170 66 6f 2e 61 46 75 6e 63 29 3b 0a 20 20 72 65 74  fo.aFunc);.  ret
2e180 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 64  urn rc;.}..#if d
2e190 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
2e1a0 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49  ABLE_TREE_EXPLAI
2e1b0 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  N)./*.** Generat
2e1c0 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  e a human-readab
2e1d0 6c 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  le description o
2e1e0 66 20 61 20 74 68 65 20 53 65 6c 65 63 74 20 6f  f a the Select o
2e1f0 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
2e200 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f 6e 65   void explainOne
2e210 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64  Select(Vdbe *pVd
2e220 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  be, Select *p){.
2e230 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e240 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 53  Printf(pVdbe, "S
2e250 45 4c 45 43 54 20 22 29 3b 0a 20 20 69 66 28 20  ELECT ");.  if( 
2e260 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  p->selFlags & (S
2e270 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
2e280 67 72 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20  gregate) ){.    
2e290 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2e2a0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
2e2b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2e2c0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2e2d0 65 2c 20 22 44 49 53 54 49 4e 43 54 20 22 29 3b  e, "DISTINCT ");
2e2e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2e2f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2e300 41 67 67 72 65 67 61 74 65 20 29 7b 0a 20 20 20  Aggregate ){.   
2e310 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e320 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2e330 61 67 67 5f 66 6c 61 67 20 22 29 3b 0a 20 20 20  agg_flag ");.   
2e340 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
2e350 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2e360 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2e370 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2e380 22 20 20 20 22 29 3b 0a 20 20 7d 0a 20 20 73 71  "   ");.  }.  sq
2e390 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2e3a0 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70  List(pVdbe, p->p
2e3b0 45 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  EList);.  sqlite
2e3c0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2e3d0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 72 63  );.  if( p->pSrc
2e3e0 20 26 26 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72   && p->pSrc->nSr
2e3f0 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  c ){.    int i;.
2e400 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2e410 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2e420 22 46 52 4f 4d 20 22 29 3b 0a 20 20 20 20 73 71  "FROM ");.    sq
2e430 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68  lite3ExplainPush
2e440 28 70 56 64 62 65 29 3b 0a 20 20 20 20 66 6f 72  (pVdbe);.    for
2e450 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d  (i=0; i<p->pSrc-
2e460 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2e470 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
2e480 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
2e490 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  &p->pSrc->a[i];.
2e4a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2e4b0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2e4c0 2c 20 22 7b 25 64 2c 2a 7d 20 3d 20 22 2c 20 70  , "{%d,*} = ", p
2e4d0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2e4e0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2e4f0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
2e500 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2e510 69 6e 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20  inSelect(pVdbe, 
2e520 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
2e530 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
2e540 65 6d 2d 3e 70 54 61 62 20 29 7b 0a 20 20 20 20  em->pTab ){.    
2e550 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2e560 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2e570 2c 20 22 20 28 74 61 62 6e 61 6d 65 3d 25 73 29  , " (tabname=%s)
2e580 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
2e590 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
2e5a0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2e5b0 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29  ( pItem->zName )
2e5c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e5d0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2e5e0 56 64 62 65 2c 20 22 25 73 22 2c 20 70 49 74 65  Vdbe, "%s", pIte
2e5f0 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  m->zName);.     
2e600 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74   }.      if( pIt
2e610 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
2e620 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2e630 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2e640 2c 20 22 20 28 41 53 20 25 73 29 22 2c 20 70 49  , " (AS %s)", pI
2e650 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
2e660 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2e670 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  pItem->jointype 
2e680 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  & JT_LEFT ){.   
2e690 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2e6a0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2e6b0 20 22 20 4c 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a   " LEFT-JOIN");.
2e6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2e6d0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2e6e0 56 64 62 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Vdbe);.    }.   
2e6f0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e700 6f 70 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  op(pVdbe);.  }. 
2e710 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 29   if( p->pWhere )
2e720 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2e730 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2e740 2c 20 22 57 48 45 52 45 20 22 29 3b 0a 20 20 20  , "WHERE ");.   
2e750 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
2e760 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 57  xpr(pVdbe, p->pW
2e770 68 65 72 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  here);.    sqlit
2e780 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2e790 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2e7a0 3e 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  >pGroupBy ){.   
2e7b0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e7c0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 47 52  rintf(pVdbe, "GR
2e7d0 4f 55 50 42 59 20 22 29 3b 0a 20 20 20 20 73 71  OUPBY ");.    sq
2e7e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
2e7f0 4c 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70  List(pVdbe, p->p
2e800 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 73 71  GroupBy);.    sq
2e810 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2e820 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
2e830 20 70 2d 3e 70 48 61 76 69 6e 67 20 29 7b 0a 20   p->pHaving ){. 
2e840 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e850 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2e860 48 41 56 49 4e 47 20 22 29 3b 0a 20 20 20 20 73  HAVING ");.    s
2e870 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
2e880 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 48 61 76  r(pVdbe, p->pHav
2e890 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
2e8a0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2e8b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2e8c0 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2e8d0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2e8e0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 52 44  intf(pVdbe, "ORD
2e8f0 45 52 42 59 20 22 29 3b 0a 20 20 20 20 73 71 6c  ERBY ");.    sql
2e900 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c  ite3ExplainExprL
2e910 69 73 74 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f  ist(pVdbe, p->pO
2e920 72 64 65 72 42 79 29 3b 0a 20 20 20 20 73 71 6c  rderBy);.    sql
2e930 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2e940 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
2e950 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
2e960 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e970 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4c 49  rintf(pVdbe, "LI
2e980 4d 49 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  MIT ");.    sqli
2e990 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2e9a0 56 64 62 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  Vdbe, p->pLimit)
2e9b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2e9c0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2e9d0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 66 66   }.  if( p->pOff
2e9e0 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  set ){.    sqlit
2e9f0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2ea00 70 56 64 62 65 2c 20 22 4f 46 46 53 45 54 20 22  pVdbe, "OFFSET "
2ea10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2ea20 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
2ea30 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20   p->pOffset);.  
2ea40 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2ea50 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 7d  NL(pVdbe);.  }.}
2ea60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
2ea70 6c 61 69 6e 53 65 6c 65 63 74 28 56 64 62 65 20  lainSelect(Vdbe 
2ea80 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20 2a  *pVdbe, Select *
2ea90 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
2eaa0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2eab0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2eac0 2c 20 22 28 6e 75 6c 6c 2d 73 65 6c 65 63 74 29  , "(null-select)
2ead0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
2eae0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
2eaf0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 2d  pPrior ){.    p-
2eb00 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d  >pPrior->pNext =
2eb10 20 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   p;.    p = p->p
2eb20 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 73 71 6c  Prior;.  }.  sql
2eb30 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28  ite3ExplainPush(
2eb40 70 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28  pVdbe);.  while(
2eb50 20 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69   p ){.    explai
2eb60 6e 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65  nOneSelect(pVdbe
2eb70 2c 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d  , p);.    p = p-
2eb80 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
2eb90 70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  p==0 ) break;.  
2eba0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2ebb0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73  NL(pVdbe);.    s
2ebc0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2ebd0 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e  ntf(pVdbe, "%s\n
2ebe0 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  ", selectOpName(
2ebf0 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73  p->op));.  }.  s
2ec00 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2ec10 6e 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22  ntf(pVdbe, "END"
2ec20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
2ec30 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d  ainPop(pVdbe);.}
2ec40 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ../* End of the 
2ec50 73 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20  structure debug 
2ec60 70 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a  printing code.**
2ec70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ec80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ec90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ecb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
2ecc0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
2ecd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
2ece0 45 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a        E_EXPLAIN) */.