/ Hex Artifact Content
Login

Artifact 01d0eca0938b588daabb36cd73e395309bdc6097:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  fset);.  sqlite3
0400: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0410: 2d 3e 70 57 69 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pWith);.}../*.
0420: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0430: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0440: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0450: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0460: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0470: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0480: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0490: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
04a0: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
04b0: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
04c0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04d0: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
04e0: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
04f0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0500: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0510: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0520: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0530: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0540: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0550: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0560: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0570: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0580: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0590: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
05a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
05b0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
05c0: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
05d0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
05e0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
05f0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0600: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0610: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0620: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0630: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0640: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0650: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0660: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0670: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0680: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0690: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
06a0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
06b0: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
06c0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
06d0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
06e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
06f0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0700: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0710: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0720: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0730: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0740: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0750: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0760: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0770: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0780: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0790: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
07a0: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
07b0: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07c0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07d0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07f0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0810: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0820: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0830: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0840: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0850: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0860: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0870: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0880: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0890: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
08a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
08b0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08c0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08d0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0900: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0910: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0920: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0930: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0940: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0950: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0960: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0970: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0980: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0990: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
09a0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09c0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09e0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09f0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0a00: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
0a10: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a20: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a30: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
0a40: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
0a50: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
0a60: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
0a70: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
0a80: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
0a90: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
0aa0: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
0ab0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0ac0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0ad0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ae0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0af0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0b00: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  ] = -1;.  if( db
0b10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0b20: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
0b30: 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ct(db, pNew);.  
0b40: 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61    if( pNew!=&sta
0b50: 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62  ndin ) sqlite3Db
0b60: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
0b70: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
0b80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
0b90: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
0ba0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
0bb0: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
0bc0: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
0bd0: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
0be0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0bf0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0c00: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0c10: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0c20: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0c40: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0c50: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0c60: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0c70: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0c80: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0c90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0ca0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0cb0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0cc0: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
0cd0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0ce0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0cf0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0d00: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0d10: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0d20: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0d30: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0d40: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0d50: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0d60: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0d70: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
0d80: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
0d90: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0da0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0db0: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0dc0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0dd0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0de0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0df0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0e00: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0e10: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0e20: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0e30: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0e40: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0e50: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0e60: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0e70: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0e80: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0e90: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
0ea0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0eb0: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0ec0: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0ed0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0ee0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0ef0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0f00: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
0f30: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
0f40: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
0f50: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0f60: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
0f70: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
0f80: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
0f90: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0fa0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
0fb0: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
0fc0: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
0fd0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
0fe0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
0ff0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
1000: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
1010: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
1020: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1030: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1040: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1050: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1060: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1070: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1080: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1090: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
10a0: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
10b0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
10c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
10d0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
10e0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
1110: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
1120: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1130: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1140: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1150: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1160: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1170: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1180: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1190: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
11a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
11b0: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
11c0: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
11d0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
11e0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
11f0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
1200: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
1210: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
1220: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1230: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1240: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1250: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1260: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1270: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1280: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1290: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
12a0: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
12b0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
12c0: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
12d0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
12e0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
12f0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1300: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1310: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1320: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1340: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1350: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1360: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1370: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1380: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1390: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
13a0: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
13b0: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
13c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
13e0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
13f0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1400: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1410: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1420: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1430: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1440: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1450: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1460: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1470: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1480: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1490: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14a0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
14b0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
14c0: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
14d0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
14e0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
14f0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1500: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1510: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1520: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1530: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1540: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1550: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1560: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1570: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1580: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1590: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
15a0: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
15b0: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
15c0: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
15d0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
15e0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
15f0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1600: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1610: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1620: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1630: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1640: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1650: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1670: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1680: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1690: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
16a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
16b0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
16c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
16d0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
16e0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
16f0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1700: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1710: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1720: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1730: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1740: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1750: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1760: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1770: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1780: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1790: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
17a0: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
17b0: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
17c0: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
17d0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
17e0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
17f0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1800: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1810: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1820: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
1830: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
1840: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
1850: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
1860: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
1870: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
1880: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
1890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18a0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
18b0: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
18c0: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
18d0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
18e0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
18f0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
1900: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
1910: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
1920: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
1930: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
1940: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
1950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1960: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
1970: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
1980: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
1990: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
19a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
19b0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
19c0: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
19d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
19e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19f0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
1a00: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
1a10: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
1a20: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
1a30: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
1a40: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
1a50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
1a60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
1a70: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
1a80: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
1a90: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
1aa0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
1ab0: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
1ac0: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
1ad0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
1ae0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
1af0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1b00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
1b20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1b30: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
1b40: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
1b50: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
1b60: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
1b70: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
1b80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1b90: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
1ba0: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
1bb0: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
1bc0: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
1bd0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1be0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
1bf0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
1c00: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
1c10: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
1c20: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
1c30: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
1c40: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
1c50: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
1c60: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
1c70: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
1c80: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
1c90: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
1ca0: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
1cb0: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1cc0: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
1cd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1cf0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d00: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1d30: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
1d40: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
1d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1d70: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
1d80: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
1d90: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
1da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1db0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1dc0: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
1dd0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1de0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
1df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1e00: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
1e10: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
1e20: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1e50: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
1e60: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
1e70: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e90: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
1ea0: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
1eb0: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
1ee0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
1ef0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
1f00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1f10: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
1f20: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
1f30: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
1f40: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
1f50: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
1f60: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
1f70: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1f80: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
1f90: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
1fa0: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
1fb0: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
1fc0: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
1fd0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
1fe0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
1ff0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
2000: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
2010: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
2020: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2030: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2040: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2050: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2060: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2070: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2080: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2090: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20a0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
20b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20c0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
20e0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
20f0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2100: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2110: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2120: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2130: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2140: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2150: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2160: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2170: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2180: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2190: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
21a0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
21b0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
21c0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
21d0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
21e0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
21f0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2200: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2210: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2220: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2230: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2240: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2250: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2260: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2270: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2280: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2290: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
22a0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
22b0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
22c0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
22d0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
22e0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
22f0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2300: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2310: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2320: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2330: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2340: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2350: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2360: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2370: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2380: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2390: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
23a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
23b0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
23c0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
23e0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
23f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2400: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2410: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2420: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2430: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2440: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2450: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2460: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2470: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2480: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2490: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
24a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
24b0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
24c0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
24d0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
24e0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
24f0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2500: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2510: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2520: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2530: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2540: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2550: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2560: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2570: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2580: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2590: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
25a0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
25b0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
25c0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
25d0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
25e0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
25f0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2600: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2610: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2620: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2630: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2640: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2650: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2660: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2670: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2680: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2690: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
26a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
26b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
26c0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
26d0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
26e0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
26f0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2700: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2710: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2720: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2730: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2740: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2750: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2770: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2780: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2790: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
27a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
27b0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
27c0: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
27d0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
27e0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
27f0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2800: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2810: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2820: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
2830: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
2840: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
2850: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
2860: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
2870: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
2880: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
2890: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
28a0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
28b0: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
28c0: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
28d0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
28e0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
28f0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
2900: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
2910: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
2920: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
2930: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
2940: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
2950: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
2960: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
2970: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
2980: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
2990: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
29a0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
29b0: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
29c0: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
29d0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29e0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29f0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
2a00: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2a10: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
2a20: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
2a30: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2a40: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
2a70: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a80: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
2a90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ab0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
2ac0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ad0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
2ae0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
2af0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
2b00: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b10: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
2b20: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
2b30: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
2b40: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
2b50: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
2b60: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
2b70: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
2b80: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
2b90: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
2ba0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
2bc0: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
2bd0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
2be0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
2bf0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
2c00: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
2c10: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
2c20: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
2c30: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
2c40: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
2c50: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
2c60: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2c70: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
2c80: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
2c90: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
2ca0: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
2cb0: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
2cc0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
2cd0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
2ce0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
2cf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d00: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
2d10: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
2d20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
2d30: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
2d40: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
2d50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
2d70: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
2d80: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
2d90: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
2da0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
2db0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
2dc0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
2dd0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2de0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
2df0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
2e00: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
2e10: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
2e20: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
2e30: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
2e40: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
2e50: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
2e60: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
2e70: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
2e80: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
2e90: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
2ea0: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
2eb0: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
2ec0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
2ed0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
2ee0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
2ef0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
2f00: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
2f10: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
2f20: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2f30: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
2f40: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
2f50: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2f70: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
2f80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2fa0: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
2fb0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2fc0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2fd0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
2fe0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2ff0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
3000: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
3010: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3020: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3030: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3040: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3050: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3060: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3080: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3090: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
30a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
30b0: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
30c0: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
30d0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
30e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
30f0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
3100: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
3110: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
3120: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3130: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3140: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3150: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3160: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3170: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3180: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3190: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
31a0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
31b0: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
31c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
31d0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
31e0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
31f0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
3200: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
3210: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
3220: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3230: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3240: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3250: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3260: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3270: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3280: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3290: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
32a0: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
32b0: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
32c0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
32d0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
32e0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
32f0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3300: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3310: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3320: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3330: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3340: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3350: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3360: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3370: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3380: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
33a0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
33b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
33c0: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
33d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
33e0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
33f0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3400: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3410: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3430: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3440: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3450: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3460: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3470: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3480: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3490: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
34a0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
34b0: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
34c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
34d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
34e0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
34f0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3500: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3510: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3520: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3530: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3540: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3550: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3560: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3570: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3590: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
35a0: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
35b0: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
35c0: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
35d0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
35e0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
35f0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3620: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3630: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3640: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3650: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3680: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3690: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
36a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
36b0: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
36c0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
36d0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
36e0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
36f0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
3700: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
3710: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
3720: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
3730: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3740: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3750: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3760: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
3770: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
3780: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
3790: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
37a0: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
37b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
37c0: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20  /.  int regData 
37d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37e0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
37f0: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
3800: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3810: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3820: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
3830: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3840: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3850: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3860: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
3870: 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67  pr+2);.  int reg
3880: 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
3890: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
38a0: 65 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20  e);.  int op;.  
38b0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
38c0: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
38d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
38e0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
38f0: 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61   pOrderBy, regBa
3900: 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  se, 0);.  sqlite
3910: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3920: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
3930: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3940: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
3950: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3960: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
3970: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
3980: 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71  Expr+1, 1);.  sq
3990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
39a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
39b0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
39c0: 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29   + 2, regRecord)
39d0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  ;.  if( pSelect-
39e0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
39f0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
3a00: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
3a10: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
3a20: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
3a30: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
3a40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3a50: 20 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69   op, pOrderBy->i
3a60: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
3a70: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
3a80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
3a90: 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
3aa0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
3ab0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
3ac0: 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  e, regBase, nExp
3ad0: 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  r+2);.  if( pSel
3ae0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ect->iLimit ){. 
3af0: 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
3b00: 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  dr2;.    int iLi
3b10: 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65  mit;.    if( pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b  lect->iOffset ){
3b30: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
3b40: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
3b50: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
3b60: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
3b70: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
3b80: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d     }.    addr1 =
3b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ba0: 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p1(v, OP_IfZero,
3bb0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71   iLimit);.    sq
3bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3bd0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c  v, OP_AddImm, iL
3be0: 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  imit, -1);.    a
3bf0: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
3c00: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
3c10: 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oto);.    sqlite
3c20: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3c30: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
3c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3c50: 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65  , OP_Last, pOrde
3c60: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
3c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3c80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
3c90: 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  te, pOrderBy->iE
3ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
3cb0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3cc0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
3cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
3ce0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
3cf0: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
3d00: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
3d10: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
3d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3d30: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3d40: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
3d50: 69 4f 66 66 73 65 74 2c 20 20 20 20 20 20 2f 2a  iOffset,      /*
3d60: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
3d70: 67 20 74 68 65 20 6f 66 66 73 65 74 20 63 6f 75  g the offset cou
3d80: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43  nter */.  int iC
3d90: 6f 6e 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a  ontinue     /* J
3da0: 75 6d 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70  ump here to skip
3db0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 63   the current rec
3dc0: 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ord */.){.  if( 
3dd0: 69 4f 66 66 73 65 74 3e 30 20 26 26 20 69 43 6f  iOffset>0 && iCo
3de0: 6e 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20  ntinue!=0 ){.   
3df0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73   int addr;.    s
3e00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3e10: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
3e20: 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20 20  Offset, -1);.   
3e30: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
3e40: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
3e50: 49 66 4e 65 67 2c 20 69 4f 66 66 73 65 74 29 3b  IfNeg, iOffset);
3e60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3e70: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
3e80: 6f 2c 20 30 2c 20 69 43 6f 6e 74 69 6e 75 65 29  o, 0, iContinue)
3e90: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
3ea0: 74 28 28 76 2c 20 22 73 6b 69 70 20 4f 46 46 53  t((v, "skip OFFS
3eb0: 45 54 20 72 65 63 6f 72 64 73 22 29 29 3b 0a 20  ET records"));. 
3ec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3ed0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
3ee0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
3ef0: 64 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  d code that will
3f00: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
3f10: 75 72 65 20 74 68 65 20 4e 20 72 65 67 69 73 74  ure the N regist
3f20: 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
3f30: 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d 20 61 20 64  iMem.** form a d
3f40: 69 73 74 69 6e 63 74 20 65 6e 74 72 79 2e 20 20  istinct entry.  
3f50: 69 54 61 62 20 69 73 20 61 20 73 6f 72 74 69 6e  iTab is a sortin
3f60: 67 20 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c  g index that hol
3f70: 64 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  ds previously.**
3f80: 20 73 65 65 6e 20 63 6f 6d 62 69 6e 61 74 69 6f   seen combinatio
3f90: 6e 73 20 6f 66 20 74 68 65 20 4e 20 76 61 6c 75  ns of the N valu
3fa0: 65 73 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  es.  A new entry
3fb0: 20 69 73 20 6d 61 64 65 20 69 6e 20 69 54 61 62   is made in iTab
3fc0: 0a 2a 2a 20 69 66 20 74 68 65 20 63 75 72 72 65  .** if the curre
3fd0: 6e 74 20 4e 20 76 61 6c 75 65 73 20 61 72 65 20  nt N values are 
3fe0: 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 75 6d  new..**.** A jum
3ff0: 70 20 74 6f 20 61 64 64 72 52 65 70 65 61 74 20  p to addrRepeat 
4000: 69 73 20 6d 61 64 65 20 61 6e 64 20 74 68 65 20  is made and the 
4010: 4e 2b 31 20 76 61 6c 75 65 73 20 61 72 65 20 70  N+1 values are p
4020: 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a  opped from the.*
4030: 2a 20 73 74 61 63 6b 20 69 66 20 74 68 65 20 74  * stack if the t
4040: 6f 70 20 4e 20 65 6c 65 6d 65 6e 74 73 20 61 72  op N elements ar
4050: 65 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 2e 0a  e not distinct..
4060: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
4070: 6f 64 65 44 69 73 74 69 6e 63 74 28 0a 20 20 50  odeDistinct(.  P
4080: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4090: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
40a0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
40b0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
40c0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
40d0: 20 2f 2a 20 41 20 73 6f 72 74 69 6e 67 20 69 6e   /* A sorting in
40e0: 64 65 78 20 75 73 65 64 20 74 6f 20 74 65 73 74  dex used to test
40f0: 20 66 6f 72 20 64 69 73 74 69 6e 63 74 6e 65 73   for distinctnes
4100: 73 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 52  s */.  int addrR
4110: 65 70 65 61 74 2c 20 20 20 20 2f 2a 20 4a 75 6d  epeat,    /* Jum
4120: 70 20 74 6f 20 68 65 72 65 20 69 66 20 6e 6f 74  p to here if not
4130: 20 64 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 69   distinct */.  i
4140: 6e 74 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20  nt N,           
4150: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
4160: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
4170: 20 69 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20   iMem           
4180: 2f 2a 20 46 69 72 73 74 20 65 6c 65 6d 65 6e 74  /* First element
4190: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
41a0: 3b 0a 20 20 69 6e 74 20 72 31 3b 0a 0a 20 20 76  ;.  int r1;..  v
41b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
41c0: 3b 0a 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33  ;.  r1 = sqlite3
41d0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
41e0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
41f0: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
4200: 5f 46 6f 75 6e 64 2c 20 69 54 61 62 2c 20 61 64  _Found, iTab, ad
4210: 64 72 52 65 70 65 61 74 2c 20 69 4d 65 6d 2c 20  drRepeat, iMem, 
4220: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  N);.  sqlite3Vdb
4230: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
4240: 6b 65 52 65 63 6f 72 64 2c 20 69 4d 65 6d 2c 20  keRecord, iMem, 
4250: 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  N, r1);.  sqlite
4260: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
4270: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 54 61  P_IdxInsert, iTa
4280: 62 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65  b, r1);.  sqlite
4290: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
42a0: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
42b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
42c0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
42d0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 65  ** Generate an e
42e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
42f0: 6e 20 61 20 53 45 4c 45 43 54 20 69 73 20 75 73  n a SELECT is us
4300: 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62 65  ed within a sube
4310: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 28 65 78  xpression.** (ex
4320: 61 6d 70 6c 65 3a 20 20 22 61 20 49 4e 20 28 53  ample:  "a IN (S
4330: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62  ELECT * FROM tab
4340: 6c 65 29 22 29 20 62 75 74 20 69 74 20 68 61 73  le)") but it has
4350: 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 72 65 73   more than 1 res
4360: 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 20 20  ult.** column.  
4370: 57 65 20 64 6f 20 74 68 69 73 20 69 6e 20 61 20  We do this in a 
4380: 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63 61 75  subroutine becau
4390: 73 65 20 74 68 65 20 65 72 72 6f 72 20 75 73 65  se the error use
43a0: 64 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 69 6e  d to occur.** in
43b0: 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65 73   multiple places
43c0: 2e 20 20 28 54 68 65 20 65 72 72 6f 72 20 6f 6e  .  (The error on
43d0: 6c 79 20 6f 63 63 75 72 73 20 69 6e 20 6f 6e 65  ly occurs in one
43e0: 20 70 6c 61 63 65 20 6e 6f 77 2c 20 62 75 74 20   place now, but 
43f0: 77 65 0a 2a 2a 20 72 65 74 61 69 6e 20 74 68 65  we.** retain the
4400: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d   subroutine to m
4410: 69 6e 69 6d 69 7a 65 20 63 6f 64 65 20 64 69 73  inimize code dis
4420: 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f 0a 73 74 61  ruption.).*/.sta
4430: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72  tic int checkFor
4440: 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63  MultiColumnSelec
4450: 74 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  tError(.  Parse 
4460: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
4470: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 2e  * Parse context.
4480: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
4490: 20 2a 70 44 65 73 74 2c 20 20 20 2f 2a 20 44 65   *pDest,   /* De
44a0: 73 74 69 6e 61 74 69 6f 6e 20 6f 66 20 53 45 4c  stination of SEL
44b0: 45 43 54 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  ECT results */. 
44c0: 20 69 6e 74 20 6e 45 78 70 72 20 20 20 20 20 20   int nExpr      
44d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
44e0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
44f0: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 45  s returned by SE
4500: 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  LECT */.){.  int
4510: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4520: 65 44 65 73 74 3b 0a 20 20 69 66 28 20 6e 45 78  eDest;.  if( nEx
4530: 70 72 3e 31 20 26 26 20 28 65 44 65 73 74 3d 3d  pr>1 && (eDest==
4540: 53 52 54 5f 4d 65 6d 20 7c 7c 20 65 44 65 73 74  SRT_Mem || eDest
4550: 3d 3d 53 52 54 5f 53 65 74 29 20 29 7b 0a 20 20  ==SRT_Set) ){.  
4560: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4570: 67 28 70 50 61 72 73 65 2c 20 22 6f 6e 6c 79 20  g(pParse, "only 
4580: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
4590: 61 6c 6c 6f 77 65 64 20 66 6f 72 20 22 0a 20 20  allowed for ".  
45a0: 20 20 20 20 20 22 61 20 53 45 4c 45 43 54 20 74       "a SELECT t
45b0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
45c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 22 29 3b 0a  n expression");.
45d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
45e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
45f0: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  n 0;.  }.}.#endi
4600: 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  f../*.** An inst
4610: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
4620: 6f 77 69 6e 67 20 6f 62 6a 65 63 74 20 69 73 20  owing object is 
4630: 75 73 65 64 20 74 6f 20 72 65 63 6f 72 64 20 69  used to record i
4640: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
4650: 0a 2a 2a 20 68 6f 77 20 74 6f 20 70 72 6f 63 65  .** how to proce
4660: 73 73 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ss the DISTINCT 
4670: 6b 65 79 77 6f 72 64 2c 20 74 6f 20 73 69 6d 70  keyword, to simp
4680: 6c 69 66 79 20 70 61 73 73 69 6e 67 20 74 68 61  lify passing tha
4690: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  t information.**
46a0: 20 69 6e 74 6f 20 74 68 65 20 73 65 6c 65 63 74   into the select
46b0: 49 6e 6e 65 72 4c 6f 6f 70 28 29 20 72 6f 75 74  InnerLoop() rout
46c0: 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ine..*/.typedef 
46d0: 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43  struct DistinctC
46e0: 74 78 20 44 69 73 74 69 6e 63 74 43 74 78 3b 0a  tx DistinctCtx;.
46f0: 73 74 72 75 63 74 20 44 69 73 74 69 6e 63 74 43  struct DistinctC
4700: 74 78 20 7b 0a 20 20 75 38 20 69 73 54 6e 63 74  tx {.  u8 isTnct
4710: 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
4720: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
4730: 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e  eyword is presen
4740: 74 20 2a 2f 0a 20 20 75 38 20 65 54 6e 63 74 54  t */.  u8 eTnctT
4750: 79 70 65 3b 20 20 20 2f 2a 20 4f 6e 65 20 6f 66  ype;   /* One of
4760: 20 74 68 65 20 57 48 45 52 45 5f 44 49 53 54 49   the WHERE_DISTI
4770: 4e 43 54 5f 2a 20 6f 70 65 72 61 74 6f 72 73 20  NCT_* operators 
4780: 2a 2f 0a 20 20 69 6e 74 20 74 61 62 54 6e 63 74  */.  int tabTnct
4790: 3b 20 20 20 20 2f 2a 20 45 70 68 65 6d 65 72 61  ;    /* Ephemera
47a0: 6c 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72  l table used for
47b0: 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
47c0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 61 64  sing */.  int ad
47d0: 64 72 54 6e 63 74 3b 20 20 20 2f 2a 20 41 64 64  drTnct;   /* Add
47e0: 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 45  ress of OP_OpenE
47f0: 70 68 65 6d 65 72 61 6c 20 6f 70 63 6f 64 65 20  phemeral opcode 
4800: 66 6f 72 20 74 61 62 54 6e 63 74 20 2a 2f 0a 7d  for tabTnct */.}
4810: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  ;../*.** This ro
4820: 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20  utine generates 
4830: 74 68 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  the code for the
4840: 20 69 6e 73 69 64 65 20 6f 66 20 74 68 65 20 69   inside of the i
4850: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
4860: 61 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  a SELECT..**.** 
4870: 49 66 20 73 72 63 54 61 62 20 69 73 20 6e 65 67  If srcTab is neg
4880: 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 65 20  ative, then the 
4890: 70 45 4c 69 73 74 20 65 78 70 72 65 73 73 69 6f  pEList expressio
48a0: 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c 75 61  ns.** are evalua
48b0: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
48c0: 67 65 74 20 74 68 65 20 64 61 74 61 20 66 6f 72  get the data for
48d0: 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66 20 73   this row.  If s
48e0: 72 63 54 61 62 20 69 73 0a 2a 2a 20 7a 65 72 6f  rcTab is.** zero
48f0: 20 6f 72 20 6d 6f 72 65 2c 20 74 68 65 6e 20 64   or more, then d
4900: 61 74 61 20 69 73 20 70 75 6c 6c 65 64 20 66 72  ata is pulled fr
4910: 6f 6d 20 73 72 63 54 61 62 20 61 6e 64 20 70 45  om srcTab and pE
4920: 4c 69 73 74 20 69 73 20 75 73 65 64 20 6f 6e 6c  List is used onl
4930: 79 20 0a 2a 2a 20 74 6f 20 67 65 74 20 6e 75 6d  y .** to get num
4940: 62 65 72 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  ber columns and 
4950: 74 68 65 20 64 61 74 61 74 79 70 65 20 66 6f 72  the datatype for
4960: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f   each column..*/
4970: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
4980: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20 20  ectInnerLoop(.  
4990: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
49a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
49b0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
49c0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
49d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
49e0: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65 63  e complete selec
49f0: 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  t statement bein
4a00: 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78 70  g coded */.  Exp
4a10: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
4a20: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
4a30: 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78 74  values being ext
4a40: 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  racted */.  int 
4a50: 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20 20  srcTab,         
4a60: 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74 61      /* Pull data
4a70: 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c 65   from this table
4a80: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4a90: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
4aa0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 6f   If not NULL, so
4ab0: 72 74 20 72 65 73 75 6c 74 73 20 75 73 69 6e 67  rt results using
4ac0: 20 74 68 69 73 20 6b 65 79 20 2a 2f 0a 20 20 44   this key */.  D
4ad0: 69 73 74 69 6e 63 74 43 74 78 20 2a 70 44 69 73  istinctCtx *pDis
4ae0: 74 69 6e 63 74 2c 20 2f 2a 20 49 66 20 6e 6f 74  tinct, /* If not
4af0: 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20 6f 6e 20 68   NULL, info on h
4b00: 6f 77 20 74 6f 20 70 72 6f 63 65 73 73 20 44 49  ow to process DI
4b10: 53 54 49 4e 43 54 20 2a 2f 0a 20 20 53 65 6c 65  STINCT */.  Sele
4b20: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
4b30: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69      /* How to di
4b40: 73 70 6f 73 65 20 6f 66 20 74 68 65 20 72 65 73  spose of the res
4b50: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ults */.  int iC
4b60: 6f 6e 74 69 6e 75 65 2c 20 20 20 20 20 20 20 20  ontinue,        
4b70: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
4b80: 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
4b90: 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  next row */.  in
4ba0: 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
4bb0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4bc0: 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
4bd0: 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  of the inner loo
4be0: 70 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  p */.){.  Vdbe *
4bf0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
4c00: 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
4c10: 74 20 68 61 73 44 69 73 74 69 6e 63 74 3b 20 20  t hasDistinct;  
4c20: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
4c30: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4c40: 79 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74  yword is present
4c50: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 73   */.  int regRes
4c60: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
4c70: 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6d 65    /* Start of me
4c80: 6d 6f 72 79 20 68 6f 6c 64 69 6e 67 20 72 65 73  mory holding res
4c90: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74  ult set */.  int
4ca0: 20 65 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e   eDest = pDest->
4cb0: 65 44 65 73 74 3b 20 20 20 2f 2a 20 48 6f 77 20  eDest;   /* How 
4cc0: 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 72 65  to dispose of re
4cd0: 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 69  sults */.  int i
4ce0: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53  Parm = pDest->iS
4cf0: 44 50 61 72 6d 3b 20 2f 2a 20 46 69 72 73 74 20  DParm; /* First 
4d00: 61 72 67 75 6d 65 6e 74 20 74 6f 20 64 69 73 70  argument to disp
4d10: 6f 73 61 6c 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  osal method */. 
4d20: 20 69 6e 74 20 6e 52 65 73 75 6c 74 43 6f 6c 3b   int nResultCol;
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d40: 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  Number of result
4d50: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 61   columns */..  a
4d60: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 61 73  ssert( v );.  as
4d70: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
4d80: 29 3b 0a 20 20 68 61 73 44 69 73 74 69 6e 63 74  );.  hasDistinct
4d90: 20 3d 20 70 44 69 73 74 69 6e 63 74 20 3f 20 70   = pDistinct ? p
4da0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
4db0: 79 70 65 20 3a 20 57 48 45 52 45 5f 44 49 53 54  ype : WHERE_DIST
4dc0: 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 69 66 28  INCT_NOOP;.  if(
4dd0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
4de0: 21 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a  !hasDistinct ){.
4df0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
4e00: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
4e10: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 7d 0a 0a 20  ontinue);.  }.. 
4e20: 20 2f 2a 20 50 75 6c 6c 20 74 68 65 20 72 65 71   /* Pull the req
4e30: 75 65 73 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  uested columns..
4e40: 20 20 2a 2f 0a 20 20 6e 52 65 73 75 6c 74 43 6f    */.  nResultCo
4e50: 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  l = pEList->nExp
4e60: 72 3b 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  r;.  if( pDest->
4e70: 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  iSdst==0 ){.    
4e80: 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 70  pDest->iSdst = p
4e90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
4ea0: 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20     pDest->nSdst 
4eb0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4ec0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
4ed0: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
4ee0: 7d 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65  }else{ .    asse
4ef0: 72 74 28 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  rt( pDest->nSdst
4f00: 3d 3d 6e 52 65 73 75 6c 74 43 6f 6c 20 29 3b 0a  ==nResultCol );.
4f10: 20 20 7d 0a 20 20 72 65 67 52 65 73 75 6c 74 20    }.  regResult 
4f20: 3d 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a  = pDest->iSdst;.
4f30: 20 20 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20    if( srcTab>=0 
4f40: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4f50: 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b  i<nResultCol; i+
4f60: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4f70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4f80: 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62  P_Column, srcTab
4f90: 2c 20 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69  , i, regResult+i
4fa0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
4fb0: 6d 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70  ment((v, "%s", p
4fc0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
4fd0: 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  e));.    }.  }el
4fe0: 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53 52  se if( eDest!=SR
4ff0: 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  T_Exists ){.    
5000: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
5010: 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53  ation is an EXIS
5020: 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69  TS(...) expressi
5030: 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20  on, the actual. 
5040: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74     ** values ret
5050: 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c  urned by the SEL
5060: 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75  ECT are not requ
5070: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
5080: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
5090: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
50a0: 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75   pEList, regResu
50b0: 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  lt,.            
50c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50d0: 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  (eDest==SRT_Outp
50e0: 75 74 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f  ut)?SQLITE_ECEL_
50f0: 44 55 50 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  DUP:0);.  }..  /
5100: 2a 20 49 66 20 74 68 65 20 44 49 53 54 49 4e 43  * If the DISTINC
5110: 54 20 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72  T keyword was pr
5120: 65 73 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c  esent on the SEL
5130: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
5140: 2a 2a 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20  ** and this row 
5150: 68 61 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65  has been seen be
5160: 66 6f 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  fore, then do no
5170: 74 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a  t make this row.
5180: 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65    ** part of the
5190: 20 72 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20   result..  */.  
51a0: 69 66 28 20 68 61 73 44 69 73 74 69 6e 63 74 20  if( hasDistinct 
51b0: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70  ){.    switch( p
51c0: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
51d0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
51e0: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
51f0: 5f 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20  _ORDERED: {.    
5200: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b      VdbeOp *pOp;
5210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5220: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
5230: 64 20 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  d OpenEphemeral 
5240: 69 6e 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20  instr. */.      
5250: 20 20 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20    int iJump;    
5260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
5270: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f  p destination */
5280: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
5290: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
52a0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
52b0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20   content */..   
52c0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
52d0: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 70   space for the p
52e0: 72 65 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20  revious row */. 
52f0: 20 20 20 20 20 20 20 72 65 67 50 72 65 76 20 3d         regPrev =
5300: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
5310: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
5320: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
5330: 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  Col;..        /*
5340: 20 43 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f   Change the OP_O
5350: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64  penEphemeral cod
5360: 65 64 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e  ed earlier to an
5370: 20 4f 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20   OP_Null.       
5380: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d   ** sets the MEM
5390: 5f 43 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20  _Cleared bit on 
53a0: 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74  the first regist
53b0: 65 72 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  er of the.      
53c0: 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61    ** previous va
53d0: 6c 75 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  lue.  This will 
53e0: 63 61 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20  cause the OP_Ne 
53f0: 62 65 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a  below to always.
5400: 20 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20          ** fail 
5410: 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65  on the first ite
5420: 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
5430: 6f 70 20 65 76 65 6e 20 69 66 20 74 68 65 20 66  op even if the f
5440: 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  irst.        ** 
5450: 72 6f 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73  row is all NULLs
5460: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
5470: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5480: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
5490: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
54a0: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  nct);.        pO
54b0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47  p = sqlite3VdbeG
54c0: 65 74 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63  etOp(v, pDistinc
54d0: 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20  t->addrTnct);.  
54e0: 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
54f0: 65 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20  e = OP_Null;.   
5500: 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31       pOp->p1 = 1
5510: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
5520: 32 20 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20  2 = regPrev;..  
5530: 20 20 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71        iJump = sq
5540: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5550: 41 64 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c  Addr(v) + nResul
5560: 74 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f  tCol;.        fo
5570: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74  r(i=0; i<nResult
5580: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
5590: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
55a0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
55b0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
55c0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
55d0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  xpr);.          
55e0: 69 66 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c  if( i<nResultCol
55f0: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
5600: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5610: 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65  Op3(v, OP_Ne, re
5620: 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70  gResult+i, iJump
5630: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
5640: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5650: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
5660: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5670: 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74  OP_Eq, regResult
5680: 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72  +i, iContinue, r
5690: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
56a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
56b0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
56c0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
56d0: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
56e0: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
56f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5700: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
5710: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
5720: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5730: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5740: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
5750: 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20 20  v)==iJump );.   
5760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5770: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
5780: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
5790: 67 50 72 65 76 2c 20 6e 52 65 73 75 6c 74 43 6f  gPrev, nResultCo
57a0: 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 62 72  l-1);.        br
57b0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
57c0: 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
57d0: 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20  ISTINCT_UNIQUE: 
57e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
57f0: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5800: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5810: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5830: 7d 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  }..      default
5840: 3a 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  : {.        asse
5850: 72 74 28 20 70 44 69 73 74 69 6e 63 74 2d 3e 65  rt( pDistinct->e
5860: 54 6e 63 74 54 79 70 65 3d 3d 57 48 45 52 45 5f  TnctType==WHERE_
5870: 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
5880: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  ED );.        co
5890: 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72 73  deDistinct(pPars
58a0: 65 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 74 61  e, pDistinct->ta
58b0: 62 54 6e 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65  bTnct, iContinue
58c0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 65  , nResultCol, re
58d0: 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  gResult);.      
58e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
58f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
5900: 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
5910: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
5920: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43  , p->iOffset, iC
5930: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a  ontinue);.    }.
5940: 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 65    }..  switch( e
5950: 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Dest ){.    /* I
5960: 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72 69  n this mode, wri
5970: 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72 65  te each query re
5980: 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79 20  sult to the key 
5990: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
59a0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69 50  .    ** table iP
59b0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  arm..    */.#ifn
59c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
59d0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
59e0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e 69      case SRT_Uni
59f0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  on: {.      int 
5a00: 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73  r1;.      r1 = s
5a10: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5a20: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5a30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5a40: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5a50: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
5a60: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
5a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5a80: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
5a90: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
5aa0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
5ab0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
5ac0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
5ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5ae0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75  ..    /* Constru
5af0: 63 74 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d  ct a record from
5b00: 20 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c   the query resul
5b10: 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f  t, but instead o
5b20: 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20  f.    ** saving 
5b30: 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65  that record, use
5b40: 20 69 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20   it as a key to 
5b50: 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20  delete elements 
5b60: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
5b70: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
5b80: 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  iParm..    */.  
5b90: 20 20 63 61 73 65 20 53 52 54 5f 45 78 63 65 70    case SRT_Excep
5ba0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
5bb0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5bc0: 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50  OP_IdxDelete, iP
5bd0: 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  arm, regResult, 
5be0: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
5bf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5c00: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5c10: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
5c20: 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ELECT */..    /*
5c30: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
5c40: 74 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20  t as data using 
5c50: 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20  a unique key..  
5c60: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
5c70: 54 5f 44 69 73 74 54 61 62 6c 65 3a 0a 20 20 20  T_DistTable:.   
5c80: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
5c90: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
5ca0: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
5cb0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
5cc0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
5cd0: 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
5ce0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 54  se( eDest==SRT_T
5cf0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
5d00: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
5d10: 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20  RT_EphemTab );. 
5d20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5d30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  AddOp3(v, OP_Mak
5d40: 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75  eRecord, regResu
5d50: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20  lt, nResultCol, 
5d60: 72 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  r1);.#ifndef SQL
5d70: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
5d80: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
5d90: 54 5f 44 69 73 74 54 61 62 6c 65 20 29 7b 0a 20  T_DistTable ){. 
5da0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
5db0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
5dc0: 44 69 73 74 54 61 62 6c 65 2c 20 74 68 65 6e 20  DistTable, then 
5dd0: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
5de0: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
5df0: 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65 6d 65   ** on an epheme
5e00: 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20 74 68  ral index. If th
5e10: 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73  e current row is
5e20: 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
5e30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  .        ** in t
5e40: 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e 6f 74  he index, do not
5e50: 20 77 72 69 74 65 20 69 74 20 74 6f 20 74 68 65   write it to the
5e60: 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f 74 2c   output. If not,
5e70: 20 61 64 64 20 74 68 65 0a 20 20 20 20 20 20 20   add the.       
5e80: 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f 77 20   ** current row 
5e90: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  to the index and
5ea0: 20 70 72 6f 63 65 65 64 20 77 69 74 68 20 77 72   proceed with wr
5eb0: 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68 65 0a  iting it to the.
5ec0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70 75          ** outpu
5ed0: 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c 6c 2e  t table as well.
5ee0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
5ef0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
5f00: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
5f10: 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 73  ) + 4;.        s
5f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
5f30: 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  Int(v, OP_Found,
5f40: 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20   iParm+1, addr, 
5f50: 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r1, 0);.        
5f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5f70: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5f80: 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b  t, iParm+1, r1);
5f90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5fa0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a   pOrderBy==0 );.
5fb0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
5fc0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5fd0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5fe0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5ff0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
6000: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
6010: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
6020: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
6030: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
6040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6050: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
6060: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
6070: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
6080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6090: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
60a0: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
60b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
60c0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
60d0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
60e0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
60f0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
6100: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
6110: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6120: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6130: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
6140: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
6150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6160: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
6170: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
6180: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
6190: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
61a0: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
61b0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
61c0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
61d0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
61e0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
61f0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
6200: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
6210: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
6220: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
6230: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
6240: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6250: 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a  ResultCol==1 );.
6260: 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
6270: 53 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20  Sdst =.         
6280: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6290: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
62a0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
62b0: 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64  pr, pDest->affSd
62c0: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  st);.      if( p
62d0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
62e0: 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67     /* At first g
62f0: 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20  lance you would 
6300: 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f  think we could o
6310: 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a  ptimize out the.
6320: 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52          ** ORDER
6330: 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65   BY in this case
6340: 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72   since the order
6350: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
6360: 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a  he set.        *
6370: 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  * does not matte
6380: 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69  r.  But there mi
6390: 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63  ght be a LIMIT c
63a0: 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a  lause, in which.
63b0: 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
63c0: 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d  the order does m
63d0: 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  atter */.       
63e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
63f0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
6400: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
6410: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6420: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
6430: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6440: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
6450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6460: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
6470: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
6480: 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  1,r1, &pDest->af
6490: 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20  fSdst, 1);.     
64a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
64b0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
64c0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
64d0: 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  ult, 1);.       
64e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64f0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
6500: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
6510: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6520: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6530: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
6540: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6550: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
6560: 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69   any row exist i
6570: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
6580: 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61  , record that fa
6590: 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20  ct and abort..  
65a0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
65b0: 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20  T_Exists: {.    
65c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
65d0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
65e0: 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20  r, 1, iParm);.  
65f0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6600: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
6610: 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
6620: 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
6630: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
6640: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
6650: 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20  a scalar select 
6660: 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20  that is part of 
6670: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  an expression, t
6680: 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65  hen.    ** store
6690: 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
66a0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
66b0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20  memory cell and 
66c0: 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a  break out.    **
66d0: 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f   of the scan loo
66e0: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  p..    */.    ca
66f0: 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20  se SRT_Mem: {.  
6700: 20 20 20 20 61 73 73 65 72 74 28 20 6e 52 65 73      assert( nRes
6710: 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  ultCol==1 );.   
6720: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
6730: 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  ){.        pushO
6740: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
6750: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
6760: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
6770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6780: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
6790: 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  ove(pParse, regR
67a0: 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29  esult, iParm, 1)
67b0: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
67c0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
67d0: 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
67e0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
67f0: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
6800: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
6810: 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
6820: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6830: 45 52 59 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  ERY */..    case
6840: 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20   SRT_Coroutine: 
6850: 20 20 20 20 20 20 2f 2a 20 53 65 6e 64 20 64 61        /* Send da
6860: 74 61 20 74 6f 20 61 20 63 6f 2d 72 6f 75 74 69  ta to a co-routi
6870: 6e 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ne */.    case S
6880: 52 54 5f 4f 75 74 70 75 74 3a 20 7b 20 20 20 20  RT_Output: {    
6890: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68      /* Return th
68a0: 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  e results */.   
68b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
68c0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
68d0: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
68e0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
68f0: 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20  Output );.      
6900: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
6910: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
6920: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6930: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
6940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6950: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
6960: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
6970: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72  t, nResultCol, r
6980: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  1);.        push
6990: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
69a0: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
69b0: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
69c0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
69d0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
69e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
69f0: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6a00: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
6a10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6a20: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6a30: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
6a40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6a50: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6a60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
6a70: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
6a80: 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a  t, nResultCol);.
6a90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6aa0: 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
6ab0: 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
6ac0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
6ad0: 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tCol);.      }. 
6ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6af0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
6b00: 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f  E_OMIT_CTE.    /
6b10: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75  * Write the resu
6b20: 6c 74 73 20 69 6e 74 6f 20 61 20 70 72 69 6f 72  lts into a prior
6b30: 69 74 79 20 71 75 65 75 65 20 74 68 61 74 20 69  ity queue that i
6b40: 73 20 6f 72 64 65 72 20 61 63 63 6f 72 64 69 6e  s order accordin
6b50: 67 20 74 6f 0a 20 20 20 20 2a 2a 20 70 44 65 73  g to.    ** pDes
6b60: 74 2d 3e 70 4f 72 64 65 72 42 79 20 28 69 6e 20  t->pOrderBy (in 
6b70: 70 53 4f 29 2e 20 20 70 44 65 73 74 2d 3e 69 53  pSO).  pDest->iS
6b80: 44 50 61 72 6d 20 28 69 6e 20 69 50 61 72 6d 29  DParm (in iParm)
6b90: 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 66   is the cursor f
6ba0: 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 64  or an.    ** ind
6bb0: 65 78 20 77 69 74 68 20 70 53 4f 2d 3e 6e 45 78  ex with pSO->nEx
6bc0: 70 72 2b 32 20 63 6f 6c 75 6d 6e 73 2e 20 20 42  pr+2 columns.  B
6bd0: 75 69 6c 64 20 61 20 6b 65 79 20 75 73 69 6e 67  uild a key using
6be0: 20 70 53 4f 20 66 6f 72 20 74 68 65 20 66 69 72   pSO for the fir
6bf0: 73 74 0a 20 20 20 20 2a 2a 20 70 53 4f 2d 3e 6e  st.    ** pSO->n
6c00: 45 78 70 72 20 63 6f 6c 75 6d 6e 73 2c 20 74 68  Expr columns, th
6c10: 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  en make sure all
6c20: 20 6b 65 79 73 20 61 72 65 20 75 6e 69 71 75 65   keys are unique
6c30: 20 62 79 20 61 64 64 69 6e 67 20 61 0a 20 20 20   by adding a.   
6c40: 20 2a 2a 20 66 69 6e 61 6c 20 4f 50 5f 53 65 71   ** final OP_Seq
6c50: 75 65 6e 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  uence column.  T
6c60: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
6c70: 73 20 74 68 65 20 72 65 63 6f 72 64 20 61 73 20  s the record as 
6c80: 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2f 0a 20  a blob..    */. 
6c90: 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74     case SRT_Dist
6ca0: 51 75 65 75 65 3a 0a 20 20 20 20 63 61 73 65 20  Queue:.    case 
6cb0: 53 52 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20  SRT_Queue: {.   
6cc0: 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20     int nKey;.   
6cd0: 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72     int r1, r2, r
6ce0: 33 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  3;.      int add
6cf0: 72 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  rTest = 0;.     
6d00: 20 45 78 70 72 4c 69 73 74 20 2a 70 53 4f 3b 0a   ExprList *pSO;.
6d10: 20 20 20 20 20 20 70 53 4f 20 3d 20 70 44 65 73        pSO = pDes
6d20: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  t->pOrderBy;.   
6d30: 20 20 20 61 73 73 65 72 74 28 20 70 53 4f 20 29     assert( pSO )
6d40: 3b 0a 20 20 20 20 20 20 6e 4b 65 79 20 3d 20 70  ;.      nKey = p
6d50: 53 4f 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  SO->nExpr;.     
6d60: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
6d70: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6d80: 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
6d90: 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
6da0: 70 50 61 72 73 65 2c 20 6e 4b 65 79 2b 32 29 3b  pParse, nKey+2);
6db0: 0a 20 20 20 20 20 20 72 33 20 3d 20 72 32 2b 6e  .      r3 = r2+n
6dc0: 4b 65 79 2b 31 3b 0a 20 20 20 20 20 20 73 71 6c  Key+1;.      sql
6dd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6de0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
6df0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73   regResult, nRes
6e00: 75 6c 74 43 6f 6c 2c 20 72 33 29 3b 0a 20 20 20  ultCol, r3);.   
6e10: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
6e20: 54 5f 44 69 73 74 51 75 65 75 65 20 29 7b 0a 20  T_DistQueue ){. 
6e30: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
6e40: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20   destination is 
6e50: 44 69 73 74 51 75 65 75 65 2c 20 74 68 65 6e 20  DistQueue, then 
6e60: 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b 31 29  cursor (iParm+1)
6e70: 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20   is open.       
6e80: 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f 6e 64 20   ** on a second 
6e90: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 20  ephemeral index 
6ea0: 74 68 61 74 20 68 6f 6c 64 73 20 61 6c 6c 20 76  that holds all v
6eb0: 61 6c 75 65 73 20 65 76 65 72 79 20 70 72 65 76  alues every prev
6ec0: 69 6f 75 73 6c 79 0a 20 20 20 20 20 20 20 20 2a  iously.        *
6ed0: 2a 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 71  * added to the q
6ee0: 75 65 75 65 2e 20 20 4f 6e 6c 79 20 61 64 64 20  ueue.  Only add 
6ef0: 74 68 69 73 20 6e 65 77 20 76 61 6c 75 65 20 69  this new value i
6f00: 66 20 69 74 20 68 61 73 20 6e 65 76 65 72 20 62  f it has never b
6f10: 65 66 6f 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  efore.        **
6f20: 20 62 65 65 6e 20 61 64 64 65 64 20 2a 2f 0a 20   been added */. 
6f30: 20 20 20 20 20 20 20 61 64 64 72 54 65 73 74 20         addrTest 
6f40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
6f50: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75  Op4Int(v, OP_Fou
6f60: 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20 30 2c 20  nd, iParm+1, 0, 
6f70: 72 33 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  r3, 0);.        
6f80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6f90: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
6fa0: 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 33 29 3b  t, iParm+1, r3);
6fb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6fc0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
6fd0: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
6fe0: 53 55 4c 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  SULT);.      }. 
6ff0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7000: 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nKey; i++){.    
7010: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7020: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
7030: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
7050: 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d 3e 61 5b  Result + pSO->a[
7060: 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
7070: 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20 20 20 20  ol - 1,.        
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 72 32 2b 69 29 3b 0a 20 20 20 20 20 20 7d    r2+i);.      }
70a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
70b0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
70c0: 65 71 75 65 6e 63 65 2c 20 69 50 61 72 6d 2c 20  equence, iParm, 
70d0: 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  r2+nKey);.      
70e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
70f0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
7100: 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 2c 20  rd, r2, nKey+2, 
7110: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
7120: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7130: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
7140: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
7150: 69 66 28 20 61 64 64 72 54 65 73 74 20 29 20 73  if( addrTest ) s
7160: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7170: 72 65 28 76 2c 20 61 64 64 72 54 65 73 74 29 3b  re(v, addrTest);
7180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
7190: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
71a0: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
71b0: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
71c0: 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
71d0: 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20  r2, nKey+2);.   
71e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
71f0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7200: 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 0a 0a  _OMIT_CTE */....
7210: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
7220: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
7230: 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64  ).    /* Discard
7240: 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54   the results.  T
7250: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
7260: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7270: 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20  s inside.    ** 
7280: 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52  the body of a TR
7290: 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70  IGGER.  The purp
72a0: 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65  ose of such sele
72b0: 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20  cts is to call. 
72c0: 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e     ** user-defin
72d0: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  ed functions tha
72e0: 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65  t have side effe
72f0: 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20  cts.  We do not 
7300: 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75  care.    ** abou
7310: 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73  t the actual res
7320: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
7330: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ct..    */.    d
7340: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
7350: 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53  assert( eDest==S
7360: 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20  RT_Discard );.  
7370: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7380: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
7390: 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e  * Jump to the en
73a0: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66  d of the loop if
73b0: 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65   the LIMIT is re
73c0: 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20  ached.  Except, 
73d0: 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73  if.  ** there is
73e0: 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68   a sorter, in wh
73f0: 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72  ich case the sor
7400: 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ter has already 
7410: 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65  limited.  ** the
7420: 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a   output for us..
7430: 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
7440: 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69  rBy==0 && p->iLi
7450: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
7460: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7470: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
7480: 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
7490: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
74a0: 41 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e  Allocate a KeyIn
74b0: 66 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63  fo object suffic
74c0: 69 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65  ient for an inde
74d0: 78 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d  x of N key colum
74e0: 6e 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72  ns and.** X extr
74f0: 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65  a columns..*/.Ke
7500: 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
7510: 79 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74  yInfoAlloc(sqlit
7520: 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69  e3 *db, int N, i
7530: 6e 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f  nt X){.  KeyInfo
7540: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   *p = sqlite3DbM
7550: 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20  allocZero(0, .  
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29   sizeof(KeyInfo)
7580: 20 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66   + (N+X)*(sizeof
7590: 28 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a  (CollSeq*)+1));.
75a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
75b0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
75c0: 75 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b  u8*)&p->aColl[N+
75d0: 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c  X];.    p->nFiel
75e0: 64 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20  d = (u16)N;.    
75f0: 70 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75 31  p->nXField = (u1
7600: 36 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20  6)X;.    p->enc 
7610: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70  = ENC(db);.    p
7620: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70  ->db = db;.    p
7630: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65  ->nRef = 1;.  }e
7640: 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  lse{.    db->mal
7650: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
7660: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
7670: 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61  ../*.** Dealloca
7680: 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  te a KeyInfo obj
7690: 65 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ect.*/.void sqli
76a0: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
76b0: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
76c0: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
76d0: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
76e0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a  .    p->nRef--;.
76f0: 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d      if( p->nRef=
7700: 3d 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  =0 ) sqlite3DbFr
7710: 65 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a  ee(0, p);.  }.}.
7720: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65  ./*.** Make a ne
7730: 77 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b  w pointer to a K
7740: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f  eyInfo object.*/
7750: 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
7760: 33 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49  3KeyInfoRef(KeyI
7770: 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  nfo *p){.  if( p
7780: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
7790: 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  p->nRef>0 );.   
77a0: 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a   p->nRef++;.  }.
77b0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23    return p;.}..#
77c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
77d0: 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
77e0: 54 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66  TRUE if a KeyInf
77f0: 6f 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20  o object can be 
7800: 63 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79  change.  The Key
7810: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63  Info object.** c
7820: 61 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67  an only be chang
7830: 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75  ed if this is ju
7840: 73 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65  st a single refe
7850: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a  rence to the obj
7860: 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ect..**.** This 
7870: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
7880: 6f 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61  only inside of a
7890: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
78a0: 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ts..*/.int sqlit
78b0: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
78c0: 61 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29  able(KeyInfo *p)
78d0: 7b 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66  { return p->nRef
78e0: 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ==1; }.#endif /*
78f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
7900: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e  ../*.** Given an
7910: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7920: 2c 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79  , generate a Key
7930: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
7940: 68 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74  hat records.** t
7950: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
7960: 75 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65  uence for each e
7970: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61  xpression in tha
7980: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
7990: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
79a0: 45 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f  ExprList is an O
79b0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
79c0: 20 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20   BY clause then 
79d0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  the resulting.**
79e0: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
79f0: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
7a00: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
7a10: 6e 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64  ng a virtual ind
7a20: 65 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65  ex to.** impleme
7a30: 6e 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20  nt that clause. 
7a40: 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74   If the ExprList
7a50: 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73   is the result s
7a60: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a  et of a SELECT.*
7a70: 2a 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e  * then the KeyIn
7a80: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
7a90: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
7aa0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76  initializing a v
7ab0: 69 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20  irtual.** index 
7ac0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44  to implement a D
7ad0: 49 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a  ISTINCT test..**
7ae0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
7af0: 64 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  d the KeyInfo st
7b00: 72 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69  ructure is obtai
7b10: 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20  n from malloc.  
7b20: 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
7b30: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
7b40: 6e 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e  nsible for seein
7b50: 67 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75  g that this stru
7b60: 63 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61  cture is eventua
7b70: 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f  lly.** freed..*/
7b80: 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20  .static KeyInfo 
7b90: 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72  *keyInfoFromExpr
7ba0: 4c 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72  List(Parse *pPar
7bb0: 73 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  se, ExprList *pL
7bc0: 69 73 74 2c 20 69 6e 74 20 6e 45 78 74 72 61 29  ist, int nExtra)
7bd0: 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20  {.  int nExpr;. 
7be0: 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f 3b   KeyInfo *pInfo;
7bf0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
7c00: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
7c10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
7c20: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
7c30: 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d 20  t i;..  nExpr = 
7c40: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
7c50: 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b  pInfo = sqlite3K
7c60: 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20  eyInfoAlloc(db, 
7c70: 6e 45 78 70 72 2b 6e 45 78 74 72 61 2c 20 31 29  nExpr+nExtra, 1)
7c80: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b  ;.  if( pInfo ){
7c90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
7ca0: 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
7cb0: 74 65 61 62 6c 65 28 70 49 6e 66 6f 29 20 29 3b  teable(pInfo) );
7cc0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
7cd0: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
7ce0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
7cf0: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  m++){.      Coll
7d00: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
7d10: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
7d20: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
7d30: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70  rse, pItem->pExp
7d40: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  r);.      if( !p
7d50: 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64  Coll ) pColl = d
7d60: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
7d70: 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c      pInfo->aColl
7d80: 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  [i] = pColl;.   
7d90: 20 20 20 70 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f     pInfo->aSortO
7da0: 72 64 65 72 5b 69 5d 20 3d 20 70 49 74 65 6d 2d  rder[i] = pItem-
7db0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
7dc0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
7dd0: 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Info;.}..#ifndef
7de0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
7df0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
7e00: 2a 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  ** Name of the c
7e10: 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70 65 72 61 74  onnection operat
7e20: 6f 72 2c 20 75 73 65 64 20 66 6f 72 20 65 72 72  or, used for err
7e30: 6f 72 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a  or messages..*/.
7e40: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7e50: 72 20 2a 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28  r *selectOpName(
7e60: 69 6e 74 20 69 64 29 7b 0a 20 20 63 68 61 72 20  int id){.  char 
7e70: 2a 7a 3b 0a 20 20 73 77 69 74 63 68 28 20 69 64  *z;.  switch( id
7e80: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
7e90: 41 4c 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22  ALL:       z = "
7ea0: 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20 20 20 62 72  UNION ALL";   br
7eb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
7ec0: 5f 49 4e 54 45 52 53 45 43 54 3a 20 7a 20 3d 20  _INTERSECT: z = 
7ed0: 22 49 4e 54 45 52 53 45 43 54 22 3b 20 20 20 62  "INTERSECT";   b
7ee0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
7ef0: 4b 5f 45 58 43 45 50 54 3a 20 20 20 20 7a 20 3d  K_EXCEPT:    z =
7f00: 20 22 45 58 43 45 50 54 22 3b 20 20 20 20 20 20   "EXCEPT";      
7f10: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
7f20: 6c 74 3a 20 20 20 20 20 20 20 20 20 20 20 7a 20  lt:           z 
7f30: 3d 20 22 55 4e 49 4f 4e 22 3b 20 20 20 20 20 20  = "UNION";      
7f40: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
7f50: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
7f60: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
7f70: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
7f80: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
7f90: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
7fa0: 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20  /*.** Unless an 
7fb0: 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
7fc0: 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20  LAN" command is 
7fd0: 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c  being processed,
7fe0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
7ff0: 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74  * is a no-op. Ot
8000: 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73  herwise, it adds
8010: 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
8020: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45   output to the E
8030: 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68  QP result,.** wh
8040: 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20  ere the caption 
8050: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
8060: 2a 2a 0a 2a 2a 20 20 20 22 55 53 45 20 54 45 4d  **.**   "USE TEM
8070: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 78 78 78  P B-TREE FOR xxx
8080: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 78 78  ".**.** where xx
8090: 78 20 69 73 20 6f 6e 65 20 6f 66 20 22 44 49 53  x is one of "DIS
80a0: 54 49 4e 43 54 22 2c 20 22 4f 52 44 45 52 20 42  TINCT", "ORDER B
80b0: 59 22 20 6f 72 20 22 47 52 4f 55 50 20 42 59 22  Y" or "GROUP BY"
80c0: 2e 20 45 78 61 63 74 6c 79 20 77 68 69 63 68 0a  . Exactly which.
80d0: 2a 2a 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ** is determined
80e0: 20 62 79 20 74 68 65 20 7a 55 73 61 67 65 20 61   by the zUsage a
80f0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
8100: 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 54  ic void explainT
8110: 65 6d 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  empTable(Parse *
8120: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
8130: 61 72 20 2a 7a 55 73 61 67 65 29 7b 0a 20 20 69  ar *zUsage){.  i
8140: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  f( pParse->expla
8150: 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62  in==2 ){.    Vdb
8160: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
8170: 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  Vdbe;.    char *
8180: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
8190: 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
81a0: 2c 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52  , "USE TEMP B-TR
81b0: 45 45 20 46 4f 52 20 25 73 22 2c 20 7a 55 73 61  EE FOR %s", zUsa
81c0: 67 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ge);.    sqlite3
81d0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
81e0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
81f0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
8200: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
8210: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
8220: 2a 2a 20 41 73 73 69 67 6e 20 65 78 70 72 65 73  ** Assign expres
8230: 73 69 6f 6e 20 62 20 74 6f 20 6c 76 61 6c 75 65  sion b to lvalue
8240: 20 61 2e 20 41 20 73 65 63 6f 6e 64 2c 20 6e 6f   a. A second, no
8250: 2d 6f 70 2c 20 76 65 72 73 69 6f 6e 20 6f 66 20  -op, version of 
8260: 74 68 69 73 20 6d 61 63 72 6f 0a 2a 2a 20 69 73  this macro.** is
8270: 20 70 72 6f 76 69 64 65 64 20 77 68 65 6e 20 53   provided when S
8280: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
8290: 49 4e 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  IN is defined. T
82a0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
82b0: 6f 64 65 0a 2a 2a 20 69 6e 20 73 71 6c 69 74 65  ode.** in sqlite
82c0: 33 53 65 6c 65 63 74 28 29 20 74 6f 20 61 73 73  3Select() to ass
82d0: 69 67 6e 20 76 61 6c 75 65 73 20 74 6f 20 73 74  ign values to st
82e0: 72 75 63 74 75 72 65 20 6d 65 6d 62 65 72 20 76  ructure member v
82f0: 61 72 69 61 62 6c 65 73 20 74 68 61 74 0a 2a 2a  ariables that.**
8300: 20 6f 6e 6c 79 20 65 78 69 73 74 20 69 66 20 53   only exist if S
8310: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
8320: 49 4e 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  IN is not define
8330: 64 20 77 69 74 68 6f 75 74 20 70 6f 6c 6c 75 74  d without pollut
8340: 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20  ing the.** code 
8350: 77 69 74 68 20 23 69 66 6e 64 65 66 20 64 69 72  with #ifndef dir
8360: 65 63 74 69 76 65 73 2e 0a 2a 2f 0a 23 20 64 65  ectives..*/.# de
8370: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
8380: 6e 74 65 67 65 72 28 61 2c 20 62 29 20 61 20 3d  nteger(a, b) a =
8390: 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d   b..#else./* No-
83a0: 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  op versions of t
83b0: 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29 20  he explainXXX() 
83c0: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61  functions and ma
83d0: 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e  cros. */.# defin
83e0: 65 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  e explainTempTab
83f0: 6c 65 28 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65  le(y,z).# define
8400: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
8410: 65 72 28 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a  er(y,z).#endif..
8420: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8430: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
8440: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
8450: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
8460: 4e 44 5f 53 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a  ND_SELECT)./*.**
8470: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
8480: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
8490: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
84a0: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
84b0: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
84c0: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
84d0: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
84e0: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
84f0: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
8500: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
8510: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
8520: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20   one of the two 
8530: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  forms:.**.**   "
8540: 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55 45  COMPOSITE SUBQUE
8550: 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20 69  RIES iSub1 and i
8560: 53 75 62 32 20 28 6f 70 29 22 0a 2a 2a 20 20 20  Sub2 (op)".**   
8570: 22 43 4f 4d 50 4f 53 49 54 45 20 53 55 42 51 55  "COMPOSITE SUBQU
8580: 45 52 49 45 53 20 69 53 75 62 31 20 61 6e 64 20  ERIES iSub1 and 
8590: 69 53 75 62 32 20 55 53 49 4e 47 20 54 45 4d 50  iSub2 USING TEMP
85a0: 20 42 2d 54 52 45 45 20 28 6f 70 29 22 0a 2a 2a   B-TREE (op)".**
85b0: 0a 2a 2a 20 77 68 65 72 65 20 69 53 75 62 31 20  .** where iSub1 
85c0: 61 6e 64 20 69 53 75 62 32 20 61 72 65 20 74 68  and iSub2 are th
85d0: 65 20 69 6e 74 65 67 65 72 73 20 70 61 73 73 65  e integers passe
85e0: 64 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  d as the corresp
85f0: 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  onding.** functi
8600: 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 2c 20 61  on parameters, a
8610: 6e 64 20 6f 70 20 69 73 20 74 68 65 20 74 65 78  nd op is the tex
8620: 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  t representation
8630: 20 6f 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   of the paramete
8640: 72 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  r.** of the same
8650: 20 6e 61 6d 65 2e 20 54 68 65 20 70 61 72 61 6d   name. The param
8660: 65 74 65 72 20 22 6f 70 22 20 6d 75 73 74 20 62  eter "op" must b
8670: 65 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f  e one of TK_UNIO
8680: 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a  N, TK_EXCEPT,.**
8690: 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 6f 72   TK_INTERSECT or
86a0: 20 54 4b 5f 41 4c 4c 2e 20 54 68 65 20 66 69 72   TK_ALL. The fir
86b0: 73 74 20 66 6f 72 6d 20 69 73 20 75 73 65 64 20  st form is used 
86c0: 69 66 20 61 72 67 75 6d 65 6e 74 20 62 55 73 65  if argument bUse
86d0: 54 6d 70 20 69 73 20 0a 2a 2a 20 66 61 6c 73 65  Tmp is .** false
86e0: 2c 20 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20  , or the second 
86f0: 66 6f 72 6d 20 69 66 20 69 74 20 69 73 20 74 72  form if it is tr
8700: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
8710: 69 64 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  id explainCompos
8720: 69 74 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ite(.  Parse *pP
8730: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
8740: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
8750: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
8760: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8780: 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c  One of TK_UNION,
8790: 20 54 4b 5f 45 58 43 45 50 54 20 65 74 63 2e 20   TK_EXCEPT etc. 
87a0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 31 2c 20  */.  int iSub1, 
87b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87c0: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
87d0: 20 69 64 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69   id 1 */.  int i
87e0: 53 75 62 32 2c 20 20 20 20 20 20 20 20 20 20 20  Sub2,           
87f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
8800: 62 71 75 65 72 79 20 69 64 20 32 20 2a 2f 0a 20  bquery id 2 */. 
8810: 20 69 6e 74 20 62 55 73 65 54 6d 70 20 20 20 20   int bUseTmp    
8820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8830: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 74 65   /* True if a te
8840: 6d 70 20 74 61 62 6c 65 20 77 61 73 20 75 73 65  mp table was use
8850: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
8860: 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c  ( op==TK_UNION |
8870: 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20  | op==TK_EXCEPT 
8880: 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  || op==TK_INTERS
8890: 45 43 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c  ECT || op==TK_AL
88a0: 4c 20 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  L );.  if( pPars
88b0: 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
88c0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
88d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
88e0: 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73    char *zMsg = s
88f0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 0a 20  qlite3MPrintf(. 
8900: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64         pParse->d
8910: 62 2c 20 22 43 4f 4d 50 4f 55 4e 44 20 53 55 42  b, "COMPOUND SUB
8920: 51 55 45 52 49 45 53 20 25 64 20 41 4e 44 20 25  QUERIES %d AND %
8930: 64 20 25 73 28 25 73 29 22 2c 20 69 53 75 62 31  d %s(%s)", iSub1
8940: 2c 20 69 53 75 62 32 2c 0a 20 20 20 20 20 20 20  , iSub2,.       
8950: 20 62 55 73 65 54 6d 70 3f 22 55 53 49 4e 47 20   bUseTmp?"USING 
8960: 54 45 4d 50 20 42 2d 54 52 45 45 20 22 3a 22 22  TEMP B-TREE ":""
8970: 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 6f  , selectOpName(o
8980: 70 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  p).    );.    sq
8990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
89a0: 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  v, OP_Explain, p
89b0: 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
89c0: 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  , 0, 0, zMsg, P4
89d0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
89e0: 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20  .#else./* No-op 
89f0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
8a00: 65 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e  explainXXX() fun
8a10: 63 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f  ctions and macro
8a20: 73 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s. */.# define e
8a30: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
8a40: 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
8a50: 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  f../*.** If the 
8a60: 69 6e 6e 65 72 20 6c 6f 6f 70 20 77 61 73 20 67  inner loop was g
8a70: 65 6e 65 72 61 74 65 64 20 75 73 69 6e 67 20 61  enerated using a
8a80: 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f 72 64 65 72   non-null pOrder
8a90: 42 79 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  By argument,.** 
8aa0: 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  then the results
8ab0: 20 77 65 72 65 20 70 6c 61 63 65 64 20 69 6e 20   were placed in 
8ac0: 61 20 73 6f 72 74 65 72 2e 20 20 41 66 74 65 72  a sorter.  After
8ad0: 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 74 65 72   the loop is ter
8ae0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 77 65 20 6e 65  minated.** we ne
8af0: 65 64 20 74 6f 20 72 75 6e 20 74 68 65 20 73 6f  ed to run the so
8b00: 72 74 65 72 20 61 6e 64 20 6f 75 74 70 75 74 20  rter and output 
8b10: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
8b20: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
8b30: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
8b40: 20 74 68 65 20 63 6f 64 65 20 6e 65 65 64 65 64   the code needed
8b50: 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a   to do that..*/.
8b60: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
8b70: 72 61 74 65 53 6f 72 74 54 61 69 6c 28 0a 20 20  rateSortTail(.  
8b80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8b90: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8ba0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
8bb0: 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54   *p,        /* T
8bc0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
8bd0: 65 6e 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ent */.  Vdbe *v
8be0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ,          /* Ge
8bf0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
8c00: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
8c10: 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20  int nColumn,    
8c20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
8c30: 6f 6c 75 6d 6e 73 20 6f 66 20 64 61 74 61 20 2a  olumns of data *
8c40: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
8c50: 70 44 65 73 74 20 2f 2a 20 57 72 69 74 65 20 74  pDest /* Write t
8c60: 68 65 20 73 6f 72 74 65 64 20 72 65 73 75 6c 74  he sorted result
8c70: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
8c80: 6e 74 20 61 64 64 72 42 72 65 61 6b 20 3d 20 73  nt addrBreak = s
8c90: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
8ca0: 62 65 6c 28 76 29 3b 20 20 20 20 20 2f 2a 20 4a  bel(v);     /* J
8cb0: 75 6d 70 20 68 65 72 65 20 74 6f 20 65 78 69 74  ump here to exit
8cc0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
8cd0: 64 64 72 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71  ddrContinue = sq
8ce0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
8cf0: 65 6c 28 76 29 3b 20 20 2f 2a 20 4a 75 6d 70 20  el(v);  /* Jump 
8d00: 68 65 72 65 20 66 6f 72 20 6e 65 78 74 20 63 79  here for next cy
8d10: 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  cle */.  int add
8d20: 72 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  r;.  int iTab;. 
8d30: 20 69 6e 74 20 70 73 65 75 64 6f 54 61 62 20 3d   int pseudoTab =
8d40: 20 30 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   0;.  ExprList *
8d50: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
8d60: 72 64 65 72 42 79 3b 0a 0a 20 20 69 6e 74 20 65  rderBy;..  int e
8d70: 44 65 73 74 20 3d 20 70 44 65 73 74 2d 3e 65 44  Dest = pDest->eD
8d80: 65 73 74 3b 0a 20 20 69 6e 74 20 69 50 61 72 6d  est;.  int iParm
8d90: 20 3d 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72   = pDest->iSDPar
8da0: 6d 3b 0a 0a 20 20 69 6e 74 20 72 65 67 52 6f 77  m;..  int regRow
8db0: 3b 0a 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64  ;.  int regRowid
8dc0: 3b 0a 0a 20 20 69 54 61 62 20 3d 20 70 4f 72 64  ;..  iTab = pOrd
8dd0: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 3b 0a  erBy->iECursor;.
8de0: 20 20 72 65 67 52 6f 77 20 3d 20 73 71 6c 69 74    regRow = sqlit
8df0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
8e00: 72 73 65 29 3b 0a 20 20 69 66 28 20 65 44 65 73  rse);.  if( eDes
8e10: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c  t==SRT_Output ||
8e20: 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f   eDest==SRT_Coro
8e30: 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 70 73 65  utine ){.    pse
8e40: 75 64 6f 54 61 62 20 3d 20 70 50 61 72 73 65 2d  udoTab = pParse-
8e50: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nTab++;.    sql
8e60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8e70: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
8e80: 20 70 73 65 75 64 6f 54 61 62 2c 20 72 65 67 52   pseudoTab, regR
8e90: 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ow, nColumn);.  
8ea0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 0a    regRowid = 0;.
8eb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
8ec0: 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 47  Rowid = sqlite3G
8ed0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
8ee0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
8ef0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
8f00: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 69  eSorter ){.    i
8f10: 6e 74 20 72 65 67 53 6f 72 74 4f 75 74 20 3d 20  nt regSortOut = 
8f20: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
8f30: 20 20 20 20 69 6e 74 20 70 74 61 62 32 20 3d 20      int ptab2 = 
8f40: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
8f50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8f60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
8f70: 50 73 65 75 64 6f 2c 20 70 74 61 62 32 2c 20 72  Pseudo, ptab2, r
8f80: 65 67 53 6f 72 74 4f 75 74 2c 20 70 4f 72 64 65  egSortOut, pOrde
8f90: 72 42 79 2d 3e 6e 45 78 70 72 2b 32 29 3b 0a 20  rBy->nExpr+2);. 
8fa0: 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71     addr = 1 + sq
8fb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8fc0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
8fd0: 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61  , iTab, addrBrea
8fe0: 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  k);.    codeOffs
8ff0: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
9000: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
9010: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9020: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
9030: 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72  terData, iTab, r
9040: 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20  egSortOut);.    
9050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9060: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
9070: 70 74 61 62 32 2c 20 70 4f 72 64 65 72 42 79 2d  ptab2, pOrderBy-
9080: 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77  >nExpr+1, regRow
9090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
90a0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
90b0: 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29  FLAG_CLEARCACHE)
90c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
90d0: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
90e0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
90f0: 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  P_Sort, iTab, ad
9100: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f  drBreak);.    co
9110: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
9120: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
9130: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
9140: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
9150: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c  OP_Column, iTab,
9160: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
9170: 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 7d  +1, regRow);.  }
9180: 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74  .  switch( eDest
9190: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 52 54   ){.    case SRT
91a0: 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
91b0: 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
91c0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
91d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
91e0: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
91f0: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
9200: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
9210: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9220: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
9230: 69 64 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  id, iParm, regRo
9240: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
9250: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
9260: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61 72   OP_Insert, iPar
9270: 6d 2c 20 72 65 67 52 6f 77 2c 20 72 65 67 52 6f  m, regRow, regRo
9280: 77 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wid);.      sqli
9290: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
92a0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
92b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
92c0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
92d0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
92e0: 52 59 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  RY.    case SRT_
92f0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
9300: 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  ert( nColumn==1 
9310: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9320: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
9330: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
9340: 52 6f 77 2c 20 31 2c 20 72 65 67 52 6f 77 69 64  Row, 1, regRowid
9350: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9360: 20 20 20 20 20 20 20 20 20 20 26 70 44 65 73 74            &pDest
9370: 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20  ->affSdst, 1);. 
9380: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9390: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
93a0: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
93b0: 6f 77 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  ow, 1);.      sq
93c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
93d0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
93e0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64   iParm, regRowid
93f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9400: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
9410: 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20  RT_Mem: {.      
9420: 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d  assert( nColumn=
9430: 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =1 );.      sqli
9440: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
9450: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20  pParse, regRow, 
9460: 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20  iParm, 1);.     
9470: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
9480: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
9490: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
94a0: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
94b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
94c0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
94d0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
94e0: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
94f0: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
9500: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
9510: 74 69 6e 65 20 29 3b 20 0a 20 20 20 20 20 20 74  tine ); .      t
9520: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9530: 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
9540: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
9550: 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69  est==SRT_Corouti
9560: 6e 65 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ne );.      for(
9570: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b 20  i=0; i<nColumn; 
9580: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i++){.        as
9590: 73 65 72 74 28 20 72 65 67 52 6f 77 21 3d 70 44  sert( regRow!=pD
95a0: 65 73 74 2d 3e 69 53 64 73 74 2b 69 20 29 3b 0a  est->iSdst+i );.
95b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
95c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
95d0: 43 6f 6c 75 6d 6e 2c 20 70 73 65 75 64 6f 54 61  Column, pseudoTa
95e0: 62 2c 20 69 2c 20 70 44 65 73 74 2d 3e 69 53 64  b, i, pDest->iSd
95f0: 73 74 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 69  st+i);.        i
9600: 66 28 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( i==0 ){.     
9610: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9620: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
9630: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
9640: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9650: 7d 0a 20 20 20 20 20 20 69 66 28 20 65 44 65 73  }.      if( eDes
9660: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
9670: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9680: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9690: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 44 65 73  _ResultRow, pDes
96a0: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
96b0: 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
96c0: 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
96d0: 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
96e0: 65 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  e, pDest->iSdst,
96f0: 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20   nColumn);.     
9700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9720: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
9730: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
9740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
9750: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
9760: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
9770: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
9780: 65 67 52 6f 77 29 3b 0a 20 20 73 71 6c 69 74 65  egRow);.  sqlite
9790: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
97a0: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 69 64  pParse, regRowid
97b0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 62 6f 74  );..  /* The bot
97c0: 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  tom of the loop.
97d0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
97e0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
97f0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
9800: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
9810: 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74 65  gs & SF_UseSorte
9820: 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
9830: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9840: 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 54 61  _SorterNext, iTa
9850: 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d 65 6c 73  b, addr);.  }els
9860: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
9870: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
9880: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
9890: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
98a0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
98b0: 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  v, addrBreak);. 
98c0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
98d0: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
98e0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
98f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
9900: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
9910: 6f 73 65 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  ose, pseudoTab, 
9920: 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0);.  }.}../*.**
9930: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
9940: 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 63 6f  r to a string co
9950: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 27 64 65  ntaining the 'de
9960: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 27 20  claration type' 
9970: 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73  of the.** expres
9980: 73 69 6f 6e 20 70 45 78 70 72 2e 20 54 68 65 20  sion pExpr. The 
9990: 73 74 72 69 6e 67 20 6d 61 79 20 62 65 20 74 72  string may be tr
99a0: 65 61 74 65 64 20 61 73 20 73 74 61 74 69 63 20  eated as static 
99b0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
99c0: 2a 0a 2a 2a 20 41 6c 73 6f 20 74 72 79 20 74 6f  *.** Also try to
99d0: 20 65 73 74 69 6d 61 74 65 20 74 68 65 20 73 69   estimate the si
99e0: 7a 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  ze of the return
99f0: 65 64 20 76 61 6c 75 65 20 61 6e 64 20 72 65 74  ed value and ret
9a00: 75 72 6e 20 74 68 61 74 0a 2a 2a 20 72 65 73 75  urn that.** resu
9a10: 6c 74 20 69 6e 20 2a 70 45 73 74 57 69 64 74 68  lt in *pEstWidth
9a20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 63 6c  ..**.** The decl
9a30: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69 73 20  aration type is 
9a40: 74 68 65 20 65 78 61 63 74 20 64 61 74 61 74 79  the exact dataty
9a50: 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 65 78  pe definition ex
9a60: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
9a70: 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43 52 45  .** original CRE
9a80: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9a90: 65 6e 74 20 69 66 20 74 68 65 20 65 78 70 72 65  ent if the expre
9aa0: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
9ab0: 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c 61 72  n. The.** declar
9ac0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
9ad0: 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69 73 20   ROWID field is 
9ae0: 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74 6c 79  INTEGER. Exactly
9af0: 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65 73 73   when an express
9b00: 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  ion.** is consid
9b10: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 63 61  ered a column ca
9b20: 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69 6e 20  n be complex in 
9b30: 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f 66 20  the presence of 
9b40: 73 75 62 71 75 65 72 69 65 73 2e 20 54 68 65 0a  subqueries. The.
9b50: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
9b60: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c 6c 20  pression in all 
9b70: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
9b80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9b90: 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73 69 64  ts is .** consid
9ba0: 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20 62 79  ered a column by
9bb0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
9bc0: 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 63  **.**   SELECT c
9bd0: 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20  ol FROM tbl;.** 
9be0: 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54    SELECT (SELECT
9bf0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
9c00: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
9c10: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 29  CT col FROM tbl)
9c20: 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 62  ;.**   SELECT ab
9c30: 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 63  c FROM (SELECT c
9c40: 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d 20 74  ol AS abc FROM t
9c50: 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  bl);.** .** The 
9c60: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
9c70: 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65 73 73   for any express
9c80: 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ion other than a
9c90: 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e   column is NULL.
9ca0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9cb0: 69 6e 65 20 68 61 73 20 65 69 74 68 65 72 20 33  ine has either 3
9cc0: 20 6f 72 20 36 20 70 61 72 61 6d 65 74 65 72 73   or 6 parameters
9cd0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
9ce0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
9cf0: 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  the SQLITE_ENABL
9d00: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
9d10: 41 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  A compile-time o
9d20: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 0a 2a  ption is used..*
9d30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
9d40: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
9d50: 54 41 44 41 54 41 0a 23 20 64 65 66 69 6e 65 20  TADATA.# define 
9d60: 63 6f 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43  columnType(A,B,C
9d70: 2c 44 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79  ,D,E,F) columnTy
9d80: 70 65 49 6d 70 6c 28 41 2c 42 2c 43 2c 44 2c 45  peImpl(A,B,C,D,E
9d90: 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ,F).static const
9da0: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
9db0: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
9dc0: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
9dd0: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e  pr *pExpr,.  con
9de0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67  st char **pzOrig
9df0: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
9e00: 20 2a 2a 70 7a 4f 72 69 67 54 61 62 2c 0a 20 20   **pzOrigTab,.  
9e10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
9e20: 72 69 67 43 6f 6c 2c 0a 20 20 75 38 20 2a 70 45  rigCol,.  u8 *pE
9e30: 73 74 57 69 64 74 68 0a 29 7b 0a 20 20 63 68 61  stWidth.){.  cha
9e40: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 44 62  r const *zOrigDb
9e50: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e   = 0;.  char con
9e60: 73 74 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  st *zOrigTab = 0
9e70: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
9e80: 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 23 65  zOrigCol = 0;.#e
9e90: 6c 73 65 20 2f 2a 20 69 66 20 21 64 65 66 69 6e  lse /* if !defin
9ea0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9eb0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
9ec0: 29 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 63 6f  ) */.# define co
9ed0: 6c 75 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44  lumnType(A,B,C,D
9ee0: 2c 45 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65  ,E,F) columnType
9ef0: 49 6d 70 6c 28 41 2c 42 2c 46 29 0a 73 74 61 74  Impl(A,B,F).stat
9f00: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
9f10: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
9f20: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
9f30: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
9f40: 72 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64  r,.  u8 *pEstWid
9f50: 74 68 0a 29 7b 0a 23 65 6e 64 69 66 20 2f 2a 20  th.){.#endif /* 
9f60: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9f70: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
9f80: 54 41 44 41 54 41 29 20 2a 2f 0a 20 20 63 68 61  TADATA) */.  cha
9f90: 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70 65 20 3d  r const *zType =
9fa0: 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 75   0;.  int j;.  u
9fb0: 38 20 65 73 74 57 69 64 74 68 20 3d 20 31 3b 0a  8 estWidth = 1;.
9fc0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 45 78  .  if( NEVER(pEx
9fd0: 70 72 3d 3d 30 29 20 7c 7c 20 70 4e 43 2d 3e 70  pr==0) || pNC->p
9fe0: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
9ff0: 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28  urn 0;.  switch(
a000: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
a010: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
a020: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
a030: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
a040: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
a050: 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e  ion is a column.
a060: 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
a070: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  e the column is 
a080: 62 65 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 65  being.      ** e
a090: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 6e  xtracted from in
a0a0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 70 53 72   NameContext.pSr
a0b0: 63 4c 69 73 74 2e 20 54 68 69 73 20 74 61 62 6c  cList. This tabl
a0c0: 65 20 6d 61 79 20 62 65 20 72 65 61 6c 0a 20 20  e may be real.  
a0d0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
a0e0: 74 61 62 6c 65 20 6f 72 20 61 20 73 75 62 71 75  table or a subqu
a0f0: 65 72 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ery..      */.  
a100: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
a110: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a120: 2f 2a 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  /* Table structu
a130: 72 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65 78 74  re column is ext
a140: 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f 0a 20  racted from */. 
a150: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
a160: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a170: 20 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 63   /* Select the c
a180: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
a190: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
a1a0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 45 78 70   int iCol = pExp
a1b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20  r->iColumn;  /* 
a1c0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
a1d0: 69 6e 20 70 54 61 62 20 2a 2f 0a 20 20 20 20 20  in pTab */.     
a1e0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
a1f0: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
a200: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73  UMN );.      tes
a210: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
a220: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  ==TK_COLUMN );. 
a230: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 20       while( pNC 
a240: 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20  && !pTab ){.    
a250: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61      SrcList *pTa
a260: 62 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  bList = pNC->pSr
a270: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  cList;.        f
a280: 6f 72 28 6a 3d 30 3b 6a 3c 70 54 61 62 4c 69 73  or(j=0;j<pTabLis
a290: 74 2d 3e 6e 53 72 63 20 26 26 20 70 54 61 62 4c  t->nSrc && pTabL
a2a0: 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f  ist->a[j].iCurso
a2b0: 72 21 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  r!=pExpr->iTable
a2c0: 3b 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 69  ;j++);.        i
a2d0: 66 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  f( j<pTabList->n
a2e0: 53 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Src ){.         
a2f0: 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   pTab = pTabList
a300: 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[j].pTab;.   
a310: 20 20 20 20 20 20 20 70 53 20 3d 20 70 54 61 62         pS = pTab
a320: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65  List->a[j].pSele
a330: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ct;.        }els
a340: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  e{.          pNC
a350: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
a360: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
a370: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
a380: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
a390: 2a 20 41 74 20 6f 6e 65 20 74 69 6d 65 2c 20 63  * At one time, c
a3a0: 6f 64 65 20 73 75 63 68 20 61 73 20 22 53 45 4c  ode such as "SEL
a3b0: 45 43 54 20 6e 65 77 2e 78 22 20 77 69 74 68 69  ECT new.x" withi
a3c0: 6e 20 61 20 74 72 69 67 67 65 72 20 77 6f 75 6c  n a trigger woul
a3d0: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 75  d.        ** cau
a3e0: 73 65 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  se this conditio
a3f0: 6e 20 74 6f 20 72 75 6e 2e 20 20 53 69 6e 63 65  n to run.  Since
a400: 20 74 68 65 6e 2c 20 77 65 20 68 61 76 65 20 72   then, we have r
a410: 65 73 74 72 75 63 74 75 72 65 64 20 68 6f 77 0a  estructured how.
a420: 20 20 20 20 20 20 20 20 2a 2a 20 74 72 69 67 67          ** trigg
a430: 65 72 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72  er code is gener
a440: 61 74 65 64 20 61 6e 64 20 73 6f 20 74 68 69 73  ated and so this
a450: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
a460: 20 6c 6f 6e 67 65 72 20 0a 20 20 20 20 20 20 20   longer .       
a470: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 48 6f   ** possible. Ho
a480: 77 65 76 65 72 2c 20 69 74 20 63 61 6e 20 73 74  wever, it can st
a490: 69 6c 6c 20 62 65 20 74 72 75 65 20 66 6f 72 20  ill be true for 
a4a0: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
a4b0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
a4c0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 20 20  ollowing:.      
a4d0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
a4e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a4f0: 31 28 63 6f 6c 20 49 4e 54 45 47 45 52 29 3b 0a  1(col INTEGER);.
a500: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
a510: 45 43 54 20 28 53 45 4c 45 43 54 20 74 31 2e 63  ECT (SELECT t1.c
a520: 6f 6c 29 20 46 52 4f 4d 20 46 52 4f 4d 20 74 31  ol) FROM FROM t1
a530: 3b 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ;.        **.   
a540: 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6c       ** when col
a550: 75 6d 6e 54 79 70 65 28 29 20 69 73 20 63 61 6c  umnType() is cal
a560: 6c 65 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65  led on the expre
a570: 73 73 69 6f 6e 20 22 74 31 2e 63 6f 6c 22 20 69  ssion "t1.col" i
a580: 6e 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a  n the .        *
a590: 2a 20 73 75 62 2d 73 65 6c 65 63 74 2e 20 49 6e  * sub-select. In
a5a0: 20 74 68 69 73 20 63 61 73 65 2c 20 73 65 74 20   this case, set 
a5b0: 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20  the column type 
a5c0: 74 6f 20 4e 55 4c 4c 2c 20 65 76 65 6e 0a 20 20  to NULL, even.  
a5d0: 20 20 20 20 20 20 2a 2a 20 74 68 6f 75 67 68 20        ** though 
a5e0: 69 74 20 73 68 6f 75 6c 64 20 72 65 61 6c 6c 79  it should really
a5f0: 20 62 65 20 22 49 4e 54 45 47 45 52 22 2e 0a 20   be "INTEGER".. 
a600: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
a610: 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
a620: 20 61 20 70 72 6f 62 6c 65 6d 2c 20 61 73 20 74   a problem, as t
a630: 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6f  he column type o
a640: 66 20 22 74 31 2e 63 6f 6c 22 20 69 73 20 6e 65  f "t1.col" is ne
a650: 76 65 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  ver.        ** u
a660: 73 65 64 2e 20 57 68 65 6e 20 63 6f 6c 75 6d 6e  sed. When column
a670: 54 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64  Type() is called
a680: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
a690: 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 22  on .        ** "
a6a0: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 22  (SELECT t1.col)"
a6b0: 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 74 79  , the correct ty
a6c0: 70 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 28  pe is returned (
a6d0: 73 65 65 20 74 68 65 20 54 4b 5f 53 45 4c 45 43  see the TK_SELEC
a6e0: 54 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 72 61  T.        ** bra
a6f0: 6e 63 68 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  nch below.  */. 
a700: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a710: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
a720: 65 72 74 28 20 70 54 61 62 20 26 26 20 70 45 78  ert( pTab && pEx
a730: 70 72 2d 3e 70 54 61 62 3d 3d 70 54 61 62 20 29  pr->pTab==pTab )
a740: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 20 29  ;.      if( pS )
a750: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
a760: 20 22 74 61 62 6c 65 22 20 69 73 20 61 63 74 75   "table" is actu
a770: 61 6c 6c 79 20 61 20 73 75 62 2d 73 65 6c 65 63  ally a sub-selec
a780: 74 20 6f 72 20 61 20 76 69 65 77 20 69 6e 20 74  t or a view in t
a790: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
a7a0: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
a7b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
a7c0: 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  t. Return the de
a7d0: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61  claration type a
a7e0: 6e 64 20 6f 72 69 67 69 6e 0a 20 20 20 20 20 20  nd origin.      
a7f0: 20 20 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68    ** data for th
a800: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  e result-set col
a810: 75 6d 6e 20 6f 66 20 74 68 65 20 73 75 62 2d 73  umn of the sub-s
a820: 65 6c 65 63 74 2e 0a 20 20 20 20 20 20 20 20 2a  elect..        *
a830: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  /.        if( iC
a840: 6f 6c 3e 3d 30 20 26 26 20 41 4c 57 41 59 53 28  ol>=0 && ALWAYS(
a850: 69 43 6f 6c 3c 70 53 2d 3e 70 45 4c 69 73 74 2d  iCol<pS->pEList-
a860: 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >nExpr) ){.     
a870: 20 20 20 20 20 2f 2a 20 49 66 20 69 43 6f 6c 20       /* If iCol 
a880: 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
a890: 6f 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  o, then the expr
a8a0: 65 73 73 69 6f 6e 20 72 65 71 75 65 73 74 73 20  ession requests 
a8b0: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
a8c0: 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 73 75   rowid of the su
a8d0: 62 2d 73 65 6c 65 63 74 20 6f 72 20 76 69 65 77  b-select or view
a8e0: 2e 20 54 68 69 73 20 65 78 70 72 65 73 73 69 6f  . This expressio
a8f0: 6e 20 69 73 20 6c 65 67 61 6c 20 28 73 65 65 20  n is legal (see 
a900: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
a910: 73 74 20 63 61 73 65 20 6d 69 73 63 32 2e 32 2e  st case misc2.2.
a920: 32 29 20 2d 20 69 74 20 61 6c 77 61 79 73 20 65  2) - it always e
a930: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
a940: 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
a950: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e           NameCon
a960: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
a970: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70 53      Expr *p = pS
a980: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
a990: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
a9a0: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
a9b0: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
a9c0: 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20        sNC.pNext 
a9d0: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 20  = pNC;.         
a9e0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e   sNC.pParse = pN
a9f0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20  C->pParse;.     
aa00: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
aa10: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
aa20: 26 7a 4f 72 69 67 44 62 2c 26 7a 4f 72 69 67 54  &zOrigDb,&zOrigT
aa30: 61 62 2c 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65  ab,&zOrigCol, &e
aa40: 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20  stWidth); .     
aa50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
aa60: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 63 68 65   if( pTab->pSche
aa70: 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ma ){.        /*
aa80: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
aa90: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
aaa0: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
aab0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
aac0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
aad0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
aae0: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
aaf0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
ab00: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66  ab->nCol) );.#if
ab10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
ab20: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
ab30: 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  A.        if( iC
ab40: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
ab50: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
ab60: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
ab70: 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64  OrigCol = "rowid
ab80: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
ab90: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
aba0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
abb0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
abc0: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
abd0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
abe0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
abf0: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
ac00: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
ac10: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
ac20: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62          zOrigTab
ac30: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
ac40: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
ac50: 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20  >pParse ){.     
ac60: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
ac70: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
ac80: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
ac90: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
aca0: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
acb0: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
acc0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
acd0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
ace0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
acf0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
ad00: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
ad10: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
ad20: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ad30: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
ad40: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
ad50: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
ad60: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
ad70: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
ad80: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
ad90: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
ada0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
adb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
adc0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
add0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
ade0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
adf0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
ae00: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
ae10: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
ae20: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
ae30: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
ae40: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
ae50: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
ae60: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
ae70: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
ae80: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
ae90: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
aea0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
aeb0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
aec0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
aed0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
aee0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
aef0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
af00: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
af10: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
af20: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
af30: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
af40: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
af50: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
af60: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
af70: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
af80: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
af90: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
afa0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
afb0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
afc0: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
afd0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
afe0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
aff0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b000: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
b010: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
b020: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
b030: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
b040: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
b050: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
b060: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
b070: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
b080: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
b090: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
b0a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
b0b0: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
b0c0: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
b0d0: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
b0e0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
b0f0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
b100: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
b110: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
b120: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
b130: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
b140: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
b150: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
b160: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
b170: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
b180: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
b190: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
b1a0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
b1b0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
b1c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
b1d0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
b1e0: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
b1f0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
b200: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
b210: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
b220: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
b230: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
b240: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
b250: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
b260: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
b270: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
b280: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
b290: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
b2a0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
b2b0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
b2c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
b2d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b2e0: 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51  zType;.#ifdef SQ
b2f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
b300: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
b310: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
b320: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
b330: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
b340: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
b350: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
b360: 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  = 0;.    zType =
b370: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
b380: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
b390: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
b3a0: 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Col, 0);..    /*
b3b0: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
b3c0: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
b3d0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
b3e0: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
b3f0: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
b400: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
b410: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
b420: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
b430: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
b440: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
b450: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
b460: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b470: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
b480: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
b490: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
b4a0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
b4b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
b4c0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
b4d0: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
b4e0: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
b4f0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
b500: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
b510: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
b520: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
b530: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
b540: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
b550: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
b560: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
b570: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
b580: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
b590: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
b5a0: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
b5b0: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
b5c0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
b5d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
b5e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b5f0: 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a  _DECLTYPE) */.}.
b600: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b610: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
b620: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
b630: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
b640: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
b650: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
b660: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
b670: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
b680: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
b690: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
b6a0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
b6b0: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
b6c0: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
b6d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
b6e0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
b6f0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
b700: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
b710: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
b720: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
b730: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
b740: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
b750: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
b760: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
b770: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
b780: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
b790: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
b7a0: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
b7b0: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
b7c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b7d0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
b7e0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
b7f0: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
b800: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
b810: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
b820: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
b830: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
b840: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  f( pParse->colNa
b850: 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28  mesSet || NEVER(
b860: 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  v==0) || db->mal
b870: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
b880: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
b890: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
b8a0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
b8b0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
b8c0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
b8d0: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
b8e0: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
b8f0: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
b900: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
b910: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
b920: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
b930: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
b940: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
b950: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
b960: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
b970: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
b980: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d     if( NEVER(p==
b990: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
b9a0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
b9b0: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
b9c0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
b9d0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
b9e0: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
b9f0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
ba00: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
ba10: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
ba20: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
ba30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
ba40: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
ba50: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  | p->op==TK_AGG_
ba60: 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c  COLUMN) && pTabL
ba70: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
ba80: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
ba90: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
baa0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
bab0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
bac0: 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a  or(j=0; ALWAYS(j
bad0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29  <pTabList->nSrc)
bae0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
baf0: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
bb00: 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69  j].iCursor==p->i
bb10: 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20  Table ) break;. 
bb20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
bb30: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
bb40: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
bb50: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
bb60: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
bb70: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
bb80: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
bb90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
bba0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
bbb0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
bbc0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
bbd0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
bbe0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
bbf0: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
bc00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
bc10: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
bc20: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
bc30: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
bc40: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
bc50: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
bc60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
bc70: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
bc80: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20  OLNAME_NAME, .  
bc90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bca0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
bcb0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
bcc0: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
bcd0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  C);.      }else 
bce0: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  if( fullNames ){
bcf0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
bd00: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
bd10: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
bd20: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
bd30: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
bd40: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
bd50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
bd60: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
bd70: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
bd80: 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
bd90: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
bda0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bdb0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
bdc0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
bdd0: 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
bde0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
bdf0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
be00: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
be10: 2a 7a 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *z = pEList->a[i
be20: 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 7a  ].zSpan;.      z
be30: 20 3d 20 7a 3d 3d 30 20 3f 20 73 71 6c 69 74 65   = z==0 ? sqlite
be40: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 63 6f  3MPrintf(db, "co
be50: 6c 75 6d 6e 25 64 22 2c 20 69 2b 31 29 20 3a 20  lumn%d", i+1) : 
be60: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
be70: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  db, z);.      sq
be80: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
be90: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
bea0: 45 5f 4e 41 4d 45 2c 20 7a 2c 20 53 51 4c 49 54  E_NAME, z, SQLIT
beb0: 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  E_DYNAMIC);.    
bec0: 7d 0a 20 20 7d 0a 20 20 67 65 6e 65 72 61 74 65  }.  }.  generate
bed0: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 70 50 61 72  ColumnTypes(pPar
bee0: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
bef0: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
bf00: 47 69 76 65 6e 20 61 20 61 6e 20 65 78 70 72 65  Given a an expre
bf10: 73 73 69 6f 6e 20 6c 69 73 74 20 28 77 68 69 63  ssion list (whic
bf20: 68 20 69 73 20 72 65 61 6c 6c 79 20 74 68 65 20  h is really the 
bf30: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
bf40: 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 66 6f 72 6d  ons.** that form
bf50: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
bf60: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
bf70: 65 6d 65 6e 74 29 20 63 6f 6d 70 75 74 65 20 61  ement) compute a
bf80: 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 63 6f  ppropriate.** co
bf90: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 61  lumn names for a
bfa0: 20 74 61 62 6c 65 20 74 68 61 74 20 77 6f 75 6c   table that woul
bfb0: 64 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  d hold the expre
bfc0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
bfd0: 2a 20 41 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  * All column nam
bfe0: 65 73 20 77 69 6c 6c 20 62 65 20 75 6e 69 71 75  es will be uniqu
bff0: 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  e..**.** Only th
c000: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
c010: 72 65 20 63 6f 6d 70 75 74 65 64 2e 20 20 43 6f  re computed.  Co
c020: 6c 75 6d 6e 2e 7a 54 79 70 65 2c 20 43 6f 6c 75  lumn.zType, Colu
c030: 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64  mn.zColl,.** and
c040: 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66   other fields of
c050: 20 43 6f 6c 75 6d 6e 20 61 72 65 20 7a 65 72 6f   Column are zero
c060: 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
c070: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
c080: 63 63 65 73 73 2e 20 20 49 66 20 61 20 6d 65 6d  ccess.  If a mem
c090: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
c0a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20  rror occurs,.** 
c0b0: 73 74 6f 72 65 20 4e 55 4c 4c 20 69 6e 20 2a 70  store NULL in *p
c0c0: 61 43 6f 6c 20 61 6e 64 20 30 20 69 6e 20 2a 70  aCol and 0 in *p
c0d0: 6e 43 6f 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  nCol and return 
c0e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f  SQLITE_NOMEM..*/
c0f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
c100: 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70  ctColumnsFromExp
c110: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
c120: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
c130: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
c140: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
c150: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
c160: 20 2f 2a 20 45 78 70 72 20 6c 69 73 74 20 66 72   /* Expr list fr
c170: 6f 6d 20 77 68 69 63 68 20 74 6f 20 64 65 72 69  om which to deri
c180: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
c190: 2a 2f 0a 20 20 69 31 36 20 2a 70 6e 43 6f 6c 2c  */.  i16 *pnCol,
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1b0: 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
c1c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 68 65 72 65   of columns here
c1d0: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70   */.  Column **p
c1e0: 61 43 6f 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  aCol          /*
c1f0: 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 63   Write the new c
c200: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 65 72 65 20  olumn list here 
c210: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
c220: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c230: 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ;   /* Database 
c240: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
c250: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
c260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
c270: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
c280: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2a0: 20 49 6e 64 65 78 20 61 64 64 65 64 20 74 6f 20   Index added to 
c2b0: 6d 61 6b 65 20 74 68 65 20 6e 61 6d 65 20 75 6e  make the name un
c2c0: 69 71 75 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e  ique */.  Column
c2d0: 20 2a 61 43 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20   *aCol, *pCol;  
c2e0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
c2f0: 70 69 6e 67 20 6f 76 65 72 20 72 65 73 75 6c 74  ping over result
c300: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e   columns */.  in
c310: 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t nCol;         
c320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c330: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
c340: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
c350: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 3b 20 20   */.  Expr *p;  
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
c380: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 65 73  for a single res
c390: 75 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  ult column */.  
c3a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c3c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  olumn name */.  
c3d0: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c3f0: 69 7a 65 20 6f 66 20 6e 61 6d 65 20 69 6e 20 7a  ize of name in z
c400: 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28  Name[] */..  if(
c410: 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 6e   pEList ){.    n
c420: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
c430: 78 70 72 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20  xpr;.    aCol = 
c440: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c450: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 61  ero(db, sizeof(a
c460: 43 6f 6c 5b 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20  Col[0])*nCol);. 
c470: 20 20 20 74 65 73 74 63 61 73 65 28 20 61 43 6f     testcase( aCo
c480: 6c 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  l==0 );.  }else{
c490: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20  .    nCol = 0;. 
c4a0: 20 20 20 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d     aCol = 0;.  }
c4b0: 0a 20 20 2a 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c  .  *pnCol = nCol
c4c0: 3b 0a 20 20 2a 70 61 43 6f 6c 20 3d 20 61 43 6f  ;.  *paCol = aCo
c4d0: 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  l;..  for(i=0, p
c4e0: 43 6f 6c 3d 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c  Col=aCol; i<nCol
c4f0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
c500: 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 61 70      /* Get an ap
c510: 70 72 6f 70 72 69 61 74 65 20 6e 61 6d 65 20 66  propriate name f
c520: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  or the column.  
c530: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 73 71 6c    */.    p = sql
c540: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
c550: 61 74 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  ate(pEList->a[i]
c560: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
c570: 20 28 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   (zName = pEList
c580: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30  ->a[i].zName)!=0
c590: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
c5a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61  the column conta
c5b0: 69 6e 73 20 61 6e 20 22 41 53 20 3c 6e 61 6d 65  ins an "AS <name
c5c0: 3e 22 20 70 68 72 61 73 65 2c 20 75 73 65 20 3c  >" phrase, use <
c5d0: 6e 61 6d 65 3e 20 61 73 20 74 68 65 20 6e 61 6d  name> as the nam
c5e0: 65 20 2a 2f 0a 20 20 20 20 20 20 7a 4e 61 6d 65  e */.      zName
c5f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
c600: 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  up(db, zName);. 
c610: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c620: 45 78 70 72 20 2a 70 43 6f 6c 45 78 70 72 20 3d  Expr *pColExpr =
c630: 20 70 3b 20 20 2f 2a 20 54 68 65 20 65 78 70 72   p;  /* The expr
c640: 65 73 73 69 6f 6e 20 74 68 61 74 20 69 73 20 74  ession that is t
c650: 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  he result column
c660: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 54   name */.      T
c670: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
c680: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 61 73 73      /* Table ass
c690: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
c6a0: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  s expression */.
c6b0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 6f        while( pCo
c6c0: 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  lExpr->op==TK_DO
c6d0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  T ){.        pCo
c6e0: 6c 45 78 70 72 20 3d 20 70 43 6f 6c 45 78 70 72  lExpr = pColExpr
c6f0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
c700: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 45 78    assert( pColEx
c710: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  pr!=0 );.      }
c720: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 45  .      if( pColE
c730: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
c740: 4d 4e 20 26 26 20 41 4c 57 41 59 53 28 70 43 6f  MN && ALWAYS(pCo
c750: 6c 45 78 70 72 2d 3e 70 54 61 62 21 3d 30 29 20  lExpr->pTab!=0) 
c760: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ){.        /* Fo
c770: 72 20 63 6f 6c 75 6d 6e 73 20 75 73 65 20 74 68  r columns use th
c780: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61  e column name na
c790: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  me */.        in
c7a0: 74 20 69 43 6f 6c 20 3d 20 70 43 6f 6c 45 78 70  t iCol = pColExp
c7b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
c7c0: 20 20 20 20 70 54 61 62 20 3d 20 70 43 6f 6c 45      pTab = pColE
c7d0: 78 70 72 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  xpr->pTab;.     
c7e0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20     if( iCol<0 ) 
c7f0: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b  iCol = pTab->iPK
c800: 65 79 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  ey;.        zNam
c810: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
c820: 74 66 28 64 62 2c 20 22 25 73 22 2c 0a 20 20 20  tf(db, "%s",.   
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
c840: 6f 6c 3e 3d 30 20 3f 20 70 54 61 62 2d 3e 61 43  ol>=0 ? pTab->aC
c850: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a  ol[iCol].zName :
c860: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
c870: 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c 45   }else if( pColE
c880: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
c890: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
c8a0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
c8b0: 74 79 28 70 43 6f 6c 45 78 70 72 2c 20 45 50 5f  ty(pColExpr, EP_
c8c0: 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20  IntValue) );.   
c8d0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
c8e0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
c8f0: 22 25 73 22 2c 20 70 43 6f 6c 45 78 70 72 2d 3e  "%s", pColExpr->
c900: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
c910: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c920: 2f 2a 20 55 73 65 20 74 68 65 20 6f 72 69 67 69  /* Use the origi
c930: 6e 61 6c 20 74 65 78 74 20 6f 66 20 74 68 65 20  nal text of the 
c940: 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f  column expressio
c950: 6e 20 61 73 20 69 74 73 20 6e 61 6d 65 20 2a 2f  n as its name */
c960: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
c970: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
c980: 64 62 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  db, "%s", pEList
c990: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20  ->a[i].zSpan);. 
c9a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c9b0: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
c9c0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 73  ailed ){.      s
c9d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c9e0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62   zName);.      b
c9f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
ca00: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
ca10: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 73  e column name is
ca20: 20 75 6e 69 71 75 65 2e 20 20 49 66 20 74 68 65   unique.  If the
ca30: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 75 6e 69   name is not uni
ca40: 71 75 65 2c 0a 20 20 20 20 2a 2a 20 61 70 70 65  que,.    ** appe
ca50: 6e 64 20 61 20 69 6e 74 65 67 65 72 20 74 6f 20  nd a integer to 
ca60: 74 68 65 20 6e 61 6d 65 20 73 6f 20 74 68 61 74  the name so that
ca70: 20 69 74 20 62 65 63 6f 6d 65 73 20 75 6e 69 71   it becomes uniq
ca80: 75 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ue..    */.    n
ca90: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
caa0: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
cab0: 20 20 20 66 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20     for(j=cnt=0; 
cac0: 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<i; j++){.     
cad0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
cae0: 43 6d 70 28 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  Cmp(aCol[j].zNam
caf0: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  e, zName)==0 ){.
cb00: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
cb10: 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  ewName;.        
cb20: 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 66  int k;.        f
cb30: 6f 72 28 6b 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e  or(k=nName-1; k>
cb40: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 64 69  1 && sqlite3Isdi
cb50: 67 69 74 28 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b  git(zName[k]); k
cb60: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
cb70: 28 20 7a 4e 61 6d 65 5b 6b 5d 3d 3d 27 3a 27 20  ( zName[k]==':' 
cb80: 29 20 6e 4e 61 6d 65 20 3d 20 6b 3b 0a 20 20 20  ) nName = k;.   
cb90: 20 20 20 20 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65       zName[nName
cba0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  ] = 0;.        z
cbb0: 4e 65 77 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  NewName = sqlite
cbc0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
cbd0: 3a 25 64 22 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63  :%d", zName, ++c
cbe0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nt);.        sql
cbf0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
cc00: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a  Name);.        z
cc10: 4e 61 6d 65 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b  Name = zNewName;
cc20: 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 2d 31 3b  .        j = -1;
cc30: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
cc40: 6d 65 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  me==0 ) break;. 
cc50: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
cc60: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a   pCol->zName = z
cc70: 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Name;.  }.  if( 
cc80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cc90: 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
cca0: 20 6a 3c 69 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<i; j++){.    
ccb0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ccc0: 64 62 2c 20 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  db, aCol[j].zNam
ccd0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
cce0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
ccf0: 61 43 6f 6c 29 3b 0a 20 20 20 20 2a 70 61 43 6f  aCol);.    *paCo
cd00: 6c 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 43 6f  l = 0;.    *pnCo
cd10: 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  l = 0;.    retur
cd20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
cd30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
cd40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cd50: 20 41 64 64 20 74 79 70 65 20 61 6e 64 20 63 6f   Add type and co
cd60: 6c 6c 61 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74  llation informat
cd70: 69 6f 6e 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20  ion to a column 
cd80: 6c 69 73 74 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  list based on.**
cd90: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
cda0: 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20  ent..** .** The 
cdb0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 70 72 65 73  column list pres
cdc0: 75 6d 61 62 6c 79 20 63 61 6d 65 20 66 72 6f 6d  umably came from
cdd0: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d   selectColumnNam
cde0: 65 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 29  esFromExprList()
cdf0: 2e 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20  ..** The column 
ce00: 6c 69 73 74 20 68 61 73 20 6f 6e 6c 79 20 6e 61  list has only na
ce10: 6d 65 73 2c 20 6e 6f 74 20 74 79 70 65 73 20 6f  mes, not types o
ce20: 72 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 20 20 54  r collations.  T
ce30: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67  his.** routine g
ce40: 6f 65 73 20 74 68 72 6f 75 67 68 20 61 6e 64 20  oes through and 
ce50: 61 64 64 73 20 74 68 65 20 74 79 70 65 73 20 61  adds the types a
ce60: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a  nd collations..*
ce70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
ce80: 65 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  e requires that 
ce90: 61 6c 6c 20 69 64 65 6e 74 69 66 69 65 72 73 20  all identifiers 
cea0: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 0a 2a 2a  in the SELECT.**
ceb0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 20 72 65   statement be re
cec0: 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  solved..*/.stati
ced0: 63 20 76 6f 69 64 20 73 65 6c 65 63 74 41 64 64  c void selectAdd
cee0: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
cef0: 6c 61 74 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  lation(.  Parse 
cf00: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
cf10: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
cf20: 78 74 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  xts */.  Table *
cf30: 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  pTab,          /
cf40: 2a 20 41 64 64 20 63 6f 6c 75 6d 6e 20 74 79 70  * Add column typ
cf50: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  e information to
cf60: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
cf70: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
cf80: 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54         /* SELECT
cf90: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
cfa0: 6e 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  ne types and col
cfb0: 6c 61 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20  lations */.){.  
cfc0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cfd0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65  arse->db;.  Name
cfe0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20 43  Context sNC;.  C
cff0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43  olumn *pCol;.  C
d000: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20  ollSeq *pColl;. 
d010: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 20 2a   int i;.  Expr *
d020: 70 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  p;.  struct Expr
d030: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20  List_item *a;.  
d040: 75 36 34 20 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a  u64 szAll = 0;..
d050: 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 65 63    assert( pSelec
d060: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
d070: 28 20 28 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46  ( (pSelect->selF
d080: 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
d090: 65 64 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ed)!=0 );.  asse
d0a0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  rt( pTab->nCol==
d0b0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
d0c0: 3e 6e 45 78 70 72 20 7c 7c 20 64 62 2d 3e 6d 61  >nExpr || db->ma
d0d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
d0e0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
d0f0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
d100: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
d110: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
d120: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
d130: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
d140: 20 61 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45   a = pSelect->pE
d150: 4c 69 73 74 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  List->a;.  for(i
d160: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
d170: 43 6f 6c 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  Col; i<pTab->nCo
d180: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
d190: 0a 20 20 20 20 70 20 3d 20 61 5b 69 5d 2e 70 45  .    p = a[i].pE
d1a0: 78 70 72 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  xpr;.    pCol->z
d1b0: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Type = sqlite3Db
d1c0: 53 74 72 44 75 70 28 64 62 2c 20 63 6f 6c 75 6d  StrDup(db, colum
d1d0: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 30 2c  nType(&sNC, p,0,
d1e0: 30 2c 30 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73  0,0, &pCol->szEs
d1f0: 74 29 29 3b 0a 20 20 20 20 73 7a 41 6c 6c 20 2b  t));.    szAll +
d200: 3d 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20  = pCol->szEst;. 
d210: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74     pCol->affinit
d220: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
d230: 66 66 69 6e 69 74 79 28 70 29 3b 0a 20 20 20 20  ffinity(p);.    
d240: 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  if( pCol->affini
d250: 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d 3e 61 66  ty==0 ) pCol->af
d260: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
d270: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 70 43  AFF_NONE;.    pC
d280: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
d290: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
d2a0: 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f   p);.    if( pCo
d2b0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  ll ){.      pCol
d2c0: 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  ->zColl = sqlite
d2d0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 43  3DbStrDup(db, pC
d2e0: 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
d2f0: 20 7d 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 73   }.  }.  pTab->s
d300: 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65  zTabRow = sqlite
d310: 33 4c 6f 67 45 73 74 28 73 7a 41 6c 6c 2a 34 29  3LogEst(szAll*4)
d320: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
d330: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
d340: 65 6e 74 2c 20 67 65 6e 65 72 61 74 65 20 61 20  ent, generate a 
d350: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
d360: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 0a 2a  that describes.*
d370: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  * the result set
d380: 20 6f 66 20 74 68 61 74 20 53 45 4c 45 43 54 2e   of that SELECT.
d390: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
d3a0: 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
d3b0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
d3c0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  e, Select *pSele
d3d0: 63 74 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ct){.  Table *pT
d3e0: 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ab;.  sqlite3 *d
d3f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
d400: 20 20 69 6e 74 20 73 61 76 65 64 46 6c 61 67 73    int savedFlags
d410: 3b 0a 0a 20 20 73 61 76 65 64 46 6c 61 67 73 20  ;..  savedFlags 
d420: 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 64  = db->flags;.  d
d430: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
d440: 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73  ITE_FullColNames
d450: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
d460: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
d470: 4e 61 6d 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  Names;.  sqlite3
d480: 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73  SelectPrep(pPars
d490: 65 2c 20 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e, pSelect, 0);.
d4a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
d4b0: 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  rr ) return 0;. 
d4c0: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
d4d0: 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 65 63  >pPrior ) pSelec
d4e0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
d4f0: 69 6f 72 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ior;.  db->flags
d500: 20 3d 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 20   = savedFlags;. 
d510: 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
d520: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
d530: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 20 29 3b  sizeof(Table) );
d540: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29  .  if( pTab==0 )
d550: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d560: 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20 73 71 6c    }.  /* The sql
d570: 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
d580: 65 6c 65 63 74 28 29 20 69 73 20 6f 6e 6c 79 20  elect() is only 
d590: 75 73 65 64 20 6e 20 63 6f 6e 74 65 78 74 73 20  used n contexts 
d5a0: 77 68 65 72 65 20 6c 6f 6f 6b 61 73 69 64 65 0a  where lookaside.
d5b0: 20 20 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64    ** is disabled
d5c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 62   */.  assert( db
d5d0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
d5e0: 62 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 70 54 61  bled==0 );.  pTa
d5f0: 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  b->nRef = 1;.  p
d600: 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  Tab->zName = 0;.
d610: 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20    pTab->nRowEst 
d620: 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 73 65 6c  = 1048576;.  sel
d630: 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
d640: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
d650: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
d660: 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
d670: 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 73 65 6c  ab->aCol);.  sel
d680: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
d690: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61  AndCollation(pPa
d6a0: 72 73 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 65  rse, pTab, pSele
d6b0: 63 74 29 3b 0a 20 20 70 54 61 62 2d 3e 69 50 4b  ct);.  pTab->iPK
d6c0: 65 79 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64  ey = -1;.  if( d
d6d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d6e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
d6f0: 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 54  leteTable(db, pT
d700: 61 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ab);.    return 
d710: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
d720: 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pTab;.}../*.** G
d730: 65 74 20 61 20 56 44 42 45 20 66 6f 72 20 74 68  et a VDBE for th
d740: 65 20 67 69 76 65 6e 20 70 61 72 73 65 72 20 63  e given parser c
d750: 6f 6e 74 65 78 74 2e 20 20 43 72 65 61 74 65 20  ontext.  Create 
d760: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
d770: 65 73 73 61 72 79 2e 0a 2a 2a 20 49 66 20 61 6e  essary..** If an
d780: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
d790: 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c  eturn NULL and l
d7a0: 65 61 76 65 20 61 20 6d 65 73 73 61 67 65 20 69  eave a message i
d7b0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 56 64 62  n pParse..*/.Vdb
d7c0: 65 20 2a 73 71 6c 69 74 65 33 47 65 74 56 64 62  e *sqlite3GetVdb
d7d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
d7e0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
d7f0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
d800: 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20 20 20 76  f( v==0 ){.    v
d810: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
d820: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 72   = sqlite3VdbeCr
d830: 65 61 74 65 28 70 50 61 72 73 65 29 3b 0a 23 69  eate(pParse);.#i
d840: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d850: 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20  T_TRACE.    if( 
d860: 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  v ){.      sqlit
d870: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
d880: 4f 50 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d  OP_Trace);.    }
d890: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
d8a0: 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn v;.}.../*.*
d8b0: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c  * Compute the iL
d8c0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
d8d0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53   fields of the S
d8e0: 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74  ELECT based on t
d8f0: 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64  he.** pLimit and
d900: 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73 73   pOffset express
d910: 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e  ions.  pLimit an
d920: 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74  d pOffset hold t
d930: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  he expressions.*
d940: 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  * that appear in
d950: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
d960: 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65  L statement afte
d970: 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  r the LIMIT and 
d980: 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72  OFFSET.** keywor
d990: 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20  ds.  Or NULL if 
d9a0: 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61  those keywords a
d9b0: 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d  re omitted. iLim
d9c0: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a  it and iOffset .
d9d0: 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65 67  ** are the integ
d9e0: 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  er memory regist
d9f0: 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63  er numbers for c
da00: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20  ounters used to 
da10: 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20  compute .** the 
da20: 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74  limit and offset
da30: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
da40: 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f  o limit and/or o
da50: 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20  ffset, then .** 
da60: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
da70: 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e  et are negative.
da80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
da90: 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65 20  ine changes the 
daa0: 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74  values of iLimit
dab0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c   and iOffset onl
dac0: 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20  y if.** a limit 
dad0: 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65 66  or offset is def
dae0: 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61  ined by pLimit a
daf0: 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69  nd pOffset.  iLi
db00: 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73  mit and.** iOffs
db10: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  et should have b
db20: 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70  een preset to ap
db30: 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c  propriate defaul
db40: 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29 0a  t values (zero).
db50: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
db60: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
db70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66 66  ..**.** The iOff
db80: 73 65 74 20 72 65 67 69 73 74 65 72 20 28 69 66  set register (if
db90: 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20 69   it exists) is i
dba0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74 68  nitialized to th
dbb0: 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68  e value.** of th
dbc0: 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20 69  e OFFSET.  The i
dbd0: 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 69  Limit register i
dbe0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
dbf0: 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74 65   LIMIT.  Registe
dc00: 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20 69  r.** iOffset+1 i
dc10: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
dc20: 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a 2a   LIMIT+OFFSET..*
dc30: 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69  *.** Only if pLi
dc40: 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65  mit!=0 or pOffse
dc50: 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69  t!=0 do the limi
dc60: 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a  t registers get.
dc70: 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54  ** redefined.  T
dc80: 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
dc90: 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20  rator uses this 
dca0: 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63  property to forc
dcb0: 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f  e.** the reuse o
dcc0: 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74  f the same limit
dcd0: 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69   and offset regi
dce0: 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c  sters across mul
dcf0: 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20  tiple.** SELECT 
dd00: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  statements..*/.s
dd10: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75  tatic void compu
dd20: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
dd30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
dd40: 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69  Select *p, int i
dd50: 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a  Break){.  Vdbe *
dd60: 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69  v = 0;.  int iLi
dd70: 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  mit = 0;.  int i
dd80: 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64  Offset;.  int ad
dd90: 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d  dr1, n;.  if( p-
dda0: 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >iLimit ) return
ddb0: 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c  ;..  /* .  ** "L
ddc0: 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20  IMIT -1" always 
ddd0: 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20  shows all rows. 
dde0: 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20   There is some. 
ddf0: 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20   ** controversy 
de00: 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63  about what the c
de10: 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20  orrect behavior 
de20: 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20  should be..  ** 
de30: 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c  The current impl
de40: 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72  ementation inter
de50: 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20  prets "LIMIT 0" 
de60: 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20  to mean.  ** no 
de70: 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rows..  */.  sql
de80: 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
de90: 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  ar(pParse);.  as
dea0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
deb0: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74  ==0 || p->pLimit
dec0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
ded0: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d  pLimit ){.    p-
dee0: 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  >iLimit = iLimit
def0: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
df00: 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  m;.    v = sqlit
df10: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
df20: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
df30: 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 73  !=0 );.    if( s
df40: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
df50: 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20 26  ger(p->pLimit, &
df60: 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  n) ){.      sqli
df70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
df80: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c 20   OP_Integer, n, 
df90: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
dfa0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
dfb0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
dfc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  ;.      if( n==0
dfd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
dfe0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
dff0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42 72   OP_Goto, 0, iBr
e000: 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  eak);.      }els
e010: 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70 2d  e if( n>=0 && p-
e020: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36 34  >nSelectRow>(u64
e030: 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  )n ){.        p-
e040: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 3b  >nSelectRow = n;
e050: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e060: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
e070: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e080: 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c 69  , p->pLimit, iLi
e090: 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  mit);.      sqli
e0a0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
e0b0: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
e0c0: 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56 64  Limit);.      Vd
e0d0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c  beComment((v, "L
e0e0: 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29 3b  IMIT counter"));
e0f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e100: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
e110: 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20 69  fZero, iLimit, i
e120: 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  Break);.    }.  
e130: 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74    if( p->pOffset
e140: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66   ){.      p->iOf
e150: 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20 3d  fset = iOffset =
e160: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
e170: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
e180: 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c 6f  Mem++;   /* Allo
e190: 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72 65  cate an extra re
e1a0: 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69 74  gister for limit
e1b0: 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20  +offset */.     
e1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e1d0: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66 66  (pParse, p->pOff
e1e0: 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  set, iOffset);. 
e1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e200: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73  AddOp1(v, OP_Mus
e210: 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74 29  tBeInt, iOffset)
e220: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
e230: 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54 20  ent((v, "OFFSET 
e240: 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20  counter"));.    
e250: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
e260: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
e270: 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65 74  P_IfPos, iOffset
e280: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e290: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
e2a0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f 66  _Integer, 0, iOf
e2b0: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
e2c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e2d0: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
e2e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e2f0: 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20 69  Op3(v, OP_Add, i
e300: 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c 20  Limit, iOffset, 
e310: 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20 20  iOffset+1);.    
e320: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e330: 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54 22  , "LIMIT+OFFSET"
e340: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
e350: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
e360: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
e370: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
e380: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e390: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
e3a0: 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29 3b   -1, iOffset+1);
e3b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e3c0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
e3d0: 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dr1);.    }.  }.
e3e0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
e3f0: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
e400: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74  SELECT./*.** Ret
e410: 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
e420: 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ate collating se
e430: 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 69  quence for the i
e440: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
e450: 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 73  .** the result s
e460: 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f  et for the compo
e470: 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74 65  und-select state
e480: 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75 72  ment "p".  Retur
e490: 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68 65  n NULL if.** the
e4a0: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20 64   column has no d
e4b0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
e4c0: 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a   sequence..**.**
e4d0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
e4e0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
e4f0: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
e500: 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68  is taken from th
e510: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
e520: 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65 63  erm of the selec
e530: 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  t that has a col
e540: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
e550: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
e560: 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 43  eq *multiSelectC
e570: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
e580: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
e590: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43 6f   int iCol){.  Co
e5a0: 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20 69  llSeq *pRet;.  i
e5b0: 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
e5c0: 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74 69      pRet = multi
e5d0: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
e5e0: 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72 2c  arse, p->pPrior,
e5f0: 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b   iCol);.  }else{
e600: 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20  .    pRet = 0;. 
e610: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f   }.  assert( iCo
e620: 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  l>=0 );.  if( pR
e630: 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70 2d  et==0 && iCol<p-
e640: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
e650: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71 6c  {.    pRet = sql
e660: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
e670: 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73  pParse, p->pELis
e680: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
e690: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
e6a0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pRet;.}../*.** T
e6b0: 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  he select statem
e6c0: 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ent passed as th
e6d0: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
e6e0: 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  er is a compound
e6f0: 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68 20   SELECT.** with 
e700: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
e710: 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  se. This functio
e720: 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64 20  n allocates and 
e730: 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e 66  returns a KeyInf
e740: 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 73  o.** structure s
e750: 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70 6c  uitable for impl
e760: 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52 44  ementing the ORD
e770: 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  ER BY..**.** Spa
e780: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
e790: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
e7a0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
e7b0: 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63 61  m malloc. The ca
e7c0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
e7d0: 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  n is responsible
e7e0: 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74 68   for ensuring th
e7f0: 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72  at this structur
e800: 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a  e is eventually.
e810: 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61  ** freed..*/.sta
e820: 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c  tic KeyInfo *mul
e830: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
e840: 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyInfo(Parse *pP
e850: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
e860: 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20   int nExtra){.  
e870: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
e880: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
e890: 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
e8a0: 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e   = p->pOrderBy->
e8b0: 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65 33  nExpr;.  sqlite3
e8c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e8d0: 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 52  b;.  KeyInfo *pR
e8e0: 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  et = sqlite3KeyI
e8f0: 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72  nfoAlloc(db, nOr
e900: 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31 29  derBy+nExtra, 1)
e910: 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a  ;.  if( pRet ){.
e920: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
e930: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72  or(i=0; i<nOrder
e940: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
e950: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
e960: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
e970: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20  OrderBy->a[i];. 
e980: 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72 6d       Expr *pTerm
e990: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
e9a0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
e9b0: 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69 66  pColl;..      if
e9c0: 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
e9d0: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
e9e0: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
e9f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
ea00: 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29  q(pParse, pTerm)
ea10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ea20: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
ea30: 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
ea40: 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74  q(pParse, p, pIt
ea50: 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
ea60: 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Col-1);.        
ea70: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70  if( pColl==0 ) p
ea80: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
ea90: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Coll;.        pO
eaa0: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
eab0: 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 73  pr =.          s
eac0: 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
ead0: 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72 73  lateString(pPars
eae0: 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d  e, pTerm, pColl-
eaf0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
eb00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
eb10: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
eb20: 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20 29  riteable(pRet) )
eb30: 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 43  ;.      pRet->aC
eb40: 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a  oll[i] = pColl;.
eb50: 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f 72        pRet->aSor
eb60: 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64  tOrder[i] = pOrd
eb70: 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f  erBy->a[i].sortO
eb80: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
eb90: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
eba0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
ebb0: 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
ebc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
ebd0: 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64  nerates VDBE cod
ebe0: 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  e to compute the
ebf0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 49   content of a WI
ec00: 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a 20  TH RECURSIVE.** 
ec10: 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 72  query of the for
ec20: 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63 75  m:.**.**   <recu
ec30: 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53 20  rsive-table> AS 
ec40: 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20 55  (<setup-query> U
ec50: 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63 75  NION [ALL] <recu
ec60: 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a 2a  rsive-query>).**
ec70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec80: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
ec90: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20  _____/          
eca0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
ecb0: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20 20    p->pPrior     
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecf0: 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72   p.**.**.** Ther
ed00: 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  e is exactly one
ed10: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
ed20: 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
ed30: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
ed40: 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75 72  ause.** of recur
ed50: 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72 6b  sive-query, mark
ed60: 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63 4c  ed with the SrcL
ed70: 69 73 74 2d 3e 61 5b 5d 2e 69 73 52 65 63 75 72  ist->a[].isRecur
ed80: 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a  sive flag..**.**
ed90: 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72 79   The setup-query
eda0: 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67 65   runs once to ge
edb0: 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69 61  nerate an initia
edc0: 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74 68  l set of rows th
edd0: 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20  at go.** into a 
ede0: 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52 6f  Queue table.  Ro
edf0: 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65 64  ws are extracted
ee00: 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65 20   from the Queue 
ee10: 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a 20  table one by.** 
ee20: 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20 65  one.  Each row e
ee30: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
ee40: 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74 6f  eue is output to
ee50: 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74 68   pDest.  Then th
ee60: 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74 72  e single.** extr
ee70: 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20 69  acted row (now i
ee80: 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20 74  n the iCurrent t
ee90: 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74 68  able) becomes th
eea0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
eeb0: 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74 61  .** recursive-ta
eec0: 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72 73  ble for a recurs
eed0: 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20 20  ive-query run.  
eee0: 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  The output of th
eef0: 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72  e recursive-quer
ef00: 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62 61  y.** is added ba
ef10: 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75  ck into the Queu
ef20: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20 61  e table.  Then a
ef30: 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65 78  nother row is ex
ef40: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75 65  tracted from Que
ef50: 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 74  ue.** and the it
ef60: 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  eration continue
ef70: 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75  s until the Queu
ef80: 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
ef90: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
efa0: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f 70  ompound query op
efb0: 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
efc0: 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61 74  then no duplicat
efd0: 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72 0a  e rows are ever.
efe0: 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
eff0: 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c 65   the Queue table
f000: 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63 74  .  The iDistinct
f010: 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20 63   table keeps a c
f020: 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73 0a  opy of all rows.
f030: 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76 65  ** that have eve
f040: 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  r been inserted 
f050: 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20 63  into Queue and c
f060: 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65 73  auses duplicates
f070: 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61 72   to be.** discar
f080: 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70 65  ded.  If the ope
f090: 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20 41  rator is UNION A
f0a0: 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63 61  LL, then duplica
f0b0: 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  tes are allowed.
f0c0: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 71  .** .** If the q
f0d0: 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44 45  uery has an ORDE
f0e0: 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72 69  R BY, then entri
f0f0: 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65 20  es in the Queue 
f100: 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20 69  table are kept i
f110: 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 72  n.** ORDER BY or
f120: 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72 73  der and the firs
f130: 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72 61  t entry is extra
f140: 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63 79  cted for each cy
f150: 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a 2a  cle.  Without.**
f160: 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68   an ORDER BY, th
f170: 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73  e Queue table is
f180: 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a 2a   just a FIFO..**
f190: 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20 63  .** If a LIMIT c
f1a0: 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64 65  lause is provide
f1b0: 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72  d, then the iter
f1c0: 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74 65  ation stops afte
f1d0: 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a 20  r LIMIT rows.** 
f1e0: 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75 74  have been output
f1f0: 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c 49   to pDest.  A LI
f200: 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61 6e  MIT of zero mean
f210: 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20 72  s to output no r
f220: 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65 67  ows and a.** neg
f230: 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61 6e  ative LIMIT mean
f240: 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c 20  s to output all 
f250: 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65 20  rows.  If there 
f260: 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53 45  is also an OFFSE
f270: 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74 68  T clause.** with
f280: 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
f290: 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
f2a0: 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74 73  t OFFSET outputs
f2b0: 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20 72   are discarded r
f2c0: 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62 65  ather.** than be
f2d0: 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65 73  ing sent to pDes
f2e0: 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63 6f  t.  The LIMIT co
f2f0: 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  unt does not beg
f300: 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20 4f  in until after O
f310: 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68 61  FFSET.** rows ha
f320: 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 2e  ve been skipped.
f330: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f340: 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63 75  generateWithRecu
f350: 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50 61  rsiveQuery(.  Pa
f360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
f370: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
f380: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
f390: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
f3a0: 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73 69    /* The recursi
f3b0: 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65 20  ve SELECT to be 
f3c0: 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
f3d0: 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
f3e0: 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
f3f0: 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
f400: 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
f410: 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53 72  t *pSrc = p->pSr
f420: 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46  c;      /* The F
f430: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
f440: 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  e recursive quer
f450: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  y */.  int nCol 
f460: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
f470: 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  pr;  /* Number o
f480: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
f490: 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
f4a0: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
f4b0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
f4c0: 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
f4d0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e  red statement un
f4e0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
f4f0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
f500: 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72  etup = p->pPrior
f510: 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75 70  ;   /* The setup
f520: 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
f530: 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20 20  addrTop;        
f540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70            /* Top
f550: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
f560: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c 20    int addrCont, 
f570: 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20 20  addrBreak;      
f580: 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64 20  /* CONTINUE and 
f590: 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73 20  BREAK addresses 
f5a0: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65 6e  */.  int iCurren
f5b0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
f5c0: 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65 6e     /* The Curren
f5d0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  t table */.  int
f5e0: 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20 20   regCurrent;    
f5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
f600: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 43  gister holding C
f610: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
f620: 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20 20    int iQueue;   
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61 62  /* The Queue tab
f650: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 73  le */.  int iDis
f660: 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20 20  tinct = 0;      
f670: 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75        /* To ensu
f680: 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c 74  re unique result
f690: 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20  s if UNION */.  
f6a0: 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f  int eDest = SRT_
f6b0: 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  Table;        /*
f6c0: 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74 6f   How to write to
f6d0: 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c 65   Queue */.  Sele
f6e0: 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75 65  ctDest destQueue
f6f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  ;         /* Sel
f700: 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74 69  ectDest targetti
f710: 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61 62  ng the Queue tab
f720: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  le */.  int i;  
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
f750: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
f760: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
f770: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
f780: 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70  lt code */.  Exp
f790: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
f7a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f7b0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
f7c0: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69  e */.  Expr *pLi
f7d0: 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 20  mit, *pOffset;  
f7e0: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c 49       /* Saved LI
f7f0: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a  MIT and OFFSET *
f800: 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74  /.  int regLimit
f810: 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20 20  , regOffset;    
f820: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 75    /* Registers u
f830: 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e 64  sed by LIMIT and
f840: 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a   OFFSET */..  /*
f850: 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69 7a   Obtain authoriz
f860: 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72 65  ation to do a re
f870: 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
f880: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
f890: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
f8a0: 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56 45  SQLITE_RECURSIVE
f8b0: 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
f8c0: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  urn;..  /* Proce
f8d0: 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  ss the LIMIT and
f8e0: 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2c   OFFSET clauses,
f8f0: 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20 2a   if they exist *
f900: 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d 20  /.  addrBreak = 
f910: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
f920: 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70 75  abel(v);.  compu
f930: 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
f940: 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64 72  (pParse, p, addr
f950: 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69 74  Break);.  pLimit
f960: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
f970: 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
f980: 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69 74  fset;.  regLimit
f990: 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20   = p->iLimit;.  
f9a0: 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69  regOffset = p->i
f9b0: 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c 69  Offset;.  p->pLi
f9c0: 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  mit = p->pOffset
f9d0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69   = 0;.  p->iLimi
f9e0: 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  t = p->iOffset =
f9f0: 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d   0;.  pOrderBy =
fa00: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
fa10: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63   /* Locate the c
fa20: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
fa30: 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c  the Current tabl
fa40: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
fa50: 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e  ALWAYS(i<pSrc->n
fa60: 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Src); i++){.    
fa70: 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69  if( pSrc->a[i].i
fa80: 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  sRecursive ){.  
fa90: 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70      iCurrent = p
faa0: 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
fab0: 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  r;.      break;.
fac0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
fad0: 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73  Allocate cursors
fae0: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75 65   numbers for Que
faf0: 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e  ue and Distinct.
fb00: 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    The cursor num
fb10: 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65  ber for.  ** the
fb20: 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65 20   Distinct table 
fb30: 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
fb40: 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61 6e  one greater than
fb50: 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72 0a   Queue in order.
fb60: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52 54    ** for the SRT
fb70: 5f 44 69 73 74 54 61 62 6c 65 20 61 6e 64 20 53  _DistTable and S
fb80: 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65 73  RT_DistQueue des
fb90: 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f 72  tinations to wor
fba0: 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20 3d  k. */.  iQueue =
fbb0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
fbc0: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b  .  if( p->op==TK
fbd0: 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65 44  _UNION ){.    eD
fbe0: 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
fbf0: 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 3a   SRT_DistQueue :
fc00: 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65 3b 0a   SRT_DistTable;.
fc10: 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20      iDistinct = 
fc20: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
fc30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44 65    }else{.    eDe
fc40: 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f 20  st = pOrderBy ? 
fc50: 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54 5f  SRT_Queue : SRT_
fc60: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  Table;.  }.  sql
fc70: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
fc80: 69 74 28 26 64 65 73 74 51 75 65 75 65 2c 20 65  it(&destQueue, e
fc90: 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a 0a  Dest, iQueue);..
fca0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63 75    /* Allocate cu
fcb0: 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65 6e  rsors for Curren
fcc0: 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44 69  t, Queue, and Di
fcd0: 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65 67  stinct. */.  reg
fce0: 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61 72  Current = ++pPar
fcf0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
fd00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
fd10: 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
fd20: 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75 72  iCurrent, regCur
fd30: 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69  rent, nCol);.  i
fd40: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
fd50: 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
fd60: 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Info = multiSele
fd70: 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66 6f  ctOrderByKeyInfo
fd80: 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b 0a  (pParse, p, 1);.
fd90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fda0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
fdb0: 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75  Ephemeral, iQueu
fdc0: 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
fdd0: 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20  pr+2, 0,.       
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
fdf0: 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
fe00: 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
fe10: 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64 65   destQueue.pOrde
fe20: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
fe30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
fe40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
fe50: 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
fe60: 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f 6c  al, iQueue, nCol
fe70: 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f 6d  );.  }.  VdbeCom
fe80: 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65 20  ment((v, "Queue 
fe90: 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28 20  table"));.  if( 
fea0: 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  iDistinct ){.   
feb0: 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
fec0: 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64 62  [0] = sqlite3Vdb
fed0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
fee0: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44 69  enEphemeral, iDi
fef0: 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20 20  stinct, 0);.    
ff00: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
ff10: 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
ff20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61 63  .  }..  /* Detac
ff30: 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
ff40: 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 63  lause from the c
ff50: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 2a  ompound SELECT *
ff60: 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  /.  p->pOrderBy 
ff70: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72 65  = 0;..  /* Store
ff80: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
ff90: 74 68 65 20 73 65 74 75 70 2d 71 75 65 72 79 20  the setup-query 
ffa0: 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20 72  in Queue. */.  r
ffb0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
ffc0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75 70  t(pParse, pSetup
ffd0: 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a 20  , &destQueue);. 
ffe0: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
fff0: 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
10000 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e  query;..  /* Fin
10010 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  d the next row i
10020 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20  n the Queue and 
10030 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20  output that row 
10040 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
10050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10060 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
10070 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b  Queue, addrBreak
10080 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
10090 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
100a0 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
100b0 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
100c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
100d0 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
100e0 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
100f0 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
10100 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
10110 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
10120 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
10130 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
10140 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
10150 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
10160 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10180 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
10190 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
101a0 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
101b0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
101c0 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
101d0 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
101e0 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
101f0 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
10200 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
10210 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
10220 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
10230 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
10240 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
10250 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
10260 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
10270 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20  t, iCurrent,.   
10280 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20     0, 0, pDest, 
10290 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
102a0 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c  eak);.  if( regL
102b0 69 6d 69 74 20 29 20 73 71 6c 69 74 65 33 56 64  imit ) sqlite3Vd
102c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
102d0 66 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  fZero, regLimit,
102e0 20 61 64 64 72 42 72 65 61 6b 2c 20 2d 31 29 3b   addrBreak, -1);
102f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
10300 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
10310 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45  drCont);..  /* E
10320 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72  xecute the recur
10330 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69  sive SELECT taki
10340 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ng the single ro
10350 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a  w in Current as.
10360 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66    ** the value f
10370 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
10380 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68  -table. Store th
10390 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
103a0 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70   Queue..  */.  p
103b0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
103c0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
103d0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75  arse, p, &destQu
103e0 65 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  eue);.  assert( 
103f0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  p->pPrior==0 );.
10400 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53    p->pPrior = pS
10410 65 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70  etup;..  /* Keep
10420 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f   running the loo
10430 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75  p until the Queu
10440 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  e is empty */.  
10450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10460 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
10470 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
10480 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10490 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
104a0 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75  k);..end_of_recu
104b0 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 70  rsive_query:.  p
104c0 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
104d0 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d  derBy;.  p->pLim
104e0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
104f0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
10500 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  set;.  return;.}
10510 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10520 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
10530 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
10540 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
10550 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
10560 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
10570 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10580 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10590 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
105a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
105b0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
105c0 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
105d0 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
105e0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
105f0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
10600 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
10610 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  s */.);.../*.** 
10620 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
10630 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
10640 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
10650 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
10660 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
10670 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
10680 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
10690 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
106a0 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
106b0 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
106c0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
106d0 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
106e0 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
106f0 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
10700 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
10710 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
10720 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
10730 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
10740 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
10750 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
10760 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
10770 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
10780 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
10790 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
107a0 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
107b0 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
107c0 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
107d0 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
107e0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
107f0 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
10800 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
10810 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
10820 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
10830 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
10840 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
10850 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
10860 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
10870 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
10880 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
10890 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
108a0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
108b0 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
108c0 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
108d0 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
108e0 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
108f0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
10900 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
10910 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
10920 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
10930 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
10940 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
10950 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
10960 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
10970 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
10980 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
10990 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
109a0 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
109b0 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
109c0 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
109d0 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
109e0 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
109f0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
10a00 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
10a10 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
10a20 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
10a30 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
10a40 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
10a50 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
10a60 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
10a70 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
10a80 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
10a90 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
10aa0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
10ab0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10ac0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10ad0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10ae0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
10af0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
10b00 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
10b10 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
10b20 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
10b30 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
10b40 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
10b50 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
10b60 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
10b70 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
10b80 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
10b90 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
10ba0 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
10bb0 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
10bc0 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
10bd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10be0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10bf0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
10c00 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
10c10 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
10c20 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
10c30 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
10c40 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
10c50 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
10c60 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
10c70 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
10c80 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
10c90 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
10ca0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
10cb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10cc0 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
10cd0 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub1 = 0;       
10ce0 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
10cf0 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
10d00 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30  .  int iSub2 = 0
10d10 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
10d20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
10d30 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
10d40 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
10d50 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
10d60 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
10d70 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
10d80 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
10d90 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
10da0 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
10db0 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
10dc0 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
10dd0 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
10de0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
10df0 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
10e00 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
10e10 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
10e20 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
10e30 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
10e40 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
10e50 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
10e60 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
10e70 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
10e80 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10e90 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
10ea0 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
10eb0 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
10ec0 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61  t!=pPrior );.  a
10ed0 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
10ee0 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52  Rightmost==p->pR
10ef0 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65  ightmost );.  de
10f00 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69  st = *pDest;.  i
10f10 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
10f20 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
10f30 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10f40 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
10f50 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
10f60 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
10f70 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
10f80 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
10f90 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
10fa0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
10fb0 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
10fc0 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
10fd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10fe0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
10ff0 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
11000 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
11010 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
11020 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
11030 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
11040 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
11050 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
11060 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
11070 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11080 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
11090 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
110a0 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
110b0 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
110c0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
110d0 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
110e0 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
110f0 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
11100 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
11110 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
11120 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
11130 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
11140 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
11150 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11160 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
11170 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d  dest.iSDParm, p-
11180 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
11190 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
111a0 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
111b0 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
111c0 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
111d0 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
111e0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
111f0 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
11200 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
11210 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
11220 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
11230 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
11240 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
11250 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
11260 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
11270 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
11280 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
11290 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
112a0 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  pr ){.    if( p-
112b0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56  >selFlags & SF_V
112c0 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73  alues ){.      s
112d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
112e0 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55  Parse, "all VALU
112f0 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  ES must have the
11300 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
11310 74 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c  terms");.    }el
11320 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
11330 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11340 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
11350 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
11360 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20 20   of %s".        
11370 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
11380 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
11390 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
113a0 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
113b0 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ->op));.    }.  
113c0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
113d0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
113e0 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  end;.  }..#ifnde
113f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
11400 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  E.  if( p->selFl
11410 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
11420 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ve ){.    genera
11430 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
11440 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
11450 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  &dest);.  }else.
11460 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
11470 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
11480 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
11490 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
114a0 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
114b0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
114c0 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
114d0 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
114e0 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
114f0 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
11500 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65  }else..  /* Gene
11510 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
11520 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
11530 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11540 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
11550 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
11560 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
11570 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
11580 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  0;.      int nLi
11590 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  mit;.      asser
115a0 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
115b0 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  it );.      pPri
115c0 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->iLimit = p->
115d0 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  iLimit;.      pP
115e0 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20  rior->iOffset = 
115f0 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->iOffset;.    
11600 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74    pPrior->pLimit
11610 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
11620 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
11630 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
11640 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
11650 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
11660 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
11670 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
11680 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
11690 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
116a0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
116b0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
116c0 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
116d0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
116e0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
116f0 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
11700 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
11710 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
11720 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
11730 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69   = pPrior->iLimi
11740 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  t;.      p->iOff
11750 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
11760 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
11770 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
11780 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
11790 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
117a0 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
117b0 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  iLimit);.       
117c0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
117d0 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20   "Jump ahead if 
117e0 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29  LIMIT reached"))
117f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11800 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
11810 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
11820 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
11830 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
11840 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
11850 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
11860 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
11870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
11880 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
11890 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
118a0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
118b0 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  r;.      p->nSel
118c0 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
118d0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
118e0 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
118f0 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26  pLimit.       &&
11900 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
11910 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
11920 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20  imit, &nLimit). 
11930 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e        && nLimit>
11940 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
11950 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74  ow > (u64)nLimit
11960 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
11970 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
11980 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = nLimit;.     
11990 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
119a0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
119b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
119c0 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
119d0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
119e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
119f0 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
11a00 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
11a10 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
11a20 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
11a30 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
11a40 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
11a50 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
11a60 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
11a70 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
11a80 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
11a90 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
11aa0 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
11ab0 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
11ac0 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
11ad0 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
11ae0 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
11af0 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
11b00 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
11b10 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
11b20 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
11b30 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
11b40 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
11b50 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
11b60 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
11b70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
11b80 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
11b90 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11ba0 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
11bb0 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
11bc0 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
11bd0 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
11be0 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
11bf0 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69  ALWAYS(!p->pLimi
11c00 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74 29  t &&!p->pOffset)
11c10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
11c20 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
11c30 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
11c40 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
11c50 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
11c60 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
11c70 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11c80 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
11c90 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20  tmost!=p );  /* 
11ca0 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  Can only happen 
11cb0 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c 65  for leftward ele
11cc0 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20  ments.          
11cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ce0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66             ** of
11cf0 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65   a 3-way or more
11d00 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20   compound */.   
11d10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
11d20 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
11d30 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
11d40 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
11d50 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
11d60 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
11d70 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
11d80 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
11d90 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
11da0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
11db0 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44  onTab = dest.iSD
11dc0 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
11dd0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
11de0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
11df0 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
11e00 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
11e10 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
11e20 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
11e30 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
11e40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
11e50 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
11e60 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
11e70 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
11e80 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
11e90 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
11ea0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11eb0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
11ec0 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
11ed0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
11ee0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
11ef0 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
11f00 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
11f10 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
11f20 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
11f30 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  st->selFlags |= 
11f40 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
11f50 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
11f60 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
11f70 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
11f80 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
11f90 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
11fa0 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
11fb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
11fc0 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
11fd0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
11fe0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
11ff0 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f  &uniondest, prio
12000 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a  rOp, unionTab);.
12010 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
12020 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
12030 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
12040 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
12050 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
12060 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
12070 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
12080 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
12090 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
120a0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
120b0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
120c0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
120d0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
120e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
120f0 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  f( p->op==TK_EXC
12100 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EPT ){.        o
12110 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a  p = SRT_Except;.
12120 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12130 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
12140 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
12150 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
12160 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a  _Union;.      }.
12170 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
12180 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
12190 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
121a0 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
121b0 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
121c0 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
121d0 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
121e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f   = 0;.      unio
121f0 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70  ndest.eDest = op
12200 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
12210 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
12220 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
12230 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
12240 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
12250 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e  t(pParse, p, &un
12260 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
12270 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
12280 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
12290 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
122a0 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
122b0 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
122c0 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
122d0 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
122e0 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
122f0 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
12300 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
12310 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
12320 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
12330 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
12340 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
12350 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
12360 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
12370 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
12380 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
12390 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
123a0 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
123b0 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  ION ) p->nSelect
123c0 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
123d0 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
123e0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
123f0 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
12400 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
12410 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
12420 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
12430 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
12440 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
12450 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
12460 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   0;..      /* Co
12470 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
12480 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
12490 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
124a0 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
124b0 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
124c0 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
124d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
124e0 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d  ssert( unionTab=
124f0 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c  =dest.iSDParm ||
12500 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
12510 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66  orOp );.      if
12520 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  ( dest.eDest!=pr
12530 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
12540 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
12550 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
12560 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12570 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
12580 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
12590 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
125a0 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
125b0 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
125c0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
125d0 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
125e0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
125f0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
12600 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
12610 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
12620 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
12630 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12640 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
12650 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
12660 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
12670 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
12680 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
12690 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
126a0 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
126b0 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
126c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
126d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
126e0 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
126f0 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  b, iBreak);.    
12700 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
12710 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
12720 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
12730 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
12740 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
12750 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a  List, unionTab,.
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
12780 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
12790 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
127a0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
127b0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
127c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
127d0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
127e0 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
127f0 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  iStart);.       
12800 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
12810 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
12820 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
12830 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12840 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
12850 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
12860 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
12870 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
12880 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
12890 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
128a0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
128b0 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
128c0 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
128d0 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
128e0 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
128f0 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
12900 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
12910 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
12920 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e  ctdest;.      in
12930 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t r1;..      /* 
12940 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
12950 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
12960 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
12970 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
12980 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
12990 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
129a0 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
129b0 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
129c0 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
129d0 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
129e0 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
129f0 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
12a00 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12a10 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
12a20 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
12a30 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
12a40 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20  OrderBy==0 );.. 
12a50 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
12a60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12a70 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
12a80 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  l, tab1, 0);.   
12a90 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
12aa0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
12ab0 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
12ac0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
12ad0 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
12ae0 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c  >pRightmost->sel
12af0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
12b00 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
12b10 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
12b20 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  st );..      /* 
12b30 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
12b40 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
12b50 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
12b60 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
12b70 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
12b80 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
12b90 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53  intersectdest, S
12ba0 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b  RT_Union, tab1);
12bb0 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
12bc0 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
12bd0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
12be0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
12bf0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
12c00 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
12c10 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
12c20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
12c30 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
12c40 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
12c50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
12c60 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
12c70 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
12c80 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
12c90 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
12ca0 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
12cb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12cc0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12cd0 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  al, tab2, 0);.  
12ce0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
12cf0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
12d00 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
12d10 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
12d20 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
12d30 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
12d40 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
12d50 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
12d60 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
12d70 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
12d80 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
12d90 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
12da0 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65       intersectde
12db0 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62  st.iSDParm = tab
12dc0 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  2;.      explain
12dd0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
12de0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
12df0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
12e00 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
12e10 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69  ct(pParse, p, &i
12e20 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
12e30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
12e40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
12e50 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
12e60 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
12e70 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
12e80 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ior;.      if( p
12e90 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72  ->nSelectRow>pPr
12ea0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
12eb0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
12ec0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
12ed0 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69  tRow;.      sqli
12ee0 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
12ef0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
12f00 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
12f10 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
12f20 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
12f30 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  et;..      /* Ge
12f40 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
12f50 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
12f60 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
12f70 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
12f80 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
12f90 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
12fa0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
12fb0 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
12fc0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
12fd0 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  ){.        Selec
12fe0 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
12ff0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
13000 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
13010 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
13020 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
13030 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
13040 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
13050 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
13060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42        }.      iB
13070 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
13080 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
13090 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
130a0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
130b0 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d  el(v);.      com
130c0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
130d0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
130e0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
130f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
13100 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
13110 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
13120 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
13130 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
13140 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
13150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13160 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  p2(v, OP_RowKey,
13170 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
13180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13190 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
131a0 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
131b0 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  nt, r1, 0);.    
131c0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
131d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
131e0 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  r1);.      selec
131f0 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
13200 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
13210 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20   tab1,.         
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
13230 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
13240 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
13250 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
13260 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
13270 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13280 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13290 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
132a0 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
132b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
132c0 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
132d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
132e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
132f0 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
13300 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13310 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
13320 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
13330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
13340 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43  .  }..  explainC
13350 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
13360 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
13370 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f  Sub2, p->op!=TK_
13380 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ALL);..  /* Comp
13390 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
133a0 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
133b0 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
133c0 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
133d0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
133e0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
133f0 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
13400 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
13410 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
13420 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ry tables..  **.
13430 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
13440 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
13450 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
13460 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
13470 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
13480 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
13490 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
134a0 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
134b0 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
134c0 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
134d0 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
134e0 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
134f0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
13500 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
13510 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
13520 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
13530 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
13540 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29  _UsesEphemeral )
13550 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
13560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13570 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
13580 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
13590 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
135a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
135b0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
135c0 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
135d0 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
135e0 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
135f0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
13600 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
13610 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
13620 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
13630 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
13640 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
13650 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
13660 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
13670 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
13680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13690 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
136a0 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
136b0 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
136c0 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
136d0 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43  ost==p );.    nC
136e0 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
136f0 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
13700 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
13710 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43  InfoAlloc(db, nC
13720 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ol, 1);.    if( 
13730 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
13740 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
13750 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
13760 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
13770 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  d;.    }.    for
13780 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
13790 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
137a0 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
137b0 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
137c0 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
137d0 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
137e0 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
137f0 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
13800 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
13810 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
13820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
13830 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
13840 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
13850 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
13860 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
13870 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13880 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
13890 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
138a0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
138b0 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
138c0 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
138d0 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
138e0 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
138f0 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
13900 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
13910 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
13920 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
13930 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
13940 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
13950 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
13960 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
13970 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
13980 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
13990 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
139a0 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
139b0 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
139c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
139d0 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
139e0 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  r, (char*)sqlite
139f0 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
13a00 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
13a30 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
13a40 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d  ddrOpenEphm[i] =
13a50 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
13a60 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65   }.    sqlite3Ke
13a70 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
13a80 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
13a90 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70  _select_end:.  p
13aa0 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65  Dest->iSdst = de
13ab0 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73  st.iSdst;.  pDes
13ac0 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e  t->nSdst = dest.
13ad0 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  nSdst;.  sqlite3
13ae0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
13af0 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74   pDelete);.  ret
13b00 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
13b10 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
13b20 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
13b30 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
13b40 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
13b50 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
13b60 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
13b70 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
13b80 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
13b90 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
13ba0 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
13bb0 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64  ined in pIn->iSd
13bc0 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  st.  There are.*
13bd0 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c  * pIn->nSdst col
13be0 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
13bf0 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
13c00 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
13c10 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
13c20 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
13c30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
13c40 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
13c50 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
13c60 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
13c70 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
13c80 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
13c90 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
13ca0 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
13cb0 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
13cc0 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
13cd0 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
13ce0 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
13cf0 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
13d00 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
13d10 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
13d20 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
13d30 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
13d40 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
13d50 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
13d60 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
13d70 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
13d80 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
13d90 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
13da0 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
13db0 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
13dc0 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
13dd0 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
13de0 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
13df0 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
13e00 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
13e10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
13e20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13e30 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
13e40 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
13e50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
13e60 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
13e70 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
13e80 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
13e90 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
13ea0 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
13eb0 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
13ec0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
13ed0 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
13ee0 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
13ef0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
13f00 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
13f10 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
13f20 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
13f30 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
13f40 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
13f50 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
13f60 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
13f70 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
13f80 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
13f90 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
13fa0 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
13fb0 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
13fc0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
13fd0 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
13fe0 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
13ff0 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
14000 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
14010 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
14020 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
14030 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
14040 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
14050 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
14060 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
14070 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
14080 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
14090 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
140a0 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
140b0 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
140c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20   ){.    int j1, 
140d0 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  j2;.    j1 = sql
140e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
140f0 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50  , OP_IfNot, regP
14100 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  rev);.    j2 = s
14110 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
14120 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
14130 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
14140 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
14150 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
14180 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
14190 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
141a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
141b0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
141c0 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
141d0 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20  nue, j2+2);.    
141e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
141f0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
14200 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14210 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49  3(v, OP_Copy, pI
14220 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
14230 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d  v+1, pIn->nSdst-
14240 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
14250 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14260 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
14270 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
14280 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
14290 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
142a0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
142b0 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46  ess the first OF
142c0 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
142d0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
142e0 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
142f0 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
14300 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74  ->iOffset, iCont
14310 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68  inue);..  switch
14320 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29  ( pDest->eDest )
14330 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74  {.    /* Store t
14340 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74  he result as dat
14350 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65  a using a unique
14360 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   key..    */.   
14370 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
14380 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
14390 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
143a0 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
143b0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
143c0 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32  e);.      int r2
143d0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
143e0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
143f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44      testcase( pD
14400 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
14410 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
14420 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e  estcase( pDest->
14430 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
14440 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  Tab );.      sql
14450 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14460 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
14470 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
14480 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20  ->nSdst, r1);.  
14490 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
144a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
144b0 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44  owid, pDest->iSD
144c0 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
144d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
144e0 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
144f0 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
14500 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20   r1, r2);.      
14510 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
14520 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
14530 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c  PEND);.      sql
14540 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
14550 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a  eg(pParse, r2);.
14560 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
14570 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
14580 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
14590 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
145a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
145b0 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a  _SUBQUERY.    /*
145c0 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74   If we are creat
145d0 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e  ing a set for an
145e0 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43   "expr IN (SELEC
145f0 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63  T ...)" construc
14600 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  t,.    ** then t
14610 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
14620 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20   single item on 
14630 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74  the stack.  Writ
14640 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74  e this.    ** it
14650 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20  em into the set 
14660 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73  table with bogus
14670 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20   data..    */.  
14680 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
14690 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a  {.      int r1;.
146a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
146b0 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20  n->nSdst==1 );. 
146c0 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
146d0 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20  dst = .         
146e0 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
146f0 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74  finity(p->pEList
14700 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
14710 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
14720 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
14730 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14740 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
14750 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14760 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
14770 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31  In->iSdst, 1, r1
14780 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73  , &pDest->affSds
14790 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t,1);.      sqli
147a0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
147b0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
147c0 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  e, pIn->iSdst, 1
147d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
147e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
147f0 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73  _IdxInsert, pDes
14800 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b  t->iSDParm, r1);
14810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
14820 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
14830 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
14840 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
14850 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63  f 0  /* Never oc
14860 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52  curs on an ORDER
14870 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20   BY query */.   
14880 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
14890 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
148a0 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
148b0 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
148c0 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
148d0 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
148e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
148f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14900 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73  Integer, 1, pDes
14910 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
14920 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
14930 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
14940 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
14950 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
14960 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
14970 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
14980 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
14990 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
149a0 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
149b0 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
149c0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
149d0 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
149e0 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
149f0 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
14a00 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
14a10 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
14a20 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
14a30 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
14a40 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
14a50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14a60 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61  ExprCodeMove(pPa
14a70 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
14a80 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
14a90 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
14aa0 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
14ab0 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20  ill jump out of 
14ac0 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20  the loop for us 
14ad0 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
14ae0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
14af0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14b00 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
14b10 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75  .    /* The resu
14b20 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  lts are stored i
14b30 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  n a sequence of 
14b40 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a  registers.    **
14b50 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65   starting at pDe
14b60 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e  st->iSdst.  Then
14b70 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
14b80 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  yields..    */. 
14b90 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f     case SRT_Coro
14ba0 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  utine: {.      i
14bb0 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
14bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
14bd0 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c  est->iSdst = sql
14be0 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
14bf0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53  (pParse, pIn->nS
14c00 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44  dst);.        pD
14c10 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e  est->nSdst = pIn
14c20 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d  ->nSdst;.      }
14c30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14c40 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
14c50 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
14c60 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44 65  Dest->iSdst, pDe
14c70 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20  st->nSdst);.    
14c80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14c90 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
14ca0 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
14cb0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14cc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
14cd0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76  none of the abov
14ce0 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  e, then the resu
14cf0 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d  lt destination m
14d00 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52  ust be.    ** SR
14d10 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20  T_Output.  This 
14d20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
14d30 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79   called with any
14d40 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65   other.    ** de
14d50 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20  stination other 
14d60 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61  than the ones ha
14d70 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53  ndled above or S
14d80 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a  RT_Output..    *
14d90 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54  *.    ** For SRT
14da0 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73  _Output, results
14db0 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61   are stored in a
14dc0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67   sequence of reg
14dd0 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a  isters.  .    **
14de0 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73   Then the OP_Res
14df0 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73  ultRow opcode is
14e00 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73   used to cause s
14e10 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f  qlite3_step() to
14e20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  .    ** return t
14e30 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72  he next row of r
14e40 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  esult..    */.  
14e50 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
14e60 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
14e70 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
14e80 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  put );.      sql
14e90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14ea0 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20  , OP_ResultRow, 
14eb0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
14ec0 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73  >nSdst);.      s
14ed0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
14ee0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
14ef0 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
14f00 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20  , pIn->nSdst);. 
14f10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14f20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70  }.  }..  /* Jump
14f30 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
14f40 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c  he loop if the L
14f50 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e  IMIT is reached.
14f60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
14f70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
14f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14f90 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
14fa0 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20  iLimit, iBreak, 
14fb0 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  -1);.  }..  /* G
14fc0 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72  enerate the subr
14fd0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20  outine return.  
14fe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
14ff0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
15000 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71  iContinue);.  sq
15010 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15020 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
15030 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74  gReturn);..  ret
15040 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
15050 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63  ** Alternative c
15060 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63  ompound select c
15070 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f  ode generator fo
15080 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65  r cases when the
15090 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45  re.** is an ORDE
150a0 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  R BY clause..**.
150b0 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71  ** We assume a q
150c0 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c  uery of the foll
150d0 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  owing form:.**.*
150e0 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e  *      <selectA>
150f0 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73    <operator>  <s
15100 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42  electB>  ORDER B
15110 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a  Y <orderbylist>.
15120 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e  **.** <operator>
15130 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e   is one of UNION
15140 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43   ALL, UNION, EXC
15150 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43  EPT, or INTERSEC
15160 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20  T.  The idea.** 
15170 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20  is to code both 
15180 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73  <selectA> and <s
15190 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65  electB> with the
151a0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
151b0 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e   as.** co-routin
151c0 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68  es.  Then run th
151d0 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e  e co-routines in
151e0 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65   parallel and me
151f0 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rge the results.
15200 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ** into the outp
15210 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  ut.  In addition
15220 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f   to the two coro
15230 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73  utines (called s
15240 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65  electA and.** se
15250 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65  lectB) there are
15260 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a   7 subroutines:.
15270 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20  **.**    outA:  
15280 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
15290 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41  t of the selectA
152a0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
152b0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
152c0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
152d0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
152e0 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20  .**.**    outB: 
152f0 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
15300 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
15310 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  B coroutine into
15320 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
15330 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
15340 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
15350 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74  .  (Only generat
15360 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64  ed for UNION and
15370 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
15380 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45  UNION ALL.  EXCE
15390 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43  PT and INSERTSEC
153a0 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61  T never output a
153b0 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20   row that.**    
153c0 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73           appears
153d0 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a   only in B.).**.
153e0 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43  **    AltB:    C
153f0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
15400 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
15410 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
15420 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A<B..**.**    
15430 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20  AeqB:    Called 
15440 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61  when there is da
15450 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72  ta from both cor
15460 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42  outines and A==B
15470 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a  ..**.**    AgtB:
15480 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
15490 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
154a0 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
154b0 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a  es and A>B..**.*
154c0 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61  *    EofA:    Ca
154d0 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69  lled when data i
154e0 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d  s exhausted from
154f0 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20   selectA..**.** 
15500 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c     EofB:    Call
15510 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20  ed when data is 
15520 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73  exhausted from s
15530 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68  electB..**.** Th
15540 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
15550 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66   of the latter f
15560 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ive subroutines 
15570 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20  depend on which 
15580 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69  .** <operator> i
15590 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a  s used:.**.**.**
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49               UNI
155b0 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55  ON ALL         U
155c0 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20  NION            
155d0 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20  EXCEPT          
155e0 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20  INTERSECT.**    
155f0 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d        ----------
15600 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---  -----------
15610 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
15620 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ------  --------
15630 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41  ---------.**   A
15640 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78  ltB:   outA, nex
15650 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65  tA      outA, ne
15660 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20  xtA       outA, 
15670 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65  nextA         ne
15680 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42  xtA.**.**   AeqB
15690 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
156a0 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20          nextA   
156b0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20            nextA 
156c0 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65          outA, ne
156d0 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42  xtA.**.**   AgtB
156e0 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20  :   outB, nextB 
156f0 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42       outB, nextB
15700 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20            nextB 
15710 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42             nextB
15720 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20  .**.**   EofA:  
15730 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
15740 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
15750 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20         halt     
15760 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
15770 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74  **   EofB:   out
15780 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75  A, nextA      ou
15790 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
157a0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
157b0 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49      halt.**.** I
157c0 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42  n the AltB, AeqB
157d0 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f  , and AgtB subro
157e0 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f  utines, an EOF o
157f0 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n A following ne
15800 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e  xtA.** causes an
15810 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
15820 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45  to EofA and an E
15830 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e  OF on B followin
15840 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a  g nextB causes.*
15850 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  * an immediate j
15860 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69  ump to EofB.  Wi
15870 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f  thin EofA and Eo
15880 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65  fB, and EOF on e
15890 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f  ntry or.** follo
158a0 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65  wing nextX cause
158b0 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20  s a jump to the 
158c0 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63  end of the selec
158d0 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  t processing..**
158e0 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65  .** Duplicate re
158f0 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49  moval in the UNI
15900 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
15910 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20  INTERSECT cases 
15920 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69  is handled.** wi
15930 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  thin the output 
15940 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  subroutine.  The
15950 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65   regPrev registe
15960 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20  r set holds the 
15970 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75  previously.** ou
15980 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63  tput value.  A c
15990 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64  omparison is mad
159a0 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76  e against this v
159b0 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74  alue and the out
159c0 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65  put.** is skippe
159d0 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65  d if the next re
159e0 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74  sults would be t
159f0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
15a00 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54  revious..**.** T
15a10 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
15a20 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70  n plan is to imp
15a30 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63  lement the two c
15a40 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65  oroutines and se
15a50 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e  ven.** subroutin
15a60 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70  es first, then p
15a70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c  ut the control l
15a80 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74  ogic at the bott
15a90 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a  om.  Like this:.
15aa0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67  **.**          g
15ab0 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20  oto Init.**     
15ac0 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coA: coroutine f
15ad0 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41  or left query (A
15ae0 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f  ).**     coB: co
15af0 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68  routine for righ
15b00 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20  t query (B).**  
15b10 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f    outA: output o
15b20 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20  ne row of A.**  
15b30 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f    outB: output o
15b40 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49  ne row of B (UNI
15b50 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c  ON and UNION ALL
15b60 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66   only).**    Eof
15b70 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66  A: ....**    Eof
15b80 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74  B: ....**    Alt
15b90 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71  B: ....**    Aeq
15ba0 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74  B: ....**    Agt
15bb0 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69  B: ....**    Ini
15bc0 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f  t: initialize co
15bd0 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
15be0 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69  s.**          yi
15bf0 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20  eld coA.**      
15c00 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f      if eof(A) go
15c10 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20  to EofA.**      
15c20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a      yield coB.**
15c30 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66            if eof
15c40 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a  (B) goto EofB.**
15c50 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72      Cmpr: Compar
15c60 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20  e A, B.**       
15c70 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65     Jump AltB, Ae
15c80 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20  qB, AgtB.**     
15c90 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57  End: ....**.** W
15ca0 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71  e call AltB, Aeq
15cb0 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61  B, AgtB, EofA, a
15cc0 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74  nd EofB "subrout
15cd0 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61  ines" but they a
15ce0 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c  re not.** actual
15cf0 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20  ly called using 
15d00 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64  Gosub and they d
15d10 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45  o not Return.  E
15d20 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f  ofA and EofB loo
15d30 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64  p.** until all d
15d40 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
15d50 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68   then jump to th
15d60 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41  e "end" labe.  A
15d70 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e  ltB, AeqB,.** an
15d80 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65  d AgtB jump to e
15d90 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f  ither L2 or to o
15da0 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f  ne of EofA or Eo
15db0 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  fB..*/.#ifndef S
15dc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
15dd0 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69  UND_SELECT.stati
15de0 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
15df0 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
15e00 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
15e10 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
15e20 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
15e30 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15e40 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
15e50 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
15e60 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
15e70 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
15e80 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
15e90 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
15ea0 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ults */.){.  int
15eb0 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
15ec0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
15ed0 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ers */.  Select 
15ee0 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
15ef0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
15f00 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
15f10 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
15f20 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
15f30 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
15f40 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
15f50 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
15f60 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20  t destA;     /* 
15f70 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20  Destination for 
15f80 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20  coroutine A */. 
15f90 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
15fa0 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e  B;     /* Destin
15fb0 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74  ation for corout
15fc0 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72  ine B */.  int r
15fd0 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20  egAddrA;        
15fe0 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
15ff0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
16000 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20  A coroutine */. 
16010 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20   int regAddrB;  
16020 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16030 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
16040 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
16050 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
16060 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20  electA;      /* 
16070 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
16080 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e  elect-A coroutin
16090 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  e */.  int addrS
160a0 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20  electB;      /* 
160b0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
160c0 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
160d0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75  e */.  int regOu
160e0 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tA;          /* 
160f0 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
16100 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d   for the output-
16110 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  A subroutine */.
16120 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20    int regOutB;  
16130 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
16140 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
16150 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62  the output-B sub
16160 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
16170 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20   addrOutA;      
16180 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
16190 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
161a0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
161b0 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20  t addrOutB = 0; 
161c0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
161d0 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73  f the output-B s
161e0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
161f0 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20  nt addrEofA;    
16200 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
16210 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d  of the select-A-
16220 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75  exhausted subrou
16230 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
16240 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20  drEofA_noB;     
16250 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64  /* Alternate add
16260 72 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e  rEofA if B is un
16270 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20  initialized */. 
16280 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20   int addrEofB;  
16290 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
162a0 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d  s of the select-
162b0 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72  B-exhausted subr
162c0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
162d0 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20  addrAltB;       
162e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
162f0 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69  the A<B subrouti
16300 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
16310 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AeqB;         /*
16320 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
16330 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  A==B subroutine 
16340 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74  */.  int addrAgt
16350 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
16360 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42  dress of the A>B
16370 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
16380 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20   int regLimitA; 
16390 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
163a0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
163b0 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
163c0 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20  egLimitB;       
163d0 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
163e0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
163f0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
16400 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
16410 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65  range of registe
16420 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69  rs to hold previ
16430 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ous output */.  
16440 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20  int savedLimit; 
16450 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
16460 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69  alue of p->iLimi
16470 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  t */.  int saved
16480 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20  Offset;      /* 
16490 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70  Saved value of p
164a0 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69  ->iOffset */.  i
164b0 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20  nt labelCmpr;   
164c0 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
164d0 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
164e0 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74  he merge algorit
164f0 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65  hm */.  int labe
16500 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  lEnd;         /*
16510 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65   Label for the e
16520 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c  nd of the overal
16530 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f  l SELECT stmt */
16540 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20  .  int j1;      
16550 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
16560 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68   instructions th
16570 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74  at get retargett
16580 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20  ed */.  int op; 
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
165a0 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20   One of TK_ALL, 
165b0 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
165c0 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43  EPT, TK_INTERSEC
165d0 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  T */.  KeyInfo *
165e0 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20  pKeyDup = 0; /* 
165f0 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72  Comparison infor
16600 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  mation for dupli
16610 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a  cate removal */.
16620 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d    KeyInfo *pKeyM
16630 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61  erge;   /* Compa
16640 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f  rison informatio
16650 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f  n for merging ro
16660 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ws */.  sqlite3 
16670 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
16680 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
16690 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  tion */.  ExprLi
166a0 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20  st *pOrderBy;   
166b0 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
166c0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
166d0 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
166e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
166f0 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45  erms in the ORDE
16700 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
16710 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20   int *aPermute; 
16720 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e         /* Mappin
16730 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20  g from ORDER BY 
16740 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20  terms to result 
16750 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23  set columns */.#
16760 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16770 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74  IT_EXPLAIN.  int
16780 20 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20   iSub1;         
16790 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20     /* EQP id of 
167a0 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20  left-hand query 
167b0 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20  */.  int iSub2; 
167c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51             /* EQ
167d0 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61  P id of right-ha
167e0 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64  nd query */.#end
167f0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  if..  assert( p-
16800 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a  >pOrderBy!=0 );.
16810 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75    assert( pKeyDu
16820 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61  p==0 ); /* "Mana
16830 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20  ged" code needs 
16840 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33  this.  Ticket #3
16850 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  382. */.  db = p
16860 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d  Parse->db;.  v =
16870 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
16880 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
16890 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61  ;       /* Alrea
168a0 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72  dy thrown the er
168b0 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f  ror if VDBE allo
168c0 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61  c failed */.  la
168d0 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33  belEnd = sqlite3
168e0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
168f0 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20  ;.  labelCmpr = 
16900 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
16910 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20  abel(v);...  /* 
16920 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44  Patch up the ORD
16930 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
16940 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20  /.  op = p->op; 
16950 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e   .  pPrior = p->
16960 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74  pPrior;.  assert
16970 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72  ( pPrior->pOrder
16980 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65  By==0 );.  pOrde
16990 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
169a0 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  y;.  assert( pOr
169b0 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65  derBy );.  nOrde
169c0 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  rBy = pOrderBy->
169d0 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72  nExpr;..  /* For
169e0 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72   operators other
169f0 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20   than UNION ALL 
16a00 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  we have to make 
16a10 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74  sure that.  ** t
16a20 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
16a30 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20  se covers every 
16a40 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75  term of the resu
16a50 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a  lt set.  Add.  *
16a60 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f  * terms to the O
16a70 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
16a80 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
16a90 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41  /.  if( op!=TK_A
16aa0 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  LL ){.    for(i=
16ab0 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  1; db->mallocFai
16ac0 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e  led==0 && i<=p->
16ad0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  pEList->nExpr; i
16ae0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
16af0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
16b00 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f  *pItem;.      fo
16b10 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(j=0, pItem=pOr
16b20 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64  derBy->a; j<nOrd
16b30 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d  erBy; j++, pItem
16b40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
16b50 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
16b60 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b  iOrderByCol>0 );
16b70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
16b80 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
16b90 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a  Col==i ) break;.
16ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16bb0 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b  ( j==nOrderBy ){
16bc0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
16bd0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
16be0 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
16bf0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
16c00 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
16c10 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
16c20 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
16c30 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
16c40 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
16c50 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b  w->u.iValue = i;
16c60 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42  .        pOrderB
16c70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
16c80 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
16c90 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77  , pOrderBy, pNew
16ca0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16cb0 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72  OrderBy ) pOrder
16cc0 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b  By->a[nOrderBy++
16cd0 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
16ce0 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20  l = (u16)i;.    
16cf0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
16d00 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
16d10 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75  comparison permu
16d20 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e  tation and keyin
16d30 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20  fo that is used 
16d40 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65  with.  ** the pe
16d50 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74  rmutation used t
16d60 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
16d70 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77  he next.  ** row
16d80 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65   of results come
16d90 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f  s from selectA o
16da0 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f  r selectB.  Also
16db0 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20   add explicit.  
16dc0 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f  ** collations to
16dd0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
16de0 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68  ause terms so th
16df0 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71  at when the subq
16e00 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74  ueries.  ** to t
16e10 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65  he right and the
16e20 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61   left are evalua
16e30 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68  ted, they use th
16e40 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63  e correct.  ** c
16e50 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  ollation..  */. 
16e60 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69   aPermute = sqli
16e70 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64  te3DbMallocRaw(d
16e80 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e  b, sizeof(int)*n
16e90 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20  OrderBy);.  if( 
16ea0 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20  aPermute ){.    
16eb0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
16ec0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
16ed0 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
16ee0 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e  pOrderBy->a; i<n
16ef0 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49  OrderBy; i++, pI
16f00 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  tem++){.      as
16f10 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
16f20 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 20  .iOrderByCol>0. 
16f30 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65           && pIte
16f40 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
16f50 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  ol<=p->pEList->n
16f60 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50  Expr );.      aP
16f70 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65  ermute[i] = pIte
16f80 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
16f90 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ol - 1;.    }.  
16fa0 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75    pKeyMerge = mu
16fb0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
16fc0 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
16fd0 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  p, 1);.  }else{.
16fe0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
16ff0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
17000 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
17010 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
17020 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
17030 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
17040 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
17050 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
17060 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
17070 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
17080 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41  rBy, 0);..  /* A
17090 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20  llocate a range 
170a0 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  of temporary reg
170b0 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b  isters and the K
170c0 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20  eyInfo needed.  
170d0 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63  ** for the logic
170e0 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75   that removes du
170f0 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72  plicate result r
17100 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ows when the.  *
17110 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  * operator is UN
17120 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
17130 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e  INTERSECT (but n
17140 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20  ot UNION ALL).. 
17150 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
17160 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50  _ALL ){.    regP
17170 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rev = 0;.  }else
17180 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  {.    int nExpr 
17190 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
171a0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
171b0 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20  nOrderBy>=nExpr 
171c0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
171d0 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72  led );.    regPr
171e0 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  ev = pParse->nMe
171f0 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  m+1;.    pParse-
17200 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31  >nMem += nExpr+1
17210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17220 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
17230 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65  teger, 0, regPre
17240 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20  v);.    pKeyDup 
17250 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
17260 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c  Alloc(db, nExpr,
17270 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65   1);.    if( pKe
17280 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73  yDup ){.      as
17290 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79  sert( sqlite3Key
172a0 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
172b0 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20  pKeyDup) );.    
172c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
172d0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
172e0 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c    pKeyDup->aColl
172f0 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  [i] = multiSelec
17300 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
17310 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20   p, i);.        
17320 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72  pKeyDup->aSortOr
17330 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  der[i] = 0;.    
17340 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a    }.    }.  }. .
17350 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68    /* Separate th
17360 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72  e left and the r
17370 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20  ight query from 
17380 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f  one another.  */
17390 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30  .  p->pPrior = 0
173a0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
173b0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
173c0 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72  Parse, p, p->pOr
173d0 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b  derBy, "ORDER");
173e0 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
173f0 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20  Prior==0 ){.    
17400 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
17410 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
17420 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f  e, pPrior, pPrio
17430 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  r->pOrderBy, "OR
17440 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  DER");.  }..  /*
17450 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d   Compute the lim
17460 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a  it registers */.
17470 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65    computeLimitRe
17480 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20  gisters(pParse, 
17490 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
174a0 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26  if( p->iLimit &&
174b0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
174c0 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b     regLimitA = +
174d0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
174e0 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b     regLimitB = +
174f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
17500 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17510 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c  dOp2(v, OP_Copy,
17520 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d   p->iOffset ? p-
17530 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e  >iOffset+1 : p->
17540 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20  iLimit,.        
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17560 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d            regLim
17570 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  itA);.    sqlite
17580 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17590 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74  P_Copy, regLimit
175a0 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20  A, regLimitB);. 
175b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c   }else{.    regL
175c0 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74  imitA = regLimit
175d0 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  B = 0;.  }.  sql
175e0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
175f0 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
17600 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
17610 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
17620 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73  ete(db, p->pOffs
17630 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65  et);.  p->pOffse
17640 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64  t = 0;..  regAdd
17650 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  rA = ++pParse->n
17660 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20  Mem;.  regAddrB 
17670 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
17680 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
17690 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
176a0 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
176b0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
176c0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
176d0 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
176e0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
176f0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
17700 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
17710 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
17720 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
17730 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68   /* Jump past th
17740 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75  e various subrou
17750 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74  tines and corout
17760 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e  ines to the main
17770 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70  .  ** merge loop
17780 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c  .  */.  j1 = sql
17790 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
177a0 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 0a 0a 20 20  , OP_Goto);...  
177b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f  /* Generate a co
177c0 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75  routine to evalu
177d0 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ate the SELECT s
177e0 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a  tatement to the.
177f0 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65    ** left of the
17800 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74   compound operat
17810 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c  or - the "A" sel
17820 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ect..  */.  Vdbe
17830 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
17840 22 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c  "coroutine for l
17850 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20  eft SELECT"));. 
17860 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
17870 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
17880 74 41 64 64 72 28 76 29 3b 0a 20 20 70 50 72 69  tAddr(v);.  pPri
17890 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67  or->iLimit = reg
178a0 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69  LimitA;.  explai
178b0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
178c0 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
178d0 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c  SelectId);.  sql
178e0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
178f0 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
17900 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
17910 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e  eAddOp1(v, OP_En
17920 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  dCoroutine, regA
17930 64 64 72 41 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  ddrA);..  /* Gen
17940 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
17950 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
17960 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
17970 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
17980 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
17990 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 56 64  select.  */.  Vd
179a0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
179b0 2c 20 22 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72  , "coroutine for
179c0 20 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29   right SELECT"))
179d0 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 42 20  ;.  addrSelectB 
179e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
179f0 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 73  rentAddr(v);.  s
17a00 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69  avedLimit = p->i
17a10 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66  Limit;.  savedOf
17a20 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65  fset = p->iOffse
17a30 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  t;.  p->iLimit =
17a40 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d   regLimitB;.  p-
17a50 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a  >iOffset = 0;  .
17a60 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
17a70 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73  ger(iSub2, pPars
17a80 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
17a90 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
17aa0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
17ab0 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d  estB);.  p->iLim
17ac0 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b  it = savedLimit;
17ad0 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20  .  p->iOffset = 
17ae0 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73  savedOffset;.  s
17af0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
17b00 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74  (v, OP_EndCorout
17b10 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a  ine, regAddrB);.
17b20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
17b30 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
17b40 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
17b50 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
17b60 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  A.  ** select as
17b70 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
17b80 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
17b90 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
17ba0 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
17bb0 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74 20  ent((v, "Output 
17bc0 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29 29  routine for A"))
17bd0 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20 67  ;.  addrOutA = g
17be0 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
17bf0 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a  routine(pParse,.
17c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c10 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65 73   p, &destA, pDes
17c20 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20 20  t, regOutA,.    
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
17c40 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c  Prev, pKeyDup, l
17c50 61 62 65 6c 45 6e 64 29 3b 0a 20 20 0a 20 20 2f  abelEnd);.  .  /
17c60 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
17c70 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74  routine that out
17c80 70 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74  puts the current
17c90 20 72 6f 77 20 6f 66 20 74 68 65 20 42 0a 20 20   row of the B.  
17ca0 2a 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65  ** select as the
17cb0 20 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77   next output row
17cc0 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
17cd0 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   select..  */.  
17ce0 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c  if( op==TK_ALL |
17cf0 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29  | op==TK_UNION )
17d00 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
17d10 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75  mment((v, "Outpu
17d20 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 42 22  t routine for B"
17d30 29 29 3b 0a 20 20 20 20 61 64 64 72 4f 75 74 42  ));.    addrOutB
17d40 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
17d50 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
17d60 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
17d70 20 20 20 20 20 70 2c 20 26 64 65 73 74 42 2c 20       p, &destB, 
17d80 70 44 65 73 74 2c 20 72 65 67 4f 75 74 42 2c 0a  pDest, regOutB,.
17d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17da0 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
17db0 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
17dc0 7d 0a 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  }.  sqlite3KeyIn
17dd0 66 6f 55 6e 72 65 66 28 70 4b 65 79 44 75 70 29  foUnref(pKeyDup)
17de0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
17df0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f   a subroutine to
17e00 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65   run when the re
17e10 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63  sults from selec
17e20 74 20 41 0a 20 20 2a 2a 20 61 72 65 20 65 78 68  t A.  ** are exh
17e30 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20  austed and only 
17e40 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 42  data in select B
17e50 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20   remains..  */. 
17e60 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
17e70 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
17e80 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
17e90 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20 61 64 64  drEofA_noB = add
17ea0 72 45 6f 66 41 20 3d 20 6c 61 62 65 6c 45 6e 64  rEofA = labelEnd
17eb0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
17ec0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
17ed0 28 28 76 2c 20 22 65 6f 66 2d 41 20 73 75 62 72  ((v, "eof-A subr
17ee0 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
17ef0 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65  ddrEofA = sqlite
17f00 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17f10 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
17f20 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
17f30 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42 20 3d 20   addrEofA_noB = 
17f40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17f50 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
17f60 65 67 41 64 64 72 42 2c 20 6c 61 62 65 6c 45 6e  egAddrB, labelEn
17f70 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  d);.    sqlite3V
17f80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17f90 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
17fa0 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
17fb0 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
17fc0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
17fd0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17fe0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
17ff0 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
18000 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
18010 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
18020 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
18030 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
18040 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
18050 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
18060 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
18070 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
18080 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
18090 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
180a0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
180b0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
180c0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
180d0 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
180e0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
180f0 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
18100 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
18110 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
18120 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
18130 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41  P_Gosub, regOutA
18140 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20  , addrOutA);.   
18150 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18160 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
18170 72 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45  regAddrA, labelE
18180 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nd);.    sqlite3
18190 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
181a0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f  _Goto, 0, addrEo
181b0 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  fB);.  }..  /* G
181c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
181d0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
181e0 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64  of A<B.  */.  Vd
181f0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
18200 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75  , "A-lt-B subrou
18210 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
18220 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ltB = sqlite3Vdb
18230 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
18240 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
18250 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74  drOutA);.  sqlit
18260 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18270 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
18280 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20  rA, addrEofA);. 
18290 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
182a0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
182b0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
182c0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
182d0 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
182e0 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20 2a  case of A==B.  *
182f0 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
18300 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65  LL ){.    addrAe
18310 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20  qB = addrAltB;. 
18320 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54   }else if( op==T
18330 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
18340 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
18350 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64 72  drAltB;.    addr
18360 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  AltB++;.  }else{
18370 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
18380 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d 42  ment((v, "A-eq-B
18390 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a   subroutine"));.
183a0 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a 20      addrAeqB =. 
183b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
183c0 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
183d0 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
183e0 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  EofA);.    sqlit
183f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18400 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
18410 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
18420 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
18430 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
18440 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
18450 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
18460 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
18470 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
18480 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
18490 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
184a0 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
184b0 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
184c0 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
184d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
184e0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
184f0 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
18500 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
18510 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65  AddOp2(v, OP_Yie
18520 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ld, regAddrB, ad
18530 64 72 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74  drEofB);.  sqlit
18540 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18550 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
18560 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 54 68  lCmpr);..  /* Th
18570 69 73 20 63 6f 64 65 20 72 75 6e 73 20 6f 6e 63  is code runs onc
18580 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  e to initialize 
18590 65 76 65 72 79 74 68 69 6e 67 2e 0a 20 20 2a 2f  everything..  */
185a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
185b0 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
185c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
185d0 70 32 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72  p2(v, OP_InitCor
185e0 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 41  outine, regAddrA
185f0 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a  , addrSelectA);.
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 69 74 43 6f  Op2(v, OP_InitCo
18620 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
18630 42 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b  B, addrSelectB);
18640 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
18650 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp2(v, OP_Yield
18660 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64 72  , regAddrA, addr
18670 45 6f 66 41 5f 6e 6f 42 29 3b 0a 20 20 73 71 6c  EofA_noB);.  sql
18680 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18690 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
186a0 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  ddrB, addrEofB);
186b0 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74  ..  /* Implement
186c0 20 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20   the main merge 
186d0 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
186e0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
186f0 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72  bel(v, labelCmpr
18700 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
18710 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72  AddOp4(v, OP_Per
18720 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  mutation, 0, 0, 
18730 30 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75  0, (char*)aPermu
18740 74 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29  te, P4_INTARRAY)
18750 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18760 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
18770 61 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74  are, destA.iSdst
18780 2c 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e  , destB.iSdst, n
18790 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20  OrderBy,.       
187a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187b0 20 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72    (char*)pKeyMer
187c0 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  ge, P4_KEYINFO);
187d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
187e0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
187f0 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c  _PERMUTE);.  sql
18800 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
18810 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41  , OP_Jump, addrA
18820 6c 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61  ltB, addrAeqB, a
18830 64 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20  ddrAgtB);..  /* 
18840 4a 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73  Jump to the this
18850 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20   point in order 
18860 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
18870 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73   query..  */.  s
18880 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18890 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45  eLabel(v, labelE
188a0 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74  nd);..  /* Set t
188b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  he number of out
188c0 70 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  put columns.  */
188d0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
188e0 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
188f0 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  ){.    Select *p
18900 46 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a  First = pPrior;.
18910 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
18920 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
18930 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
18940 69 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  ior;.    generat
18950 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
18960 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e  rse, 0, pFirst->
18970 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
18980 2f 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68  /* Reassembly th
18990 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
189a0 20 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c   so that it will
189b0 20 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63   be freed correc
189c0 74 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  tly.  ** by the 
189d0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
189e0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   */.  if( p->pPr
189f0 69 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ior ){.    sqlit
18a00 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
18a10 62 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  b, p->pPrior);. 
18a20 20 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d   }.  p->pPrior =
18a30 20 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a   pPrior;..  /***
18a40 20 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75   TBD:  Insert su
18a50 62 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74  broutine calls t
18a60 6f 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20  o close cursors 
18a70 6f 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20  on incomplete.  
18a80 2a 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  **** subqueries 
18a90 2a 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43  ****/.  explainC
18aa0 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
18ab0 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
18ac0 53 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75  Sub2, 0);.  retu
18ad0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18ae0 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
18af0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
18b00 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
18b10 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
18b20 49 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77  IT_VIEW)./* Forw
18b30 61 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73  ard Declarations
18b40 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
18b50 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71  substExprList(sq
18b60 6c 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74  lite3*, ExprList
18b70 2a 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74  *, int, ExprList
18b80 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
18b90 73 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69  substSelect(sqli
18ba0 74 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20  te3*, Select *, 
18bb0 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29  int, ExprList *)
18bc0 3b 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  ;../*.** Scan th
18bd0 72 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73  rough the expres
18be0 73 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70  sion pExpr.  Rep
18bf0 6c 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72  lace every refer
18c00 65 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c  ence to.** a col
18c10 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d  umn in table num
18c20 62 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20  ber iTable with 
18c30 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
18c40 6f 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72  olumn-th.** entr
18c50 79 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42  y in pEList.  (B
18c60 75 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e  ut leave referen
18c70 63 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44  ces to the ROWID
18c80 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68   column .** unch
18c90 61 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  anged.).**.** Th
18ca0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61  is routine is pa
18cb0 72 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65  rt of the flatte
18cc0 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20  ning procedure. 
18cd0 20 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77   A subquery.** w
18ce0 68 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20  hose result set 
18cf0 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45  is defined by pE
18d00 4c 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20  List appears as 
18d10 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20  entry in the.** 
18d20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
18d30 20 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61   SELECT such tha
18d40 74 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  t the VDBE curso
18d50 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  r assigned to th
18d60 61 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73  at.** FORM claus
18d70 65 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c  e entry is iTabl
18d80 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
18d90 20 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73   make the necess
18da0 61 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  ary .** changes 
18db0 74 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74  to pExpr so that
18dc0 20 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63   it refers direc
18dd0 74 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63  tly to the sourc
18de0 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68  e table.** of th
18df0 65 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65  e subquery rathe
18e00 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
18e10 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
18e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72  ..*/.static Expr
18e30 20 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 73   *substExpr(.  s
18e40 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
18e50 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
18e60 6c 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68  loc errors to th
18e70 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  is connection */
18e80 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
18e90 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69         /* Expr i
18ea0 6e 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75  n which substitu
18eb0 74 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20  tion occurs */. 
18ec0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
18ed0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
18ee0 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
18ef0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
18f00 45 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73  EList    /* Subs
18f10 74 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f  titute expressio
18f20 6e 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  ns */.){.  if( p
18f30 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
18f40 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d   0;.  if( pExpr-
18f50 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
18f60 26 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  & pExpr->iTable=
18f70 3d 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  =iTable ){.    i
18f80 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
18f90 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  n<0 ){.      pEx
18fa0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
18fb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18fc0 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20     Expr *pNew;. 
18fd0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
18fe0 69 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d  ist!=0 && pExpr-
18ff0 3e 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d  >iColumn<pEList-
19000 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
19010 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
19020 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
19030 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
19040 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
19050 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
19060 45 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e  EList->a[pExpr->
19070 69 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20  iColumn].pExpr, 
19080 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
19090 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
190a0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 45  pExpr);.      pE
190b0 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  xpr = pNew;.    
190c0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
190d0 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75  Expr->pLeft = su
190e0 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70  bstExpr(db, pExp
190f0 72 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65  r->pLeft, iTable
19100 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70  , pEList);.    p
19110 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73  Expr->pRight = s
19120 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78  ubstExpr(db, pEx
19130 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62  pr->pRight, iTab
19140 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
19150 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
19160 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
19170 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
19180 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
19190 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  b, pExpr->x.pSel
191a0 65 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ect, iTable, pEL
191b0 69 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ist);.    }else{
191c0 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
191d0 4c 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e  List(db, pExpr->
191e0 78 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c  x.pList, iTable,
191f0 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a   pEList);.    }.
19200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78    }.  return pEx
19210 70 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  pr;.}.static voi
19220 64 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28  d substExprList(
19230 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
19240 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
19250 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
19260 68 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  here */.  ExprLi
19270 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
19280 2a 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61  * List to scan a
19290 6e 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nd in which to m
192a0 61 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20  ake substitutes 
192b0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
192c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
192d0 6c 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74  le to be substit
192e0 75 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uted */.  ExprLi
192f0 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f  st *pEList     /
19300 2a 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c  * Substitute val
19310 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ues */.){.  int 
19320 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
19330 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
19340 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
19350 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
19360 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
19370 70 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  pr = substExpr(d
19380 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  b, pList->a[i].p
19390 45 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  Expr, iTable, pE
193a0 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  List);.  }.}.sta
193b0 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
193c0 6c 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20  lect(.  sqlite3 
193d0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *db,         /* 
193e0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
193f0 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  rors here */.  S
19400 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
19410 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74      /* SELECT st
19420 61 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68  atement in which
19430 20 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74   to make substit
19440 75 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  utions */.  int 
19450 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
19460 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
19470 72 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78  replaced */.  Ex
19480 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
19490 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
194a0 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
194b0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20  SrcList *pSrc;. 
194c0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
194d0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
194e0 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29  nt i;.  if( !p )
194f0 20 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74   return;.  subst
19500 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
19510 70 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  pEList, iTable, 
19520 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
19530 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
19540 70 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65  pGroupBy, iTable
19550 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62  , pEList);.  sub
19560 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70  stExprList(db, p
19570 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62  ->pOrderBy, iTab
19580 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70  le, pEList);.  p
19590 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
195a0 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61  tExpr(db, p->pHa
195b0 76 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45  ving, iTable, pE
195c0 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65  List);.  p->pWhe
195d0 72 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  re = substExpr(d
195e0 62 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54  b, p->pWhere, iT
195f0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
19600 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
19610 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62   p->pPrior, iTab
19620 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70  le, pEList);.  p
19630 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  Src = p->pSrc;. 
19640 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
19650 20 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28 53    /* Even for (S
19660 45 4c 45 43 54 20 31 29 20 77 65 20 68 61 76 65  ELECT 1) we have
19670 3a 20 70 53 72 63 21 3d 30 20 62 75 74 20 70 53  : pSrc!=0 but pS
19680 72 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20  rc->nSrc==0 */. 
19690 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63   if( ALWAYS(pSrc
196a0 29 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70  ) ){.    for(i=p
196b0 53 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d  Src->nSrc, pItem
196c0 3d 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69  =pSrc->a; i>0; i
196d0 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
196e0 20 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28      substSelect(
196f0 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  db, pItem->pSele
19700 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ct, iTable, pELi
19710 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  st);.    }.  }.}
19720 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
19730 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
19740 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
19750 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
19760 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20  T_VIEW) */..#if 
19770 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
19780 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c  OMIT_SUBQUERY) |
19790 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
197a0 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a  E_OMIT_VIEW)./*.
197b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
197c0 61 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74  attempts to flat
197d0 74 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61  ten subqueries a
197e0 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  s a performance 
197f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a  optimization..**
19800 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
19810 74 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61  turns 1 if it ma
19820 6b 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20  kes changes and 
19830 30 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69  0 if no flatteni
19840 6e 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ng occurs..**.**
19850 20 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74   To understand t
19860 68 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c  he concept of fl
19870 61 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64  attening, consid
19880 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  er the following
19890 0a 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a  .** query:.**.**
198a0 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
198b0 4f 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41  OM (SELECT x+y A
198c0 53 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52  S a FROM t1 WHER
198d0 45 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61  E z<100) WHERE a
198e0 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66  >5.**.** The def
198f0 61 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c  ault way of impl
19900 65 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75  ementing this qu
19910 65 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74  ery is to execut
19920 65 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72  e the.** subquer
19930 79 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72  y first and stor
19940 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
19950 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
19960 6c 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20  le, then.** run 
19970 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
19980 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
19990 79 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72  y table.  This r
199a0 65 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70  equires two.** p
199b0 61 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64  asses over the d
199c0 61 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72  ata.  Furthermor
199d0 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74  e, because the t
199e0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a  emporary table.*
199f0 2a 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73  * has no indices
19a00 2c 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  , the WHERE clau
19a10 73 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20  se on the outer 
19a20 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a  query cannot be.
19a30 2a 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a  ** optimized..**
19a40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19a50 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77   attempts to rew
19a60 72 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63  rite queries suc
19a70 68 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69  h as the above i
19a80 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  nto.** a single 
19a90 66 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b  flat select, lik
19aa0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
19ab0 20 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20    SELECT x+y AS 
19ac0 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
19ad0 7a 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a  z<100 AND a>5.**
19ae0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
19af0 65 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  erated for this 
19b00 73 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69  simpification gi
19b10 76 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73  ves the same res
19b20 75 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20  ult.** but only 
19b30 68 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20  has to scan the 
19b40 64 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20  data once.  And 
19b50 62 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20  because indices 
19b60 6d 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20  might .** exist 
19b70 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c  on the table t1,
19b80 20 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e   a complete scan
19b90 20 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67   of the data mig
19ba0 68 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64  ht be.** avoided
19bb0 2e 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69  ..**.** Flatteni
19bc0 6e 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d  ng is only attem
19bd0 70 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74  pted if all of t
19be0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
19bf0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28   true:.**.**   (
19c00 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
19c10 20 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71   and the outer q
19c20 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68  uery do not both
19c30 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e   use aggregates.
19c40 0a 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68  .**.**   (2)  Th
19c50 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
19c60 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
19c70 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
19c80 79 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e  y is not a join.
19c90 0a 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68  .**.**   (3)  Th
19ca0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
19cb0 74 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  t the right oper
19cc0 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
19cd0 74 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20  ter join.**     
19ce0 20 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74     (Originally t
19cf0 69 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72  icket #306.  Str
19d00 65 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63  engthened by tic
19d10 6b 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a  ket #3300).**.**
19d20 20 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71     (4)  The subq
19d30 75 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54  uery is not DIST
19d40 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a  INCT..**.**  (**
19d50 29 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  )  At one point 
19d60 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29  restrictions (4)
19d70 20 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64   and (5) defined
19d80 20 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53   a subset of DIS
19d90 54 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  TINCT.**        
19da0 73 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74  sub-queries that
19db0 20 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66   were excluded f
19dc0 72 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a  rom this optimiz
19dd0 61 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69  ation. Restricti
19de0 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34  on .**        (4
19df0 29 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e  ) has since been
19e00 20 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63   expanded to exc
19e10 6c 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43  lude all DISTINC
19e20 54 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  T subqueries..**
19e30 0a 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73  .**   (6)  The s
19e40 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
19e50 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20   use aggregates 
19e60 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
19e70 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
19e80 20 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a      DISTINCT..**
19e90 0a 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73  .**   (7)  The s
19ea0 75 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52  ubquery has a FR
19eb0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f  OM clause.  TODO
19ec0 3a 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65  :  For subquerie
19ed0 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20  s without.**    
19ee0 20 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73      A FROM claus
19ef0 65 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69  e, consider addi
19f00 6e 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20  ng a FROM close 
19f10 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c  with the special
19f20 0a 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65  .**        table
19f30 20 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61   sqlite_once tha
19f40 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  t consists of a 
19f50 73 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61  single row conta
19f60 69 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20  ining a.**      
19f70 20 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a    single NULL..*
19f80 2a 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20  *.**   (8)  The 
19f90 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
19fa0 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
19fb0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69  he outer query i
19fc0 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a  s not a join..**
19fd0 0a 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73  .**   (9)  The s
19fe0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
19ff0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
1a000 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1a010 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20  es not use.**   
1a020 20 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e       aggregates.
1a030 0a 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68  .**.**  (10)  Th
1a040 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1a050 6e 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74  not use aggregat
1a060 65 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  es or the outer 
1a070 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
1a080 2a 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d  *        use LIM
1a090 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20  IT..**.**  (11) 
1a0a0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e   The subquery an
1a0b0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1a0c0 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61  y do not both ha
1a0d0 76 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  ve ORDER BY clau
1a0e0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  ses..**.**  (**)
1a0f0 20 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65    Not implemente
1a100 64 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74  d.  Subsumed int
1a110 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33  o restriction (3
1a120 29 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73  ).  Was previous
1a130 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73  ly.**        a s
1a140 65 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74  eparate restrict
1a150 69 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f  ion deriving fro
1a160 6d 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a  m ticket #350..*
1a170 2a 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20  *.**  (13)  The 
1a180 73 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74  subquery and out
1a190 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20  er query do not 
1a1a0 62 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a  both use LIMIT..
1a1b0 2a 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65  **.**  (14)  The
1a1c0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
1a1d0 6f 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a  ot use OFFSET..*
1a1e0 2a 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20  *.**  (15)  The 
1a1f0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1a200 6f 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d  ot part of a com
1a210 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20  pound select or 
1a220 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  the.**        su
1a230 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1a240 68 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61  have a LIMIT cla
1a250 75 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28  use..**        (
1a260 53 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39  See ticket #2339
1a270 20 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61   and ticket [02a
1a280 38 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a  8e81d44])..**.**
1a290 20 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65    (16)  The oute
1a2a0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1a2b0 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74  n aggregate or t
1a2c0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1a2d0 0a 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63  .**        not c
1a2e0 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e  ontain ORDER BY.
1a2f0 20 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29    (Ticket #2942)
1a300 20 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e    This used to n
1a310 6f 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20  ot matter.**    
1a320 20 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74      until we int
1a330 72 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75  roduced the grou
1a340 70 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74  p_concat() funct
1a350 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31  ion.  .**.**  (1
1a360 37 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72  7)  The sub-quer
1a370 79 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f  y is not a compo
1a380 75 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69  und select, or i
1a390 74 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t is a UNION ALL
1a3a0 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70   .**        comp
1a3b0 6f 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65  ound clause made
1a3c0 20 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20   up entirely of 
1a3d0 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75  non-aggregate qu
1a3e0 65 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20  eries, and .**  
1a3f0 20 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74        the parent
1a400 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20   query:.**.**   
1a410 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1a420 69 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61  itself part of a
1a430 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1a440 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20  ,.**          * 
1a450 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
1a460 61 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20  ate or DISTINCT 
1a470 71 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20  query, and.**   
1a480 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1a490 61 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  a join.**.**    
1a4a0 20 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61      The parent a
1a4b0 6e 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79  nd sub-query may
1a4c0 20 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63   contain WHERE c
1a4d0 6c 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20  lauses. Subject 
1a4e0 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c  to.**        rul
1a4f0 65 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e  es (11), (13) an
1a500 64 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79  d (14), they may
1a510 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52   also contain OR
1a520 44 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20  DER BY,.**      
1a530 20 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53    LIMIT and OFFS
1a540 45 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65  ET clauses.  The
1a550 20 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74   subquery cannot
1a560 20 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   use any compoun
1a570 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1a580 61 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20  ator other than 
1a590 55 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73  UNION ALL becaus
1a5a0 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
1a5b0 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20  compound.**     
1a5c0 20 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76     operators hav
1a5d0 65 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53  e an implied DIS
1a5e0 54 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64  TINCT which is d
1a5f0 69 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20  isallowed by.** 
1a600 20 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69         restricti
1a610 6f 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  on (4)..**.**   
1a620 20 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20       Also, each 
1a630 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65  component of the
1a640 20 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20   sub-query must 
1a650 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
1a660 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20  number.**       
1a670 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
1a680 6e 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75  ns. This is actu
1a690 61 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65  ally a requireme
1a6a0 6e 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f  nt for any compo
1a6b0 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45  und.**        SE
1a6c0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
1a6d0 62 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65  but all the code
1a6e0 20 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61   here does is ma
1a6f0 6b 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a  ke sure that no.
1a700 2a 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28  **        such (
1a710 69 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65  illegal) sub-que
1a720 72 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e  ry is flattened.
1a730 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
1a740 20 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20   detect the.**  
1a750 20 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72        syntax err
1a760 6f 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  or and return a 
1a770 64 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65  detailed message
1a780 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49  ..**.**  (18)  I
1a790 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
1a7a0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
1a7b0 6c 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74  lect, then all t
1a7c0 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20  erms of the.**  
1a7d0 20 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63        ORDER by c
1a7e0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72  lause of the par
1a7f0 65 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70  ent must be simp
1a800 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
1a810 20 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75   .**        colu
1a820 6d 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71  mns of the sub-q
1a830 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39  uery..**.**  (19
1a840 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
1a850 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
1a860 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
1a870 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a  query does not.*
1a880 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20  *        have a 
1a890 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a  WHERE clause..**
1a8a0 0a 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68  .**  (20)  If th
1a8b0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61  e sub-query is a
1a8c0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
1a8d0 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e  , then it must n
1a8e0 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20  ot use.**       
1a8f0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
1a900 75 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37  use.  Ticket #37
1a910 37 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65  73.  We could re
1a920 6c 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61  lax this constra
1a930 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f  int.**        so
1a940 6d 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67  mewhat by saying
1a950 20 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20   that the terms 
1a960 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
1a970 63 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20  clause must.**  
1a980 20 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20        appear as 
1a990 75 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c  unmodified resul
1a9a0 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
1a9b0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1a9c0 75 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20  ut we.**        
1a9d0 68 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d  have other optim
1a9e0 69 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64  izations in mind
1a9f0 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68   to deal with th
1aa00 61 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  at case..**.**  
1aa10 28 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65  (21)  The subque
1aa20 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1aa30 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
1aa40 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a  er query is not.
1aa50 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e  **        DISTIN
1aa60 43 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74  CT.  (See ticket
1aa70 20 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a   [752e1646fc])..
1aa80 2a 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65  **.**  (22)  The
1aa90 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
1aaa0 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
1aab0 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54  ..**.**  (23)  T
1aac0 68 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74  he parent is not
1aad0 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45   a recursive CTE
1aae0 2c 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65  , or the sub-que
1aaf0 72 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20  ry is not a.**  
1ab00 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71        compound q
1ab10 75 65 72 79 2e 20 54 68 69 73 20 72 65 73 74 72  uery. This restr
1ab20 69 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73  iction is becaus
1ab30 65 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  e transforming t
1ab40 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72  he.**        par
1ab50 65 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e  ent to a compoun
1ab60 64 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73  d query confuses
1ab70 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68   the code that h
1ab80 61 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20  andles.**       
1ab90 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
1aba0 65 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63  es in multiSelec
1abb0 74 28 29 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e  t()..**.**.** In
1abc0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
1abd0 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
1abe0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1abf0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1ac00 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
1ac10 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
1ac20 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
1ac30 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
1ac40 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
1ac50 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
1ac60 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
1ac70 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
1ac80 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
1ac90 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
1aca0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
1acb0 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
1acc0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1acd0 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
1ace0 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
1acf0 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
1ad00 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
1ad10 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
1ad20 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
1ad30 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
1ad40 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
1ad50 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
1ad60 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
1ad70 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
1ad80 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
1ad90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1ada0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
1adb0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1adc0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1add0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1ade0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
1adf0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
1ae00 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
1ae10 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
1ae20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
1ae30 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1ae40 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
1ae50 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
1ae60 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
1ae70 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
1ae80 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
1ae90 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
1aea0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
1aeb0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
1aec0 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
1aed0 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
1aee0 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
1aef0 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
1af00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1af10 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
1af20 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
1af30 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63  Context;.  Selec
1af40 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65  t *pParent;.  Se
1af50 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
1af60 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
1af70 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
1af80 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  y" */.  Select *
1af90 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50  pSub1;      /* P
1afa0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69  ointer to the ri
1afb0 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69  ghtmost select i
1afc0 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  n sub-query */. 
1afd0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
1afe0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
1aff0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
1b000 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
1b010 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
1b020 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
1b030 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1b040 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
1b050 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
1b060 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
1b070 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
1b080 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
1b090 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
1b0a0 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1b0b0 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
1b0c0 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
1b0d0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1b0e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1b0f0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
1b100 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
1b110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b120 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1b130 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
1b140 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1b150 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
1b160 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
1b170 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1b180 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
1b190 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
1b1a0 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
1b1b0 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
1b1c0 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
1b1d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21   */.  assert( p!
1b1e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b1f0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20  p->pPrior==0 ); 
1b200 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c   /* Unable to fl
1b210 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71  atten compound q
1b220 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20  ueries */.  if( 
1b230 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
1b240 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
1b250 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20  QueryFlattener) 
1b260 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
1b270 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
1b280 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20  assert( pSrc && 
1b290 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f  iFrom>=0 && iFro
1b2a0 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  m<pSrc->nSrc );.
1b2b0 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53    pSubitem = &pS
1b2c0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20  rc->a[iFrom];.  
1b2d0 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74  iParent = pSubit
1b2e0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
1b2f0 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Sub = pSubitem->
1b300 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
1b310 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
1b320 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
1b330 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
1b340 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1b350 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1b360 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20  ction (1)  */.  
1b370 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
1b380 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e  g && pSrc->nSrc>
1b390 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
1b3a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1b3b0 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20  ction (2)  */.  
1b3c0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
1b3d0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
1b3e0 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
1b3f0 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
1b400 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
1b410 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
1b420 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
1b430 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
1b440 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
1b450 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c  resssions, we al
1b460 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69  lowed some combi
1b470 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e  ning of LIMIT an
1b480 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
1b490 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64  cause they could
1b4a0 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20   be computed at 
1b4b0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42  compile-time.  B
1b4c0 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  ut when LIMIT an
1b4d0 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
1b4e0 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65  came arbitrary e
1b4f0 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77  xpressions, we w
1b500 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64  ere forced to ad
1b510 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  d restrictions (
1b520 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34  13).  ** and (14
1b530 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ). */.  if( pSub
1b540 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
1b550 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
1b560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1b570 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1b580 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  3) */.  if( pSub
1b590 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75  ->pOffset ) retu
1b5a0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b5c0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
1b5d0 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  4) */.  if( p->p
1b5e0 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75  Rightmost && pSu
1b5f0 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
1b600 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b630 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1b640 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
1b650 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
1b660 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
1b670 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1b680 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1b690 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
1b6a0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1b6b0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
1b6c0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
1b6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1b6e0 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f  triction (5)  */
1b6f0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1b700 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
1b710 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
1b720 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
1b730 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1b740 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
1b750 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
1b760 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1b770 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73  istinct)!=0 && s
1b780 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
1b790 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1b7a0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1b7b0 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
1b7c0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
1b7d0 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
1b7e0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65  derBy ){.     re
1b7f0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1b830 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (11) */.  }.  i
1b840 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62  f( isAgg && pSub
1b850 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
1b860 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1b870 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1b880 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69  tion (16) */.  i
1b890 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1b8a0 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  && p->pWhere ) r
1b8b0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1b8c0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1b8d0 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69  tion (19) */.  i
1b8e0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
1b8f0 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
1b900 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
1b910 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
1b920 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
1b930 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20  estriction (21) 
1b940 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75  */.  }.  if( pSu
1b950 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
1b960 5f 52 65 63 75 72 73 69 76 65 20 29 20 72 65 74  _Recursive ) ret
1b970 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1b980 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1b990 32 32 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  22)  */.  if( (p
1b9a0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1b9b0 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53  Recursive) && pS
1b9c0 75 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74  ub->pPrior ) ret
1b9d0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  urn 0;       /* 
1b9e0 28 32 33 29 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  (23)  */..  /* O
1b9f0 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
1ba00 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  1:.  ** Restrict
1ba10 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73  ion 3:  If the s
1ba20 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
1ba30 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
1ba40 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20   subquery is .  
1ba50 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74  ** not used as t
1ba60 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
1ba70 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69   of an outer joi
1ba80 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  n.  Examples of 
1ba90 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73  why this.  ** is
1baa0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
1bab0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
1bac0 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1bad0 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
1bae0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
1baf0 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
1bb00 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
1bb10 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
1bb20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
1bb30 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
1bb40 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
1bb50 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
1bb60 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
1bb70 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45    **.  ** OBSOLE
1bb80 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20  TE COMMENT 2:.  
1bb90 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  ** Restriction 1
1bba0 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2:  If the subqu
1bbb0 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
1bbc0 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
1bbd0 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f  ft outer.  ** jo
1bbe0 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
1bbf0 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e  e subquery has n
1bc00 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  o WHERE clause..
1bc10 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73    ** An examples
1bc20 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
1bc30 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
1bc40 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
1bc50 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1bc60 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
1bc70 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30   t2 WHERE t2.x>0
1bc80 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
1bc90 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
1bca0 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
1bcb0 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
1bcc0 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
1bcd0 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52  ER JOIN t2) WHER
1bce0 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20  E t2.x>0.  **.  
1bcf0 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e  ** But the t2.x>
1bd00 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61  0 test will alwa
1bd10 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c  ys fail on a NUL
1bd20 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69  L row of t2, whi
1bd30 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  ch.  ** effectiv
1bd40 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65  ely converts the
1bd50 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f   OUTER JOIN into
1bd60 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a   an INNER JOIN..
1bd70 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f    **.  ** THIS O
1bd80 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54  VERRIDES OBSOLET
1bd90 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44  E COMMENTS 1 AND
1bda0 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54   2 ABOVE:.  ** T
1bdb0 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77  icket #3300 show
1bdc0 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e  s that flattenin
1bdd0 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  g the right term
1bde0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a   of a LEFT JOIN.
1bdf0 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20    ** is fraught 
1be00 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65  with danger.  Be
1be10 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  st to avoid the 
1be20 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66  whole thing.  If
1be30 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
1be40 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1be50 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
1be60 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  OIN, then do not
1be70 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   flatten..  */. 
1be80 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
1be90 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
1bea0 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
1beb0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
1bec0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
1bed0 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
1bee0 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1bef0 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
1bf00 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
1bf10 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
1bf20 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
1bf30 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
1bf40 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
1bf50 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
1bf60 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
1bf70 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
1bf80 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
1bf90 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
1bfa0 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
1bfb0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1bfc0 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
1bfd0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
1bfe0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1bff0 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
1c000 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a  ion 20 */.    }.
1c010 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
1c020 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
1c030 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
1c040 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
1c050 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c060 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
1c070 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
1c080 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
1c090 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
1c0a0 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
1c0b0 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
1c0c0 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
1c0d0 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
1c0e0 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
1c0f0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1c100 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1c110 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1c120 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
1c130 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
1c140 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53  assert( pSub->pS
1c150 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  rc!=0 );.      i
1c160 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
1c170 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
1c180 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
1c190 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  )!=0.       || (
1c1a0 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26  pSub1->pPrior &&
1c1b0 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41   pSub1->op!=TK_A
1c1c0 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  LL) .       || p
1c1d0 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
1c1e0 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  <1.       || pSu
1c1f0 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
1c200 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d  !=pSub1->pEList-
1c210 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a  >nExpr.      ){.
1c220 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
1c230 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c240 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d  testcase( pSub1-
1c250 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b  >pSrc->nSrc>1 );
1c260 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1c270 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a  estriction 18. *
1c280 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
1c290 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
1c2a0 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
1c2b0 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
1c2c0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
1c2d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1c2e0 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
1c2f0 69 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ii].u.x.iOrderBy
1c300 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Col==0 ) return 
1c310 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1c320 0a 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49  .  }..  /***** I
1c330 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1c340 70 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e  point, flattenin
1c350 67 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20  g is permitted. 
1c360 2a 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74  *****/..  /* Aut
1c370 68 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75  horize the subqu
1c380 65 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d  ery */.  pParse-
1c390 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
1c3a0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  pSubitem->zName;
1c3b0 0a 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29  .  TESTONLY(i =)
1c3c0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1c3d0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1c3e0 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
1c3f0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  );.  testcase( i
1c400 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b  ==SQLITE_DENY );
1c410 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1c420 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64  Context = zSaved
1c430 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  AuthContext;..  
1c440 2f 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  /* If the sub-qu
1c450 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
1c460 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
1c470 6e 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73  nt, then (by res
1c480 74 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31  trictions.  ** 1
1c490 37 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20  7 and 18 above) 
1c4a0 69 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49  it must be a UNI
1c4b0 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70  ON ALL and the p
1c4c0 61 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74  arent query must
1c4d0 20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65   .  ** be of the
1c4e0 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   form:.  **.  **
1c4f0 20 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70       SELECT <exp
1c500 72 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73  r-list> FROM (<s
1c510 75 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72  ub-query>) <wher
1c520 65 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a  e-clause> .  **.
1c530 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79    ** followed by
1c540 20 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c   any ORDER BY, L
1c550 49 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53  IMIT and/or OFFS
1c560 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73  ET clauses. This
1c570 20 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61   block.  ** crea
1c580 74 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f  tes N-1 copies o
1c590 66 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65  f the parent que
1c5a0 72 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f  ry without any O
1c5b0 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f  RDER BY, LIMIT o
1c5c0 72 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63  r .  ** OFFSET c
1c5d0 6c 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73  lauses and joins
1c5e0 20 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66   them to the lef
1c5f0 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74  t-hand-side of t
1c600 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  he original.  **
1c610 20 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c   using UNION ALL
1c620 20 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74   operators. In t
1c630 68 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68  his case N is th
1c640 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70  e number of simp
1c650 6c 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73  le.  ** select s
1c660 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
1c670 20 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75   compound sub-qu
1c680 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ery..  **.  ** E
1c690 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
1c6a0 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31  *     SELECT a+1
1c6b0 20 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20   FROM (.  **    
1c6c0 20 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f      SELECT x FRO
1c6d0 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
1c6e0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1c6f0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79          SELECT y
1c700 20 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20   FROM tab.  **  
1c710 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a        UNION ALL.
1c720 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45    **        SELE
1c730 43 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d  CT abs(z*2) FROM
1c740 20 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29   tab2.  **     )
1c750 20 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45   WHERE a!=5 ORDE
1c760 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a  R BY 1.  **.  **
1c770 20 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74   Transformed int
1c780 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  o:.  **.  **    
1c790 20 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d   SELECT x+1 FROM
1c7a0 20 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d   tab WHERE x+1!=
1c7b0 35 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e  5.  **     UNION
1c7c0 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45   ALL.  **     SE
1c7d0 4c 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61  LECT y+1 FROM ta
1c7e0 62 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20  b WHERE y+1!=5. 
1c7f0 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c   **     UNION AL
1c800 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  L.  **     SELEC
1c810 54 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f  T abs(z*2)+1 FRO
1c820 4d 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73  M tab2 WHERE abs
1c830 28 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20  (z*2)+1!=5.  ** 
1c840 20 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20      ORDER BY 1. 
1c850 20 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c   **.  ** We call
1c860 20 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f   this the "compo
1c870 75 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61  und-subquery fla
1c880 74 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20  ttening"..  */. 
1c890 20 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e   for(pSub=pSub->
1c8a0 70 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53  pPrior; pSub; pS
1c8b0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
1c8c0 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e  {.    Select *pN
1c8d0 65 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  ew;.    ExprList
1c8e0 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e   *pOrderBy = p->
1c8f0 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78  pOrderBy;.    Ex
1c900 70 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e  pr *pLimit = p->
1c910 70 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72  pLimit;.    Expr
1c920 20 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70   *pOffset = p->p
1c930 4f 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65  Offset;.    Sele
1c940 63 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e  ct *pPrior = p->
1c950 70 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70  pPrior;.    p->p
1c960 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1c970 20 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20   p->pSrc = 0;.  
1c980 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
1c990 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  .    p->pLimit =
1c9a0 20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73   0;.    p->pOffs
1c9b0 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  et = 0;.    pNew
1c9c0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
1c9d0 44 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20  Dup(db, p, 0);. 
1c9e0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
1c9f0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e  pOffset;.    p->
1ca00 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b  pLimit = pLimit;
1ca10 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
1ca20 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20   = pOrderBy;.   
1ca30 20 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b   p->pSrc = pSrc;
1ca40 0a 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f  .    p->op = TK_
1ca50 41 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67  ALL;.    p->pRig
1ca60 68 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20  htmost = 0;.    
1ca70 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1ca80 20 20 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69       pNew = pPri
1ca90 6f 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  or;.    }else{. 
1caa0 20 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f       pNew->pPrio
1cab0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1cac0 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f    pNew->pRightmo
1cad0 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  st = 0;.    }.  
1cae0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e    p->pPrior = pN
1caf0 65 77 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  ew;.    if( db->
1cb00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
1cb10 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
1cb20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e  /* Begin flatten
1cb30 69 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68  ing the iFrom-th
1cb40 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
1cb50 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20  OM clause .  ** 
1cb60 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1cb70 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20  ry..  */.  pSub 
1cb80 3d 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74  = pSub1 = pSubit
1cb90 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20  em->pSelect;..  
1cba0 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72  /* Delete the tr
1cbb0 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74  ansient table st
1cbc0 72 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74  ructure associat
1cbd0 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
1cbe0 20 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20   subquery.  */. 
1cbf0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1cc00 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  b, pSubitem->zDa
1cc10 74 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74  tabase);.  sqlit
1cc20 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
1cc30 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  bitem->zName);. 
1cc40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1cc50 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c  b, pSubitem->zAl
1cc60 69 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d  ias);.  pSubitem
1cc70 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
1cc80 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61  .  pSubitem->zNa
1cc90 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74  me = 0;.  pSubit
1cca0 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a  em->zAlias = 0;.
1ccb0 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c    pSubitem->pSel
1ccc0 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44  ect = 0;..  /* D
1ccd0 65 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  efer deleting th
1cce0 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61  e Table object a
1ccf0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1cd00 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
1cd10 20 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65   until code gene
1cd20 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63  ration is.  ** c
1cd30 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74  omplete, since t
1cd40 68 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65  here may still e
1cd50 78 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65  xist Expr.pTab e
1cd60 6e 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a  ntries that.  **
1cd70 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75   refer to the su
1cd80 62 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65  bquery even afte
1cd90 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54  r flattening.  T
1cda0 69 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a  icket #3346..  *
1cdb0 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d  *.  ** pSubitem-
1cdc0 3e 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20  >pTab is always 
1cdd0 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74  non-NULL by test
1cde0 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e   restrictions an
1cdf0 64 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20  d tests above.. 
1ce00 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53   */.  if( ALWAYS
1ce10 28 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21  (pSubitem->pTab!
1ce20 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  =0) ){.    Table
1ce30 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53   *pTabToDel = pS
1ce40 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ubitem->pTab;.  
1ce50 20 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d    if( pTabToDel-
1ce60 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20  >nRef==1 ){.    
1ce70 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1ce80 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1ce90 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1cea0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44  );.      pTabToD
1ceb0 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20  el->pNextZombie 
1cec0 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f  = pToplevel->pZo
1ced0 6d 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70  mbieTab;.      p
1cee0 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69  Toplevel->pZombi
1cef0 65 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c  eTab = pTabToDel
1cf00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cf10 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52     pTabToDel->nR
1cf20 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ef--;.    }.    
1cf30 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d  pSubitem->pTab =
1cf40 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
1cf50 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70  e following loop
1cf60 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
1cf70 61 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f  ach term in a co
1cf80 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a  mpound-subquery.
1cf90 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20    ** flattening 
1cfa0 28 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62  (as described ab
1cfb0 6f 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65  ove).  If we are
1cfc0 20 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65   doing a differe
1cfd0 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20  nt kind.  ** of 
1cfe0 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66  flattening - a f
1cff0 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20  lattening other 
1d000 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d  than a compound-
1d010 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
1d020 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20  ing -.  ** then 
1d030 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72  this loop only r
1d040 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20  uns once..  **. 
1d050 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f   ** This loop mo
1d060 76 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46  ves all of the F
1d070 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  ROM elements of 
1d080 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
1d090 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46  o the.  ** the F
1d0a0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1d0b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20  e outer query.  
1d0c0 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69  Before doing thi
1d0d0 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  s, remember.  **
1d0e0 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
1d0f0 65 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69  er for the origi
1d100 6e 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20  nal outer query 
1d110 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a  FROM element in.
1d120 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54    ** iParent.  T
1d130 68 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f  he iParent curso
1d140 72 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  r will never be 
1d150 75 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e  used.  Subsequen
1d160 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c  t code.  ** will
1d170 20 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   scan expression
1d180 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50  s looking for iP
1d190 61 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73  arent references
1d1a0 20 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a   and replace.  *
1d1b0 2a 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63  * those referenc
1d1c0 65 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69  es with expressi
1d1d0 6f 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65  ons that resolve
1d1e0 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79   to the subquery
1d1f0 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65   FROM.  ** eleme
1d200 6e 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63  nts we are now c
1d210 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a  opying in..  */.
1d220 20 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b    for(pParent=p;
1d230 20 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e   pParent; pParen
1d240 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f  t=pParent->pPrio
1d250 72 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  r, pSub=pSub->pP
1d260 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rior){.    int n
1d270 53 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a  SubSrc;.    u8 j
1d280 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20  ointype = 0;.   
1d290 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d   pSubSrc = pSub-
1d2a0 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52  >pSrc;     /* FR
1d2b0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62  OM clause of sub
1d2c0 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75  query */.    nSu
1d2d0 62 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e  bSrc = pSubSrc->
1d2e0 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72  nSrc;  /* Number
1d2f0 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62   of terms in sub
1d300 71 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73  query FROM claus
1d310 65 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20  e */.    pSrc = 
1d320 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20  pParent->pSrc;  
1d330 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
1d340 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  e of the outer q
1d350 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28  uery */..    if(
1d360 20 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61   pSrc ){.      a
1d370 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d  ssert( pParent==
1d380 70 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74  p );  /* First t
1d390 69 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ime through the 
1d3a0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f  loop */.      jo
1d3b0 69 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65  intype = pSubite
1d3c0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  m->jointype;.   
1d3d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1d3e0 73 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70  sert( pParent!=p
1d3f0 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20   );  /* 2nd and 
1d400 73 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73  subsequent times
1d410 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f   through the loo
1d420 70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20  p */.      pSrc 
1d430 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20  = pParent->pSrc 
1d440 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1d450 41 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c  Append(db, 0, 0,
1d460 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
1d470 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Src==0 ){.      
1d480 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
1d490 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1d4a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d4b0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d4c0 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  /* The subquery 
1d4d0 75 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c  uses a single sl
1d4e0 6f 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ot of the FROM c
1d4f0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1d500 65 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e  er.    ** query.
1d510 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1d520 79 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  y has more than 
1d530 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69  one element in i
1d540 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a  ts FROM clause,.
1d550 20 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61      ** then expa
1d560 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
1d570 72 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65  ry to make space
1d580 20 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20   for it to hold 
1d590 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20  all elements.   
1d5a0 20 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75   ** of the subqu
1d5b0 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ery..    **.    
1d5c0 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
1d5d0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c  **.    **    SEL
1d5e0 45 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c  ECT * FROM tabA,
1d5f0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1d600 73 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62  sub1, sub2), tab
1d610 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  B;.    **.    **
1d620 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1d630 20 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20   has 3 slots in 
1d640 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  its FROM clause.
1d650 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68    One slot of th
1d660 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1d670 75 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65  uery (the middle
1d680 20 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62   slot) is used b
1d690 79 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20  y the subquery. 
1d6a0 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   The next.    **
1d6b0 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77   block of code w
1d6c0 69 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f  ill expand the o
1d6d0 75 74 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c  ut query to 4 sl
1d6e0 6f 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65  ots.  The middle
1d6f0 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20  .    ** slot is 
1d700 65 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20  expanded to two 
1d710 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74  slots in order t
1d720 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72  o make space for
1d730 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20   the.    ** two 
1d740 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1d750 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
1d760 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20  he subquery..   
1d770 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62   */.    if( nSub
1d780 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  Src>1 ){.      p
1d790 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70  Parent->pSrc = p
1d7a0 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
1d7b0 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20  ListEnlarge(db, 
1d7c0 70 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c  pSrc, nSubSrc-1,
1d7d0 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20  iFrom+1);.      
1d7e0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1d7f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
1d800 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1d810 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61     }..    /* Tra
1d820 6e 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63  nsfer the FROM c
1d830 6c 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d  lause terms from
1d840 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e   the subquery in
1d850 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  to the.    ** ou
1d860 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a  ter query..    *
1d870 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
1d880 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a  <nSubSrc; i++){.
1d890 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c        sqlite3IdL
1d8a0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  istDelete(db, pS
1d8b0 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70  rc->a[i+iFrom].p
1d8c0 55 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53  Using);.      pS
1d8d0 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d  rc->a[i+iFrom] =
1d8e0 20 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a   pSubSrc->a[i];.
1d8f0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53        memset(&pS
1d900 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20  ubSrc->a[i], 0, 
1d910 73 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e  sizeof(pSubSrc->
1d920 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  a[i]));.    }.  
1d930 20 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d    pSrc->a[iFrom]
1d940 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e  .jointype = join
1d950 74 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  type;.  .    /* 
1d960 4e 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69  Now begin substi
1d970 74 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20  tuting subquery 
1d980 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65  result set expre
1d990 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20  ssions for .    
1d9a0 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ** references to
1d9b0 20 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20   the iParent in 
1d9c0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
1d9d0 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20  .    ** .    ** 
1d9e0 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a  Example:.    **.
1d9f0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
1da00 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28  a+5, b*10 FROM (
1da10 53 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c  SELECT x*3 AS a,
1da20 20 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20   y+10 AS b FROM 
1da30 74 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20  t1) WHERE a>b;. 
1da40 20 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20     **   \       
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f                \_
1da60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62  ____________ sub
1da70 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  query __________
1da80 2f 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20  /          /.   
1da90 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f   **    \________
1daa0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75  _____________ ou
1dab0 74 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f  ter query ______
1dac0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1dad0 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a  ________/.    **
1dae0 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20  .    ** We look 
1daf0 61 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  at every express
1db00 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72  ion in the outer
1db10 20 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79   query and every
1db20 20 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20   place we see.  
1db30 20 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73    ** "a" we subs
1db40 74 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64  titute "x*3" and
1db50 20 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20   every place we 
1db60 73 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74  see "b" we subst
1db70 69 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20  itute "y+10"..  
1db80 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d    */.    pList =
1db90 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74   pParent->pEList
1dba0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1dbb0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1dbc0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
1dbd0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1dbe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
1dbf0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c  har *zName = sql
1dc00 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
1dc10 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70   pList->a[i].zSp
1dc20 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  an);.        sql
1dc30 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
1dc40 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  e);.        pLis
1dc50 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
1dc60 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
1dc70 20 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78     }.    substEx
1dc80 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1dc90 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72  nt->pEList, iPar
1dca0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1dcb0 74 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67  t);.    if( isAg
1dcc0 67 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  g ){.      subst
1dcd0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
1dce0 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20  rent->pGroupBy, 
1dcf0 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1dd00 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50  EList);.      pP
1dd10 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d  arent->pHaving =
1dd20 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70   substExpr(db, p
1dd30 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c  Parent->pHaving,
1dd40 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1dd50 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1dd60 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72     if( pSub->pOr
1dd70 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61  derBy ){.      a
1dd80 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
1dd90 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
1dda0 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f       pParent->pO
1ddb0 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
1ddc0 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
1ddd0 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
1dde0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1ddf0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1de00 42 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  By ){.      subs
1de10 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
1de20 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c  arent->pOrderBy,
1de30 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e   iParent, pSub->
1de40 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
1de50 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68     if( pSub->pWh
1de60 65 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68  ere ){.      pWh
1de70 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
1de80 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1de90 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d  Where, 0);.    }
1dea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65  else{.      pWhe
1deb0 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  re = 0;.    }.  
1dec0 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
1ded0 41 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Agg ){.      ass
1dee0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48  ert( pParent->pH
1def0 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20  aving==0 );.    
1df00 20 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69    pParent->pHavi
1df10 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57  ng = pParent->pW
1df20 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
1df30 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57  ent->pWhere = pW
1df40 68 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72  here;.      pPar
1df50 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1df60 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1df70 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1df80 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1df90 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
1dfa0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1dfb0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64  sqlite3ExprAnd(d
1dfc0 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  b, pParent->pHav
1dfd0 69 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ing, .          
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1e000 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d  xprDup(db, pSub-
1e010 3e 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20  >pHaving, 0));. 
1e020 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1e030 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  rent->pGroupBy==
1e040 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  0 );.      pPare
1e050 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  nt->pGroupBy = s
1e060 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1e070 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f  p(db, pSub->pGro
1e080 75 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65  upBy, 0);.    }e
1e090 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65  lse{.      pPare
1e0a0 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62  nt->pWhere = sub
1e0b0 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1e0c0 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72  nt->pWhere, iPar
1e0d0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1e0e0 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  t);.      pParen
1e0f0 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  t->pWhere = sqli
1e100 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70  te3ExprAnd(db, p
1e110 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20  Parent->pWhere, 
1e120 70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20  pWhere);.    }. 
1e130 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61   .    /* The fla
1e140 74 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20  ttened query is 
1e150 64 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68  distinct if eith
1e160 65 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20  er the inner or 
1e170 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72  the.    ** outer
1e180 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e   query is distin
1e190 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ct. .    */.    
1e1a0 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67  pParent->selFlag
1e1b0 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c  s |= pSub->selFl
1e1c0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1e1d0 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20  t;.  .    /*.   
1e1e0 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46   ** SELECT ... F
1e1f0 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
1e200 4c 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62  LIMIT a OFFSET b
1e210 29 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54  ) LIMIT x OFFSET
1e220 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   y;.    **.    *
1e230 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64  * One is tempted
1e240 20 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61   to try to add a
1e250 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e   and b to combin
1e260 65 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42  e the limits.  B
1e270 75 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64  ut this.    ** d
1e280 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20  oes not work if 
1e290 65 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20  either limit is 
1e2a0 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f  negative..    */
1e2b0 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70  .    if( pSub->p
1e2c0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70  Limit ){.      p
1e2d0 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d  Parent->pLimit =
1e2e0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20   pSub->pLimit;. 
1e2f0 20 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69       pSub->pLimi
1e300 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
1e310 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c  ..  /* Finially,
1e320 20 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20   delete what is 
1e330 6c 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71  left of the subq
1e340 75 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a  uery and return.
1e350 20 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20    ** success..  
1e360 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  */.  sqlite3Sele
1e370 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1e380 62 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31  b1);..  return 1
1e390 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
1e3a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1e3b0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
1e3c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e3d0 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f  OMIT_VIEW) */../
1e3e0 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68  *.** Based on th
1e3f0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1e400 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74  e AggInfo struct
1e410 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  ure indicated by
1e420 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
1e430 67 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e  gument, this fun
1e440 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20  ction checks if 
1e450 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
1e460 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e true:.**.**   
1e470 20 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e   * the query con
1e480 74 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e  tains just a sin
1e490 67 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75  gle aggregate fu
1e4a0 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20  nction,.**    * 
1e4b0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
1e4c0 6e 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72  nction is either
1e4d0 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c   min() or max(),
1e4e0 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65   and.**    * the
1e4f0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
1e500 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
1e510 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  ion is a column 
1e520 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  value..**.** If 
1e530 61 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65  all of the above
1e540 20 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20   are true, then 
1e550 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
1e560 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52  N or WHERE_ORDER
1e570 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74  BY_MAX.** is ret
1e580 75 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72  urned as appropr
1e590 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d  iate. Also, *ppM
1e5a0 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  inMax is set to 
1e5b0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a  point to the .**
1e5c0 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e   list of argumen
1e5d0 74 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  ts passed to the
1e5e0 20 61 67 67 72 65 67 61 74 65 20 62 65 66 6f 72   aggregate befor
1e5f0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1e600 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f  ** Or, if the co
1e610 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61  nditions above a
1e620 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d  re not met, *ppM
1e630 69 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20  inMax is set to 
1e640 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f  0 and.** WHERE_O
1e650 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73  RDERBY_NORMAL is
1e660 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1e670 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75  atic u8 minMaxQu
1e680 65 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67  ery(AggInfo *pAg
1e690 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20  gInfo, ExprList 
1e6a0 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69  **ppMinMax){.  i
1e6b0 6e 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f  nt eRet = WHERE_
1e6c0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20  ORDERBY_NORMAL; 
1e6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1e6e0 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a  rn value */..  *
1e6f0 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20  ppMinMax = 0;.  
1e700 69 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  if( pAggInfo->nF
1e710 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78  unc==1 ){.    Ex
1e720 70 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67  pr *pExpr = pAgg
1e730 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70  Info->aFunc[0].p
1e740 45 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61  Expr; /* Aggrega
1e750 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  te function */. 
1e760 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
1e770 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
1e780 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72  List;      /* Ar
1e790 67 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66  guments to agg f
1e7a0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20  unction */..    
1e7b0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1e7c0 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
1e7d0 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  ON );.    if( pE
1e7e0 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
1e7f0 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69  nExpr==1 && pELi
1e800 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e  st->a[0].pExpr->
1e810 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
1e820 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  N ){.      const
1e830 20 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70   char *zFunc = p
1e840 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
1e850 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1e860 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
1e870 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "min")==0 ){.   
1e880 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52       eRet = WHER
1e890 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20  E_ORDERBY_MIN;. 
1e8a0 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78         *ppMinMax
1e8b0 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20   = pEList;.     
1e8c0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
1e8d0 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c  e3StrICmp(zFunc,
1e8e0 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20   "max")==0 ){.  
1e8f0 20 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45        eRet = WHE
1e900 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a  RE_ORDERBY_MAX;.
1e910 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61          *ppMinMa
1e920 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20  x = pEList;.    
1e930 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1e940 20 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d   assert( *ppMinM
1e950 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e  ax==0 || (*ppMin
1e960 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  Max)->nExpr==1 )
1e970 3b 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b  ;.  return eRet;
1e980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
1e990 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70  lect statement p
1e9a0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
1e9b0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1e9c0 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
1e9d0 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  y..** The second
1e9e0 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20   argment is the 
1e9f0 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65  associated aggre
1ea00 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74  gate-info object
1ea10 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74  . This .** funct
1ea20 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65  ion tests if the
1ea30 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68   SELECT is of th
1ea40 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  e form:.**.**   
1ea50 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1ea60 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a  FROM <tbl>.**.**
1ea70 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20   where table is 
1ea80 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  a database table
1ea90 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65  , not a sub-sele
1eaa0 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74  ct or view. If t
1eab0 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73  he query.** does
1eac0 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74   match this patt
1ead0 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e  ern, then a poin
1eae0 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65  ter to the Table
1eaf0 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e   object represen
1eb00 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73  ting.** <tbl> is
1eb10 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1eb20 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
1eb30 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  ned..*/.static T
1eb40 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f  able *isSimpleCo
1eb50 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41  unt(Select *p, A
1eb60 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1eb70 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
1eb80 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  ;.  Expr *pExpr;
1eb90 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e  ..  assert( !p->
1eba0 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69  pGroupBy );..  i
1ebb0 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20  f( p->pWhere || 
1ebc0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
1ebd0 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53  !=1 .   || p->pS
1ebe0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70  rc->nSrc!=1 || p
1ebf0 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
1ec00 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65  lect.  ){.    re
1ec10 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54  turn 0;.  }.  pT
1ec20 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ab = p->pSrc->a[
1ec30 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72  0].pTab;.  pExpr
1ec40 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b   = p->pEList->a[
1ec50 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  0].pExpr;.  asse
1ec60 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61  rt( pTab && !pTa
1ec70 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45  b->pSelect && pE
1ec80 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73  xpr );..  if( Is
1ec90 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20  Virtual(pTab) ) 
1eca0 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1ecb0 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47  pExpr->op!=TK_AG
1ecc0 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74  G_FUNCTION ) ret
1ecd0 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56  urn 0;.  if( NEV
1ece0 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  ER(pAggInfo->nFu
1ecf0 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20  nc==0) ) return 
1ed00 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e  0;.  if( (pAggIn
1ed10 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75  fo->aFunc[0].pFu
1ed20 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51  nc->funcFlags&SQ
1ed30 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29  LITE_FUNC_COUNT)
1ed40 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1ed50 20 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61    if( pExpr->fla
1ed60 67 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29  gs&EP_Distinct )
1ed70 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65   return 0;..  re
1ed80 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a  turn pTab;.}../*
1ed90 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63  .** If the sourc
1eda0 65 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73  e-list item pass
1edb0 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
1edc0 74 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20  t was augmented 
1edd0 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58  with an.** INDEX
1ede0 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
1edf0 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65  en try to locate
1ee00 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69   the specified i
1ee10 6e 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a  ndex. If there.*
1ee20 2a 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61  * was such a cla
1ee30 75 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65  use and the name
1ee40 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62  d index cannot b
1ee50 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
1ee60 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
1ee70 20 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72   and leave an er
1ee80 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f  ror in pParse. O
1ee90 74 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61  therwise, popula
1eea0 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49  te .** pFrom->pI
1eeb0 6e 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20  ndex and return 
1eec0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
1eed0 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64  t sqlite3Indexed
1eee0 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a  ByLookup(Parse *
1eef0 70 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53  pParse, struct S
1ef00 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
1ef10 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d  om){.  if( pFrom
1ef20 2d 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d  ->pTab && pFrom-
1ef30 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54  >zIndex ){.    T
1ef40 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72  able *pTab = pFr
1ef50 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68  om->pTab;.    ch
1ef60 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72  ar *zIndex = pFr
1ef70 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20  om->zIndex;.    
1ef80 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
1ef90 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
1efa0 70 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20  pIndex; .       
1efb0 20 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33   pIdx && sqlite3
1efc0 53 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e  StrICmp(pIdx->zN
1efd0 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20  ame, zIndex); . 
1efe0 20 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78         pIdx=pIdx
1eff0 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20  ->pNext.    );. 
1f000 20 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a     if( !pIdx ){.
1f010 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1f020 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1f030 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73  o such index: %s
1f040 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20  ", zIndex, 0);. 
1f050 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65       pParse->che
1f060 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
1f070 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f080 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
1f090 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78     pFrom->pIndex
1f0a0 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72   = pIdx;.  }.  r
1f0b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f0c0 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20  .}./*.** Detect 
1f0d0 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
1f0e0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
1f0f0 75 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20  use an ORDER BY 
1f100 63 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20  clause with .** 
1f110 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  an alternative c
1f120 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1f130 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45  e..**.**    SELE
1f140 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45  CT ... FROM t1 E
1f150 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e  XCEPT SELECT ...
1f160 20 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42   FROM t2 ORDER B
1f170 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e  Y .. COLLATE ...
1f180 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  .**.** These are
1f190 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
1f1a0 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  subquery:.**.** 
1f1b0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1f1c0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f   (SELECT ... FRO
1f1d0 4d 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45  M t1 EXCEPT SELE
1f1e0 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a  CT ... FROM t2).
1f1f0 2a 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20  **     ORDER BY 
1f200 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a  ... COLLATE ....
1f210 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
1f220 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63  formation is nec
1f230 65 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74  essary because t
1f240 68 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  he multiSelectOr
1f250 64 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a  derBy() routine.
1f260 2a 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65  ** above that ge
1f270 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
1f280 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   for a compound 
1f290 53 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f  SELECT with an O
1f2a0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a  RDER BY clause.*
1f2b0 2a 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61  * uses a merge a
1f2c0 6c 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65  lgorithm that re
1f2d0 71 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20  quires the same 
1f2e0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1f2f0 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73  ce on the.** res
1f300 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f  ult columns as o
1f310 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1f320 6c 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b  lause.  See tick
1f330 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77  et.** http://www
1f340 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f  .sqlite.org/src/
1f350 69 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a  info/6709574d2a.
1f360 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73  **.** This trans
1f370 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c  formation is onl
1f380 79 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43  y needed for EXC
1f390 45 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20  EPT, INTERSECT, 
1f3a0 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68  and UNION..** Th
1f3b0 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
1f3c0 61 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20  ator works fine 
1f3d0 77 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74  with multiSelect
1f3e0 4f 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77  OrderBy() even w
1f3f0 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65  hen.** there are
1f400 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69   COLLATE terms i
1f410 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a  n the ORDER BY..
1f420 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1f430 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
1f440 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61  ectToSubquery(Wa
1f450 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
1f460 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
1f470 20 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e   i;.  Select *pN
1f480 65 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58  ew;.  Select *pX
1f490 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1f4a0 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
1f4b0 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72  st_item *a;.  Sr
1f4c0 63 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a  cList *pNewSrc;.
1f4d0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
1f4e0 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a  .  Token dummy;.
1f4f0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
1f500 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1f510 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28  _Continue;.  if(
1f520 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
1f530 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
1f540 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d  tinue;.  for(pX=
1f550 70 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70  p; pX && (pX->op
1f560 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e  ==TK_ALL || pX->
1f570 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20  op==TK_SELECT); 
1f580 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d  pX=pX->pPrior){}
1f590 0a 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72  .  if( pX==0 ) r
1f5a0 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1f5b0 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72  ue;.  a = p->pOr
1f5c0 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28  derBy->a;.  for(
1f5d0 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  i=p->pOrderBy->n
1f5e0 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Expr-1; i>=0; i-
1f5f0 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d  -){.    if( a[i]
1f600 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  .pExpr->flags & 
1f610 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65  EP_Collate ) bre
1f620 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c  ak;.  }.  if( i<
1f630 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
1f640 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49  ontinue;..  /* I
1f650 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
1f660 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e  point, that mean
1f670 73 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61  s the transforma
1f680 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
1f690 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d  . */..  pParse =
1f6a0 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
1f6b0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1f6c0 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  >db;.  pNew = sq
1f6d0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1f6e0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  o(db, sizeof(*pN
1f6f0 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
1f700 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  w==0 ) return WR
1f710 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65  C_Abort;.  memse
1f720 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a  t(&dummy, 0, siz
1f730 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70  eof(dummy));.  p
1f740 4e 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33  NewSrc = sqlite3
1f750 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f  SrcListAppendFro
1f760 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30  mTerm(pParse,0,0
1f770 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30  ,0,&dummy,pNew,0
1f780 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53  ,0);.  if( pNewS
1f790 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  rc==0 ) return W
1f7a0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65  RC_Abort;.  *pNe
1f7b0 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72  w = *p;.  p->pSr
1f7c0 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70  c = pNewSrc;.  p
1f7d0 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
1f7e0 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
1f7f0 28 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69  (pParse, 0, sqli
1f800 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41  te3Expr(db, TK_A
1f810 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70  LL, 0));.  p->op
1f820 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20   = TK_SELECT;.  
1f830 70 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20  p->pWhere = 0;. 
1f840 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20   pNew->pGroupBy 
1f850 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  = 0;.  pNew->pHa
1f860 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77  ving = 0;.  pNew
1f870 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
1f880 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
1f890 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20  .  pNew->pLimit 
1f8a0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  = 0;.  pNew->pOf
1f8b0 66 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  fset = 0;.  retu
1f8c0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
1f8d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1f8e0 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
1f8f0 2a 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68  * Argument pWith
1f900 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e   (which may be N
1f910 55 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61  ULL) points to a
1f920 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1f930 6e 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20  nested .** WITH 
1f940 63 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69  contexts, from i
1f950 6e 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73  nner to outermos
1f960 74 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  t. If the table 
1f970 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a  identified by .*
1f980 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c  * FROM clause el
1f990 65 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72  ement pItem is r
1f9a0 65 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74  eally a common-t
1f9b0 61 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20  able-expression 
1f9c0 28 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72  (CTE) .** then r
1f9d0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1f9e0 74 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e  to the CTE defin
1f9f0 69 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74  ition for that t
1fa00 61 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a  able. Otherwise.
1fa10 2a 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  ** return NULL..
1fa20 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e  **.** If a non-N
1fa30 55 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 74  ULL value is ret
1fa40 75 72 6e 65 64 2c 20 73 65 74 20 2a 70 70 43 6f  urned, set *ppCo
1fa50 6e 74 65 78 74 20 74 6f 20 70 6f 69 6e 74 20 74  ntext to point t
1fa60 6f 20 74 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62  o the With.** ob
1fa70 6a 65 63 74 20 74 68 61 74 20 74 68 65 20 72 65  ject that the re
1fa80 74 75 72 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e  turned CTE belon
1fa90 67 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  gs to..*/.static
1faa0 20 73 74 72 75 63 74 20 43 74 65 20 2a 73 65 61   struct Cte *sea
1fab0 72 63 68 57 69 74 68 28 0a 20 20 57 69 74 68 20  rchWith(.  With 
1fac0 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
1fad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1fae0 72 72 65 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20  rrent outermost 
1faf0 57 49 54 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20  WITH clause */. 
1fb00 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1fb10 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20  item *pItem,    
1fb20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1fb30 65 6c 65 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c  element to resol
1fb40 76 65 20 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70  ve */.  With **p
1fb50 70 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  pContext        
1fb60 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1fb70 57 49 54 48 20 63 6c 61 75 73 65 20 72 65 74 75  WITH clause retu
1fb80 72 6e 20 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73  rn value belongs
1fb90 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73   to */.){.  cons
1fba0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
1fbb0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
1fbc0 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61  abase==0 && (zNa
1fbd0 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  me = pItem->zNam
1fbe0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  e)!=0 ){.    Wit
1fbf0 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  h *p;.    for(p=
1fc00 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70  pWith; p; p=p->p
1fc10 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e  Outer){.      in
1fc20 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
1fc30 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69  =0; i<p->nCte; i
1fc40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1fc50 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1fc60 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  zName, p->a[i].z
1fc70 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
1fc80 20 20 20 20 20 20 2a 70 70 43 6f 6e 74 65 78 74        *ppContext
1fc90 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
1fca0 72 65 74 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b  return &p->a[i];
1fcb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fcc0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1fcd0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54  eturn 0;.}../* T
1fce0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
1fcf0 72 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 73 74  r maintains a st
1fd00 61 63 6b 20 6f 66 20 61 63 74 69 76 65 20 57 49  ack of active WI
1fd10 54 48 20 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69  TH clauses.** wi
1fd20 74 68 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  th the inner-mos
1fd30 74 20 57 49 54 48 20 63 6c 61 75 73 65 20 62 65  t WITH clause be
1fd40 69 6e 67 20 61 74 20 74 68 65 20 74 6f 70 20 6f  ing at the top o
1fd50 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
1fd60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fd70 70 75 73 68 65 73 20 74 68 65 20 57 49 54 48 20  pushes the WITH 
1fd80 63 6c 61 75 73 65 20 70 61 73 73 65 64 20 61 73  clause passed as
1fd90 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1fda0 6d 65 6e 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65  ment.** onto the
1fdb0 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
1fdc0 6b 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62  k. If argument b
1fdd0 46 72 65 65 20 69 73 20 74 72 75 65 2c 20 74 68  Free is true, th
1fde0 65 6e 20 74 68 69 73 0a 2a 2a 20 57 49 54 48 20  en this.** WITH 
1fdf0 63 6c 61 75 73 65 20 77 69 6c 6c 20 6e 65 76 65  clause will neve
1fe00 72 20 62 65 20 70 6f 70 70 65 64 20 66 72 6f 6d  r be popped from
1fe10 20 74 68 65 20 73 74 61 63 6b 2e 20 49 6e 20 74   the stack. In t
1fe20 68 69 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 73  his case it.** s
1fe30 68 6f 75 6c 64 20 62 65 20 66 72 65 65 64 20 61  hould be freed a
1fe40 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 50 61  long with the Pa
1fe50 72 73 65 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f  rse object. In o
1fe60 74 68 65 72 20 63 61 73 65 73 2c 20 77 68 65 6e  ther cases, when
1fe70 0a 2a 2a 20 62 46 72 65 65 3d 3d 30 2c 20 74 68  .** bFree==0, th
1fe80 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 77 69  e With object wi
1fe90 6c 6c 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ll be freed alon
1fea0 67 20 77 69 74 68 20 74 68 65 20 53 45 4c 45 43  g with the SELEC
1feb0 54 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  T .** statement 
1fec0 77 69 74 68 20 77 68 69 63 68 20 69 74 20 69 73  with which it is
1fed0 20 61 73 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a   associated..*/.
1fee0 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68  void sqlite3With
1fef0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
1ff00 73 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 2c  se, With *pWith,
1ff10 20 75 38 20 62 46 72 65 65 29 7b 0a 20 20 61 73   u8 bFree){.  as
1ff20 73 65 72 74 28 20 62 46 72 65 65 3d 3d 30 20 7c  sert( bFree==0 |
1ff30 7c 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d  | pParse->pWith=
1ff40 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 57 69 74  =0 );.  if( pWit
1ff50 68 20 29 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e  h ){.    pWith->
1ff60 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d  pOuter = pParse-
1ff70 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
1ff80 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
1ff90 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 62  h;.    pParse->b
1ffa0 46 72 65 65 57 69 74 68 20 3d 20 62 46 72 65 65  FreeWith = bFree
1ffb0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1ffc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 65  his function che
1ffd0 63 6b 73 20 69 66 20 61 72 67 75 6d 65 6e 74 20  cks if argument 
1ffe0 70 46 72 6f 6d 20 72 65 66 65 72 73 20 74 6f 20  pFrom refers to 
1fff0 61 20 43 54 45 20 64 65 63 6c 61 72 65 64 20 62  a CTE declared b
20000 79 20 0a 2a 2a 20 61 20 57 49 54 48 20 63 6c 61  y .** a WITH cla
20010 75 73 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  use on the stack
20020 20 63 75 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74   currently maint
20030 61 69 6e 65 64 20 62 79 20 74 68 65 20 70 61 72  ained by the par
20040 73 65 72 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20  ser. And,.** if 
20050 63 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73  currently proces
20060 73 69 6e 67 20 61 20 43 54 45 20 65 78 70 72 65  sing a CTE expre
20070 73 73 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20  ssion, if it is 
20080 61 20 72 65 63 75 72 73 69 76 65 0a 2a 2a 20 72  a recursive.** r
20090 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
200a0 63 75 72 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a  current CTE..**.
200b0 2a 2a 20 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c  ** If pFrom fall
200c0 73 20 69 6e 74 6f 20 65 69 74 68 65 72 20 6f 66  s into either of
200d0 20 74 68 65 20 74 77 6f 20 63 61 74 65 67 6f 72   the two categor
200e0 69 65 73 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d  ies above, pFrom
200f0 2d 3e 70 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74  ->pTab.** and ot
20100 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 70  her fields are p
20110 6f 70 75 6c 61 74 65 64 20 61 63 63 6f 72 64 69  opulated accordi
20120 6e 67 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ngly. The caller
20130 20 73 68 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a   should check.**
20140 20 28 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30   (pFrom->pTab!=0
20150 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  ) to determine w
20160 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20  hether or not a 
20170 73 75 63 63 65 73 73 66 75 6c 20 6d 61 74 63 68  successful match
20180 0a 2a 2a 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a  .** was found..*
20190 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
201a0 6e 6f 74 20 61 20 6d 61 74 63 68 20 69 73 20 66  not a match is f
201b0 6f 75 6e 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ound, SQLITE_OK 
201c0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e  is returned if n
201d0 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  o error.** occur
201e0 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64  s. If an error d
201f0 6f 65 73 20 6f 63 63 75 72 2c 20 61 6e 20 65 72  oes occur, an er
20200 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
20210 74 6f 72 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  tored in the.** 
20220 70 61 72 73 65 72 20 61 6e 64 20 73 6f 6d 65 20  parser and some 
20230 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
20240 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
20250 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
20260 74 69 63 20 69 6e 74 20 77 69 74 68 45 78 70 61  tic int withExpa
20270 6e 64 28 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57  nd(.  Walker *pW
20280 61 6c 6b 65 72 2c 20 0a 20 20 73 74 72 75 63 74  alker, .  struct
20290 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
202a0 46 72 6f 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20  From.){.  Parse 
202b0 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
202c0 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c  r->pParse;.  sql
202d0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
202e0 65 2d 3e 64 62 3b 0a 20 20 73 74 72 75 63 74 20  e->db;.  struct 
202f0 43 74 65 20 2a 70 43 74 65 3b 20 20 20 20 20 20  Cte *pCte;      
20300 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
20310 68 65 64 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c  hed CTE (or NULL
20320 20 69 66 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f   if no match) */
20330 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 3b 20  .  With *pWith; 
20340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20350 20 20 20 2f 2a 20 57 49 54 48 20 63 6c 61 75 73     /* WITH claus
20360 65 20 74 68 61 74 20 70 43 74 65 20 62 65 6c 6f  e that pCte belo
20370 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
20380 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
20390 3d 3d 30 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d  ==0 );..  pCte =
203a0 20 73 65 61 72 63 68 57 69 74 68 28 70 50 61 72   searchWith(pPar
203b0 73 65 2d 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d  se->pWith, pFrom
203c0 2c 20 26 70 57 69 74 68 29 3b 0a 20 20 69 66 28  , &pWith);.  if(
203d0 20 70 43 74 65 20 29 7b 0a 20 20 20 20 54 61 62   pCte ){.    Tab
203e0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 45 78  le *pTab;.    Ex
203f0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
20400 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
20410 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  ;.    Select *pL
20420 65 66 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  eft;            
20430 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
20440 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20450 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61  t */.    int bMa
20460 79 52 65 63 75 72 73 69 76 65 3b 20 20 20 20 20  yRecursive;     
20470 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20480 66 20 63 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65  f compound joine
20490 64 20 62 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  d by UNION [ALL]
204a0 20 2a 2f 0a 20 20 20 20 57 69 74 68 20 2a 70 53   */.    With *pS
204b0 61 76 65 64 57 69 74 68 3b 20 20 20 20 20 20 20  avedWith;       
204c0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
204d0 20 76 61 6c 75 65 20 6f 66 20 70 50 61 72 73 65   value of pParse
204e0 2d 3e 70 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20  ->pWith */..    
204f0 2f 2a 20 49 66 20 70 43 74 65 2d 3e 7a 45 72 72  /* If pCte->zErr
20500 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20   is non-NULL at 
20510 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
20520 20 74 68 69 73 20 69 73 20 61 6e 20 69 6c 6c 65   this is an ille
20530 67 61 6c 0a 20 20 20 20 2a 2a 20 72 65 63 75 72  gal.    ** recur
20540 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 74  sive reference t
20550 6f 20 43 54 45 20 70 43 74 65 2e 20 4c 65 61 76  o CTE pCte. Leav
20560 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 70 50  e an error in pP
20570 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 0a  arse and return.
20580 20 20 20 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66      ** early. If
20590 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e   pCte->zErr is N
205a0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69  ULL, then this i
205b0 73 20 6e 6f 74 20 61 20 72 65 63 75 72 73 69 76  s not a recursiv
205c0 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 20 20 20  e reference..   
205d0 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
205e0 2c 20 70 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20  , proceed.  */. 
205f0 20 20 20 69 66 28 20 70 43 74 65 2d 3e 7a 45 72     if( pCte->zEr
20600 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
20610 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
20620 65 2c 20 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70  e, pCte->zErr, p
20630 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Cte->zName);.   
20640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20650 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
20660 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
20670 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
20680 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70   pFrom->pTab = p
20690 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Tab = sqlite3DbM
206a0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
206b0 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20  zeof(Table));.  
206c0 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
206d0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
206e0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66  ;.    pTab->nRef
206f0 20 3d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e   = 1;.    pTab->
20700 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
20710 62 53 74 72 44 75 70 28 64 62 2c 20 70 43 74 65  bStrDup(db, pCte
20720 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54  ->zName);.    pT
20730 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
20740 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73      pTab->nRowEs
20750 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 20  t = 1048576;.   
20760 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
20770 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b  |= TF_Ephemeral;
20780 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  .    pFrom->pSel
20790 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
207a0 65 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d  ectDup(db, pCte-
207b0 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
207c0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
207d0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
207e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
207f0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
20800 3e 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20  >pSelect );..   
20810 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69   /* Check if thi
20820 73 20 69 73 20 61 20 72 65 63 75 72 73 69 76 65  s is a recursive
20830 20 43 54 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65   CTE. */.    pSe
20840 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
20850 63 74 3b 0a 20 20 20 20 62 4d 61 79 52 65 63 75  ct;.    bMayRecu
20860 72 73 69 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e  rsive = ( pSel->
20870 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53  op==TK_ALL || pS
20880 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e  el->op==TK_UNION
20890 20 29 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79   );.    if( bMay
208a0 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20  Recursive ){.   
208b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
208c0 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
208d0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pFrom->pSelect->
208e0 70 53 72 63 3b 0a 20 20 20 20 20 20 66 6f 72 28  pSrc;.      for(
208f0 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
20900 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
20910 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
20920 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
20930 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
20940 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44     if( pItem->zD
20950 61 74 61 62 61 73 65 3d 3d 30 20 0a 20 20 20 20  atabase==0 .    
20960 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a       && pItem->z
20970 4e 61 6d 65 21 3d 30 20 0a 20 20 20 20 20 20 20  Name!=0 .       
20980 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
20990 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e  trICmp(pItem->zN
209a0 61 6d 65 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65  ame, pCte->zName
209b0 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20  ).          ){. 
209c0 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
209d0 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
209e0 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73         pItem->is
209f0 52 65 63 75 72 73 69 76 65 20 3d 20 31 3b 0a 20  Recursive = 1;. 
20a00 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 6e           pTab->n
20a10 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
20a20 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20   pSel->selFlags 
20a30 7c 3d 20 53 46 5f 52 65 63 75 72 73 69 76 65 3b  |= SF_Recursive;
20a40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20a50 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
20a60 20 4f 6e 6c 79 20 6f 6e 65 20 72 65 63 75 72 73   Only one recurs
20a70 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69 73  ive reference is
20a80 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a   permitted. */ .
20a90 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
20aa0 65 66 3e 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ef>2 ){.      sq
20ab0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20  lite3ErrorMsg(. 
20ac0 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
20ad0 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72   "multiple refer
20ae0 65 6e 63 65 73 20 74 6f 20 72 65 63 75 72 73 69  ences to recursi
20af0 76 65 20 74 61 62 6c 65 3a 20 25 73 22 2c 20 70  ve table: %s", p
20b00 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Cte->zName.     
20b10 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
20b20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
20b30 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
20b40 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c   pTab->nRef==1 |
20b50 7c 20 28 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61  | ((pSel->selFla
20b60 67 73 26 53 46 5f 52 65 63 75 72 73 69 76 65 29  gs&SF_Recursive)
20b70 20 26 26 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d   && pTab->nRef==
20b80 32 20 29 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d  2 ));..    pCte-
20b90 3e 7a 45 72 72 20 3d 20 22 63 69 72 63 75 6c 61  >zErr = "circula
20ba0 72 20 72 65 66 65 72 65 6e 63 65 3a 20 25 73 22  r reference: %s"
20bb0 3b 0a 20 20 20 20 70 53 61 76 65 64 57 69 74 68  ;.    pSavedWith
20bc0 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68   = pParse->pWith
20bd0 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
20be0 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20  ith = pWith;.   
20bf0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
20c00 63 74 28 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79  ct(pWalker, bMay
20c10 52 65 63 75 72 73 69 76 65 20 3f 20 70 53 65 6c  Recursive ? pSel
20c20 2d 3e 70 50 72 69 6f 72 20 3a 20 70 53 65 6c 29  ->pPrior : pSel)
20c30 3b 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74  ;..    for(pLeft
20c40 3d 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50  =pSel; pLeft->pP
20c50 72 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66  rior; pLeft=pLef
20c60 74 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20  t->pPrior);.    
20c70 70 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e  pEList = pLeft->
20c80 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
20c90 70 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20  pCte->pCols ){. 
20ca0 20 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d       if( pEList-
20cb0 3e 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43  >nExpr!=pCte->pC
20cc0 6f 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ols->nExpr ){.  
20cd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
20ce0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
20cf0 61 62 6c 65 20 25 73 20 68 61 73 20 25 64 20 76  able %s has %d v
20d00 61 6c 75 65 73 20 66 6f 72 20 25 64 20 63 6f 6c  alues for %d col
20d10 75 6d 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  umns",.         
20d20 20 20 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20     pCte->zName, 
20d30 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  pEList->nExpr, p
20d40 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70  Cte->pCols->nExp
20d50 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  r.        );.   
20d60 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69       pParse->pWi
20d70 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b  th = pSavedWith;
20d80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
20d90 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
20da0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69      }.      pELi
20db0 73 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73  st = pCte->pCols
20dc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c  ;.    }..    sel
20dd0 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78  ectColumnsFromEx
20de0 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
20df0 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43  EList, &pTab->nC
20e00 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29  ol, &pTab->aCol)
20e10 3b 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65  ;.    if( bMayRe
20e20 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20  cursive ){.     
20e30 20 69 66 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c   if( pSel->selFl
20e40 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
20e50 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  ve ){.        pC
20e60 74 65 2d 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74  te->zErr = "mult
20e70 69 70 6c 65 20 72 65 63 75 72 73 69 76 65 20 72  iple recursive r
20e80 65 66 65 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a  eferences: %s";.
20e90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20ea0 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20       pCte->zErr 
20eb0 3d 20 22 72 65 63 75 72 73 69 76 65 20 72 65 66  = "recursive ref
20ec0 65 72 65 6e 63 65 20 69 6e 20 61 20 73 75 62 71  erence in a subq
20ed0 75 65 72 79 3a 20 25 73 22 3b 0a 20 20 20 20 20  uery: %s";.     
20ee0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
20ef0 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
20f00 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
20f10 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20  .    pCte->zErr 
20f20 3d 20 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  = 0;.    pParse-
20f30 3e 70 57 69 74 68 20 3d 20 70 53 61 76 65 64 57  >pWith = pSavedW
20f40 69 74 68 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ith;.  }..  retu
20f50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
20f60 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
20f70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
20f80 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 45 4c  /*.** If the SEL
20f90 45 43 54 20 70 61 73 73 65 64 20 61 73 20 74 68  ECT passed as th
20fa0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
20fb0 74 20 68 61 73 20 61 6e 20 61 73 73 6f 63 69 61  t has an associa
20fc0 74 65 64 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61  ted WITH .** cla
20fd0 75 73 65 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d  use, pop it from
20fe0 20 74 68 65 20 73 74 61 63 6b 20 73 74 6f 72 65   the stack store
20ff0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
21000 20 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a   Parse object..*
21010 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21020 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 74 68  on is used as th
21030 65 20 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  e xSelectCallbac
21040 6b 32 28 29 20 63 61 6c 6c 62 61 63 6b 20 62 79  k2() callback by
21050 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
21060 74 45 78 70 61 6e 64 28 29 20 77 68 65 6e 20 77  tExpand() when w
21070 61 6c 6b 69 6e 67 20 61 20 53 45 4c 45 43 54 20  alking a SELECT 
21080 74 72 65 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  tree to resolve 
21090 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61  table.** names a
210a0 6e 64 20 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c  nd other FROM cl
210b0 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a  ause elements. .
210c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
210d0 65 6c 65 63 74 50 6f 70 57 69 74 68 28 57 61 6c  electPopWith(Wal
210e0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
210f0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
21100 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
21110 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
21120 66 28 20 70 2d 3e 70 57 69 74 68 20 29 7b 0a 20  f( p->pWith ){. 
21130 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
21140 65 2d 3e 70 57 69 74 68 3d 3d 70 2d 3e 70 57 69  e->pWith==p->pWi
21150 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65  th );.    pParse
21160 2d 3e 70 57 69 74 68 20 3d 20 70 2d 3e 70 57 69  ->pWith = p->pWi
21170 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a  th->pOuter;.  }.
21180 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
21190 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a  selectPopWith 0.
211a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
211b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
211c0 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  Walker callback 
211d0 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20  for "expanding" 
211e0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
211f0 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e  nt..** "Expandin
21200 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74  g" means to do t
21210 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
21220 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
21230 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
21240 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
21250 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
21260 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
21270 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
21280 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
21290 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
212a0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
212b0 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
212c0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
212d0 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
212e0 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
212f0 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
21300 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
21310 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
21320 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
21330 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
21340 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
21350 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
21360 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
21370 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
21380 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
21390 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
213a0 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
213b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
213c0 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
213d0 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
213e0 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
213f0 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
21400 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
21410 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
21420 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65  ssing up the pre
21430 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
21440 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
21450 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
21460 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
21470 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
21480 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
21490 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  comodate the NAT
214a0 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
214b0 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
214c0 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
214d0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
214e0 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
214f0 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
21500 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
21510 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
21520 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
21530 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
21540 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
21550 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
21560 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
21570 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
21580 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
21590 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
215a0 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
215b0 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
215c0 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
215d0 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
215e0 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
215f0 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
21600 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  nt selectExpande
21610 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
21620 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
21630 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
21640 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
21650 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
21660 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
21670 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
21680 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
21690 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
216a0 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
216b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
216c0 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20  db;.  Expr *pE, 
216d0 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b  *pRight, *pExpr;
216e0 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20  .  u16 selFlags 
216f0 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a  = p->selFlags;..
21700 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
21710 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
21720 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
21730 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
21740 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
21750 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70   }.  if( NEVER(p
21760 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73  ->pSrc==0) || (s
21770 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70  elFlags & SF_Exp
21780 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  anded)!=0 ){.   
21790 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
217a0 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73  e;.  }.  pTabLis
217b0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
217c0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
217d0 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68  t;.  sqlite3With
217e0 50 75 73 68 28 70 50 61 72 73 65 2c 20 70 2d 3e  Push(pParse, p->
217f0 70 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a  pWith, 0);..  /*
21800 20 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f   Make sure curso
21810 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
21820 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
21830 61 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20  all entries in. 
21840 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   ** the FROM cla
21850 75 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43  use of the SELEC
21860 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  T statement..  *
21870 2f 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  /.  sqlite3SrcLi
21880 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28  stAssignCursors(
21890 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74  pParse, pTabList
218a0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70  );..  /* Look up
218b0 20 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d   every table nam
218c0 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
218d0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c  lause of the sel
218e0 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e  ect.  If.  ** an
218f0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52   entry of the FR
21900 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73  OM clause is a s
21910 75 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20  ubquery instead 
21920 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
21930 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72  ew,.  ** then cr
21940 65 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74  eate a transient
21950 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
21960 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65   to describe the
21970 20 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a   subquery..  */.
21980 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
21990 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
219a0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
219b0 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
219c0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
219d0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f      assert( pFro
219e0 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d  m->isRecursive==
219f0 30 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62  0 || pFrom->pTab
21a00 20 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f   );.    if( pFro
21a10 6d 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29  m->isRecursive )
21a20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
21a30 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d  f( pFrom->pTab!=
21a40 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
21a50 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73  is statement has
21a60 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72   already been pr
21a70 65 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69  epared.  There i
21a80 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20  s no need.      
21a90 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72  ** to go further
21aa0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
21ab0 74 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  t( i==0 );.#ifnd
21ac0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
21ad0 54 45 0a 20 20 20 20 20 20 73 65 6c 65 63 74 50  TE.      selectP
21ae0 6f 70 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20  opWith(pWalker, 
21af0 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  p);.#endif.     
21b00 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
21b10 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  e;.    }.#ifndef
21b20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
21b30 0a 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70  .    if( withExp
21b40 61 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  and(pWalker, pFr
21b50 6f 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  om) ) return WRC
21b60 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20  _Abort;.    if( 
21b70 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d  pFrom->pTab ) {}
21b80 20 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20   else.#endif.   
21b90 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d   if( pFrom->zNam
21ba0 65 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  e==0 ){.#ifndef 
21bb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
21bc0 55 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63  UERY.      Selec
21bd0 74 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d  t *pSel = pFrom-
21be0 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
21bf0 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
21c00 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
21c10 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
21c20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21c30 53 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sel!=0 );.      
21c40 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
21c50 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Tab==0 );.      
21c60 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
21c70 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29  t(pWalker, pSel)
21c80 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
21c90 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
21ca0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
21cb0 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c  (db, sizeof(Tabl
21cc0 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e));.      if( p
21cd0 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Tab==0 ) return 
21ce0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
21cf0 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
21d00 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  .      pTab->zNa
21d10 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
21d20 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
21d30 73 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70  sq_%p", (void*)p
21d40 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  Tab);.      whil
21d50 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20  e( pSel->pPrior 
21d60 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e  ){ pSel = pSel->
21d70 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20  pPrior; }.      
21d80 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f  selectColumnsFro
21d90 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
21da0 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20  , pSel->pEList, 
21db0 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54  &pTab->nCol, &pT
21dc0 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20  ab->aCol);.     
21dd0 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
21de0 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  1;.      pTab->n
21df0 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37 36  RowEst = 1048576
21e00 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61  ;.      pTab->ta
21e10 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68  bFlags |= TF_Eph
21e20 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20  emeral;.#endif. 
21e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21e40 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74  /* An ordinary t
21e50 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d  able or view nam
21e60 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
21e70 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  ause */.      as
21e80 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
21e90 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46  b==0 );.      pF
21ea0 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
21eb0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
21ec0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
21ed0 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20  , 0, pFrom);.   
21ee0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
21ef0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
21f00 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  t;.      if( pTa
21f10 62 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20  b->nRef==0xffff 
21f20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
21f30 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
21f40 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66  e, "too many ref
21f50 65 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c  erences to \"%s\
21f60 22 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20  ": max 65535",. 
21f70 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
21f80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
21f90 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  pFrom->pTab = 0;
21fa0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21fb0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
21fc0 20 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e   }.      pTab->n
21fd0 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69  Ref++;.#if !defi
21fe0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21ff0 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
22000 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  d (SQLITE_OMIT_V
22010 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
22020 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65     if( pTab->pSe
22030 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61  lect || IsVirtua
22040 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
22050 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68     /* We reach h
22060 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ere if the named
22070 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c   table is a real
22080 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20  ly a view */.   
22090 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
220a0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
220b0 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
220c0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
220d0 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ort;.        ass
220e0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
220f0 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
22100 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
22110 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
22120 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  Dup(db, pTab->pS
22130 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20  elect, 0);.     
22140 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
22150 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46  lect(pWalker, pF
22160 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  rom->pSelect);. 
22170 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
22180 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61    }..    /* Loca
22190 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  te the index nam
221a0 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45  ed by the INDEXE
221b0 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20  D BY clause, if 
221c0 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  any. */.    if( 
221d0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
221e0 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70  Lookup(pParse, p
221f0 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72  From) ){.      r
22200 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
22210 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
22220 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c   Process NATURAL
22230 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f   keywords, and O
22240 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
22250 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20  ses of joins..  
22260 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  */.  if( db->mal
22270 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c  locFailed || sql
22280 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70  iteProcessJoin(p
22290 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20  Parse, p) ){.   
222a0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
222b0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72  t;.  }..  /* For
222c0 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20   every "*" that 
222d0 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f  occurs in the co
222e0 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72  lumn list, inser
222f0 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20  t the names of. 
22300 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   ** all columns 
22310 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20  in all tables.  
22320 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41  And for every TA
22330 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65  BLE.* insert the
22340 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
22350 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41  ll columns in TA
22360 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72  BLE.  The parser
22370 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63   inserted a spec
22380 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ial expression. 
22390 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f   ** with the TK_
223a0 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  ALL operator for
223b0 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69   each "*" that i
223c0 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63  t found in the c
223d0 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a  olumn list..  **
223e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
223f0 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20  ode just has to 
22400 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c  locate the TK_AL
22410 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e  L expressions an
22420 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61  d expand.  ** ea
22430 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69  ch one to the li
22440 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e  st of all column
22450 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e  s in all tables.
22460 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
22470 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63  irst loop just c
22480 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
22490 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a  there are any "*
224a0 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a  " operators.  **
224b0 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e   that need expan
224c0 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ding..  */.  for
224d0 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e  (k=0; k<pEList->
224e0 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20  nExpr; k++){.   
224f0 20 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   pE = pEList->a[
22500 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  k].pExpr;.    if
22510 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ( pE->op==TK_ALL
22520 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73   ) break;.    as
22530 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b  sert( pE->op!=TK
22540 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67  _DOT || pE->pRig
22550 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ht!=0 );.    ass
22560 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
22570 44 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66  DOT || (pE->pLef
22580 74 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66  t!=0 && pE->pLef
22590 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b  t->op==TK_ID) );
225a0 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
225b0 3d 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70  =TK_DOT && pE->p
225c0 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c  Right->op==TK_AL
225d0 4c 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  L ) break;.  }. 
225e0 20 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e   if( k<pEList->n
225f0 45 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  Expr ){.    /*. 
22600 20 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20     ** If we get 
22610 68 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68  here it means th
22620 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e  e result set con
22630 74 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72  tains one or mor
22640 65 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65  e "*".    ** ope
22650 72 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  rators that need
22660 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e   to be expanded.
22670 20 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65    Loop through e
22680 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  ach expression. 
22690 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
226a0 75 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61  ult set and expa
226b0 6e 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f  nd them one by o
226c0 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ne..    */.    s
226d0 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
226e0 74 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d  tem *a = pEList-
226f0 3e 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  >a;.    ExprList
22700 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20   *pNew = 0;.    
22710 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72  int flags = pPar
22720 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  se->db->flags;. 
22730 20 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73     int longNames
22740 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
22750 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29  TE_FullColNames)
22760 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
22770 20 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c            && (fl
22780 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f  ags & SQLITE_Sho
22790 72 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a  rtColNames)==0;.
227a0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f  .    /* When pro
227b0 63 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61  cessing FROM-cla
227c0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2c 20  use subqueries, 
227d0 69 74 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  it is always the
227e0 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 74 68 61   case.    ** tha
227f0 74 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61  t full_column_na
22800 6d 65 73 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72  mes=OFF and shor
22810 74 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f  t_column_names=O
22820 4e 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 73  N.  The.    ** s
22830 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
22840 66 53 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e  fSelect() routin
22850 65 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a  e makes it so. *
22860 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
22870 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22880 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20  NestedFrom)==0. 
22890 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c           || ((fl
228a0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
228b0 6c 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26  lColNames)==0 &&
228c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
228d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
228e0 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
228f0 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d  ) );..    for(k=
22900 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; k<pEList->nEx
22910 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; k++){.      
22920 70 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b  pE = a[k].pExpr;
22930 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
22940 70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pE->pRight;.    
22950 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
22960 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67  !=TK_DOT || pRig
22970 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ht!=0 );.      i
22980 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  f( pE->op!=TK_AL
22990 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b  L && (pE->op!=TK
229a0 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e  _DOT || pRight->
229b0 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20  op!=TK_ALL) ){. 
229c0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70         /* This p
229d0 61 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73  articular expres
229e0 73 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  sion does not ne
229f0 65 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65  ed to be expande
22a00 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
22a10 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
22a20 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
22a30 6e 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c  nd(pParse, pNew,
22a40 20 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20   a[k].pExpr);.  
22a50 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
22a60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
22a70 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
22a80 31 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e  1].zName = a[k].
22a90 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
22aa0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
22ab0 45 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20  Expr-1].zSpan = 
22ac0 61 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20  a[k].zSpan;.    
22ad0 20 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65        a[k].zName
22ae0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22af0 61 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a  a[k].zSpan = 0;.
22b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22b10 20 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30    a[k].pExpr = 0
22b20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
22b30 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65         /* This e
22b40 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22  xpression is a "
22b50 2a 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a  *" or a "TABLE.*
22b60 22 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62  " and needs to b
22b70 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70  e.        ** exp
22b80 61 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  anded. */.      
22b90 20 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20    int tableSeen 
22ba0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74  = 0;      /* Set
22bb0 20 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45   to 1 when TABLE
22bc0 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
22bd0 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65      char *zTName
22be0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74   = 0;       /* t
22bf0 65 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54  ext of name of T
22c00 41 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  ABLE */.        
22c10 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
22c20 4f 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OT ){.          
22c30 61 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66  assert( pE->pLef
22c40 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
22c50 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
22c60 61 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70  asProperty(pE->p
22c70 4c 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Left, EP_IntValu
22c80 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
22c90 7a 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65  zTName = pE->pLe
22ca0 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
22cb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22cc0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
22cd0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
22ce0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
22cf0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
22d00 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
22d10 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
22d20 3b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  ;.          Sele
22d30 63 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d  ct *pSub = pFrom
22d40 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
22d50 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
22d60 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c  ame = pFrom->zAl
22d70 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ias;.          c
22d80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65  onst char *zSche
22d90 6d 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  maName = 0;.    
22da0 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
22db0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61           if( zTa
22dc0 62 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  bName==0 ){.    
22dd0 20 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65          zTabName
22de0 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
22df0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22e00 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61        if( db->ma
22e10 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
22e20 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ak;.          if
22e30 28 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53  ( pSub==0 || (pS
22e40 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ub->selFlags & S
22e50 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30  F_NestedFrom)==0
22e60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22e70 70 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pSub = 0;.      
22e80 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
22e90 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
22ea0 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
22eb0 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
22ec0 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
22ed0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
22ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62  .            iDb
22ef0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
22f00 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
22f10 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
22f20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e          zSchemaN
22f30 61 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64  ame = iDb>=0 ? d
22f40 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
22f50 65 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20  e : "*";.       
22f60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
22f70 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e  or(j=0; j<pTab->
22f80 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
22f90 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e          char *zN
22fa0 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ame = pTab->aCol
22fb0 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
22fc0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
22fd0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63  lname;  /* The c
22fe0 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e  omputed column n
22ff0 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ame */.         
23000 20 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65     char *zToFree
23010 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20  ;   /* Malloced 
23020 73 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64  string that need
23030 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f  s to be freed */
23040 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b  .            Tok
23050 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a  en sColname;  /*
23060 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e   Computed column
23070 20 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e   name as a token
23080 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20   */..           
23090 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29   assert( zName )
230a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
230b0 28 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62  ( zTName && pSub
230c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
230d0 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
230e0 6e 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69  nName(pSub->pELi
230f0 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
23100 30 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30  0, zTName, 0)==0
23110 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
23130 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
23140 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
23150 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d     /* If a colum
23160 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27  n is marked as '
23170 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74  hidden' (current
23180 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  ly only possible
23190 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
231a0 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c  for virtual tabl
231b0 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c  es), do not incl
231c0 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78  ude it in the ex
231d0 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20  panded.         
231e0 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74     ** result-set
231f0 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20   list..         
23200 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
23210 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f    if( IsHiddenCo
23220 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c  lumn(&pTab->aCol
23230 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [j]) ){.        
23240 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56        assert(IsV
23250 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20  irtual(pTab));. 
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
23270 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
23280 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23290 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a   tableSeen = 1;.
232a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
232b0 20 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d   i>0 && zTName==
232c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
232d0 20 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a     if( (pFrom->j
232e0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
232f0 55 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20  URAL)!=0.       
23300 20 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c           && tabl
23310 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
23320 70 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61  pTabList, i, zNa
23330 6d 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20  me, 0, 0).      
23340 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
23350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23360 20 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c   a NATURAL join,
23370 20 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63   omit the join c
23380 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20  olumns from the 
23390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
233a0 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65   ** table to the
233b0 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f   right of the jo
233c0 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  in */.          
233d0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
23400 28 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  ( sqlite3IdListI
23410 6e 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69  ndex(pFrom->pUsi
23420 6e 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b  ng, zName)>=0 ){
23430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23440 20 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69   /* In a join wi
23450 74 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73  th a USING claus
23460 65 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20  e, omit columns 
23470 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
23480 20 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20         ** using 
23490 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
234a0 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67  table on the rig
234b0 68 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ht. */.         
234c0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
234d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
234e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
234f0 20 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68             pRigh
23500 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
23510 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65  db, TK_ID, zName
23520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  );.            z
23530 43 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  Colname = zName;
23540 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
23550 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Free = 0;.      
23560 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
23570 6d 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d  mes || pTabList-
23580 3e 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20  >nSrc>1 ){.     
23590 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
235a0 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
235b0 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
235c0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
235d0 44 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20  D, zTabName);.  
235e0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
235f0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
23600 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
23610 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
23620 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
23630 20 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d    if( zSchemaNam
23640 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
23650 20 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c       pLeft = sql
23660 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f  ite3Expr(db, TK_
23670 49 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29  ID, zSchemaName)
23680 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23690 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
236a0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
236b0 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45  K_DOT, pLeft, pE
236c0 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  xpr, 0);.       
236d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
236e0 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e         if( longN
236f0 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
23700 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65          zColname
23710 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
23720 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a  f(db, "%s.%s", z
23730 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b  TabName, zName);
23740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23750 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e   zToFree = zColn
23760 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
23770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
23780 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23790 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52        pExpr = pR
237a0 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
237b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
237c0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
237d0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
237e0 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72  rse, pNew, pExpr
237f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
23800 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c  Colname.z = zCol
23810 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
23820 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73    sColname.n = s
23830 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
23840 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  Colname);.      
23850 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
23860 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
23870 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c  rse, pNew, &sCol
23880 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
23890 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26        if( pNew &
238a0 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
238b0 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
238c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
238d0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
238e0 69 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26  ist_item *pX = &
238f0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
23900 78 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  xpr-1];.        
23910 20 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29        if( pSub )
23920 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23930 20 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71    pX->zSpan = sq
23940 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
23950 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e  , pSub->pEList->
23960 61 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20  a[j].zSpan);.   
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
23980 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e  tcase( pX->zSpan
23990 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
239a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
239b0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
239c0 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d  zSpan = sqlite3M
239d0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
239e0 73 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  s.%s",.         
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a10 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a    zSchemaName, z
23a20 54 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d  TabName, zColnam
23a30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
23a40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58      testcase( pX
23a50 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20  ->zSpan==0 );.  
23a60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23a70 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
23a80 62 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a  bSpanIsTab = 1;.
23a90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23aa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23ab0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46  3DbFree(db, zToF
23ac0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
23ad0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
23ae0 20 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65      if( !tableSe
23af0 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  en ){.          
23b00 69 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20  if( zTName ){.  
23b10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23b20 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
23b30 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
23b40 3a 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a  : %s", zTName);.
23b50 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
23b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
23b70 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23b80 72 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20  rse, "no tables 
23b90 73 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20  specified");.   
23ba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23bb0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
23bc0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
23bd0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
23be0 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70  EList);.    p->p
23bf0 45 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20  EList = pNew;.  
23c00 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
23c10 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
23c20 3e 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45  >pEList && p->pE
23c30 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  List->nExpr>db->
23c40 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
23c50 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
23c60 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
23c70 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
23c80 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  many columns in 
23c90 72 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20  result set");.  
23ca0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
23cb0 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72  }../*.** No-op r
23cd0 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70  outine for the p
23ce0 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72  arse-tree walker
23cf0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
23d00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
23d10 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
23d20 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65  lback then expre
23d30 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61  ssion trees.** a
23d40 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75  re walked withou
23d50 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65  t any actions be
23d60 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63  ing taken at eac
23d70 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61  h node.  Presuma
23d80 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69  bly,.** when thi
23d90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
23da0 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78  d for Walker.xEx
23db0 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20  prCallback then 
23dc0 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  .** Walker.xSele
23dd0 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65  ctCallback is se
23de0 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e  t to do somethin
23df0 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65  g useful for eve
23e00 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ry .** subquery 
23e10 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72  in the parser tr
23e20 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
23e30 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57  t exprWalkNoop(W
23e40 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20  alker *NotUsed, 
23e50 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b  Expr *NotUsed2){
23e60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
23e70 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
23e80 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
23e90 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
23ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
23eb0 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20  utine "expands" 
23ec0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
23ed0 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  nt and all of it
23ee0 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  s subqueries..**
23ef0 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   For additional 
23f00 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77  information on w
23f10 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20  hat it means to 
23f20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43  "expand" a SELEC
23f30 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20  T.** statement, 
23f40 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  see the comment 
23f50 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  on the selectExp
23f60 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62  and worker callb
23f70 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  ack above..**.**
23f80 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c   Expanding a SEL
23f90 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
23fa0 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20   the first step 
23fb0 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a  in processing a.
23fc0 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
23fd0 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54  ent.  The SELECT
23fe0 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20   statement must 
23ff0 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f  be expanded befo
24000 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  re.** name resol
24010 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d  ution is perform
24020 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  ed..**.** If any
24030 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
24040 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
24050 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
24060 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68  to pParse..** Th
24070 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
24080 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68  on can detect th
24090 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f  e problem by loo
240a0 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e  king at pParse->
240b0 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70  nErr.** and/or p
240c0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
240d0 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  cFailed..*/.stat
240e0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
240f0 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73  electExpand(Pars
24100 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
24110 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57  t *pSelect){.  W
24120 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65  alker w;.  memse
24130 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
24140 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
24150 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
24160 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
24170 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66  e = pParse;.  if
24180 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d  ( pParse->hasCom
24190 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78  pound ){.    w.x
241a0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
241b0 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
241c0 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
241d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
241e0 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c  kSelect(&w, pSel
241f0 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53  ect);.  }.  w.xS
24200 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
24210 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a  selectExpander;.
24220 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
24230 61 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70  ack2 = selectPop
24240 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57  With;.  sqlite3W
24250 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53  alkSelect(&w, pS
24260 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e  elect);.}...#ifn
24270 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24280 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54  SUBQUERY./*.** T
24290 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e  his is a Walker.
242a0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
242b0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
242c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79   sqlite3SelectTy
242d0 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65  peInfo().** inte
242e0 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  rface..**.** For
242f0 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73   each FROM-claus
24300 65 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20  e subquery, add 
24310 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64  Column.zType and
24320 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a   Column.zColl.**
24330 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
24340 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
24350 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
24360 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
24370 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75  et.** of that su
24380 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  bquery..**.** Th
24390 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
243a0 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  e that represent
243b0 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
243c0 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64   was constructed
243d0 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70  .** by selectExp
243e0 61 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20  ander() but the 
243f0 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
24400 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  on information w
24410 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74  as omitted.** at
24420 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61   that point beca
24430 75 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20  use identifiers 
24440 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  had not yet been
24450 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73   resolved.  This
24460 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
24470 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e  alled after iden
24480 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f  tifier resolutio
24490 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
244a0 64 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75  d selectAddSubqu
244b0 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b  eryTypeInfo(Walk
244c0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
244d0 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65  ect *p){.  Parse
244e0 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20   *pParse;.  int 
244f0 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  i;.  SrcList *pT
24500 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  abList;.  struct
24510 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24520 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  From;..  assert(
24530 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
24540 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  F_Resolved );.  
24550 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
24560 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66   & SF_HasTypeInf
24570 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  o)==0 ){.    p->
24580 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48  selFlags |= SF_H
24590 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20  asTypeInfo;.    
245a0 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
245b0 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54  ->pParse;.    pT
245c0 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
245d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
245e0 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61  From=pTabList->a
245f0 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; i<pTabList->nS
24600 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b  rc; i++, pFrom++
24610 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
24620 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54  pTab = pFrom->pT
24630 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ab;.      if( AL
24640 57 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26  WAYS(pTab!=0) &&
24650 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
24660 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
24670 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
24680 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
24690 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
246a0 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
246b0 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
246c0 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53  pSel = pFrom->pS
246d0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 69  elect;.        i
246e0 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20  f( pSel ){.     
246f0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c       while( pSel
24700 2d 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20  ->pPrior ) pSel 
24710 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a  = pSel->pPrior;.
24720 20 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74            select
24730 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64  AddColumnTypeAnd
24740 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65  Collation(pParse
24750 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20  , pTab, pSel);. 
24760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24770 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
24780 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
24790 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61   routine adds da
247a0 74 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  tatype and colla
247b0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e  ting sequence in
247c0 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20  formation to.** 
247d0 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
247e0 75 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d  ures of all FROM
247f0 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
24800 65 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43  es in a.** SELEC
24810 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  T statement..**.
24820 2a 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74  ** Use this rout
24830 69 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72  ine after name r
24840 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  esolution..*/.st
24850 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
24860 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
24870 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
24880 2c 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63  , Select *pSelec
24890 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
248a0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
248b0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
248c0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
248d0 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65  eof(w));.  w.xSe
248e0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
248f0 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
24900 79 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78  yTypeInfo;.  w.x
24910 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65  ExprCallback = e
24920 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77  xprWalkNoop;.  w
24930 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
24940 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
24950 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63  elect(&w, pSelec
24960 74 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  t);.#endif.}.../
24970 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24980 65 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45  e sets up a SELE
24990 43 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  CT statement for
249a0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68   processing.  Th
249b0 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  e.** following i
249c0 73 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a  s accomplished:.
249d0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42  **.**     *  VDB
249e0 45 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E Cursor numbers
249f0 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f   are assigned to
24a00 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65   all FROM-clause
24a10 20 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a   terms..**     *
24a20 20 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c    Ephemeral Tabl
24a30 65 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72  e objects are cr
24a40 65 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52  eated for all FR
24a50 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65  OM-clause subque
24a60 72 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  ries..**     *  
24a70 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
24a80 75 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64  uses are shifted
24a90 20 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74   into WHERE stat
24aa0 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20  ements.**     * 
24ab0 20 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61   Wildcards "*" a
24ac0 6e 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20  nd "TABLE.*" in 
24ad0 72 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20  result sets are 
24ae0 65 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20  expanded..**    
24af0 20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20   *  Identifiers 
24b00 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72  in expression ar
24b10 65 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62  e matched to tab
24b20 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  les..**.** This 
24b30 72 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63  routine acts rec
24b40 75 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20  ursively on all 
24b50 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69  subqueries withi
24b60 6e 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f  n the SELECT..*/
24b70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
24b80 65 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65  ectPrep(.  Parse
24b90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
24ba0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
24bb0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
24bc0 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
24bd0 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
24be0 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
24bf0 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61  g coded. */.  Na
24c00 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
24c10 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  rNC  /* Name con
24c20 74 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e  text for contain
24c30 65 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  er */.){.  sqlit
24c40 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45  e3 *db;.  if( NE
24c50 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
24c60 72 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  rn;.  db = pPars
24c70 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
24c80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
24c90 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
24ca0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48  >selFlags & SF_H
24cb0 61 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74  asTypeInfo ) ret
24cc0 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
24cd0 6c 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73  lectExpand(pPars
24ce0 65 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61  e, p);.  if( pPa
24cf0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
24d00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
24d10 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
24d20 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
24d30 6d 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70  mes(pParse, p, p
24d40 4f 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20  OuterNC);.  if( 
24d50 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
24d60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
24d70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
24d80 69 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70  ite3SelectAddTyp
24d90 65 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29  eInfo(pParse, p)
24da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  ;.}../*.** Reset
24db0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61   the aggregate a
24dc0 63 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a  ccumulator..**.*
24dd0 2a 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20  * The aggregate 
24de0 61 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61  accumulator is a
24df0 20 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63   set of memory c
24e00 65 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a  ells that hold.*
24e10 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72  * intermediate r
24e20 65 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c  esults while cal
24e30 63 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72  culating an aggr
24e40 65 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20  egate.  This.** 
24e50 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
24e60 73 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72  s code that stor
24e70 65 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20  es NULLs in all 
24e80 6f 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a  of those memory.
24e90 2a 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ** cells..*/.sta
24ea0 74 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63  tic void resetAc
24eb0 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20  cumulator(Parse 
24ec0 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
24ed0 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
24ee0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
24ef0 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
24f00 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
24f10 6f 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20  o_func *pFunc;. 
24f20 20 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67   int nReg = pAgg
24f30 49 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41  Info->nFunc + pA
24f40 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ggInfo->nColumn;
24f50 0a 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29  .  if( nReg==0 )
24f60 20 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20   return;.#ifdef 
24f70 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
24f80 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c  * Verify that al
24f90 6c 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74  l AggInfo regist
24fa0 65 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74  ers are within t
24fb0 68 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69  he range specifi
24fc0 65 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e  ed by.  ** AggIn
24fd0 66 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66  fo.mnReg..AggInf
24fe0 6f 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73  o.mxReg */.  ass
24ff0 65 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49  ert( nReg==pAggI
25000 6e 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49  nfo->mxReg-pAggI
25010 6e 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a  nfo->mnReg+1 );.
25020 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
25030 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  gInfo->nColumn; 
25040 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
25050 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  ( pAggInfo->aCol
25060 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e  [i].iMem>=pAggIn
25070 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20  fo->mnReg.      
25080 20 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e     && pAggInfo->
25090 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41  aCol[i].iMem<=pA
250a0 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b  ggInfo->mxReg );
250b0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
250c0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
250d0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  c; i++){.    ass
250e0 65 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61  ert( pAggInfo->a
250f0 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41  Func[i].iMem>=pA
25100 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20  ggInfo->mnReg.  
25110 20 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e         && pAggIn
25120 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65  fo->aFunc[i].iMe
25130 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  m<=pAggInfo->mxR
25140 65 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  eg );.  }.#endif
25150 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
25160 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
25170 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e   0, pAggInfo->mn
25180 52 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg, pAggInfo->m
25190 78 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75  xReg);.  for(pFu
251a0 6e 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75  nc=pAggInfo->aFu
251b0 6e 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49  nc, i=0; i<pAggI
251c0 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
251d0 20 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69   pFunc++){.    i
251e0 66 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  f( pFunc->iDisti
251f0 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  nct>=0 ){.      
25200 45 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63  Expr *pE = pFunc
25210 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
25220 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
25230 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78  roperty(pE, EP_x
25240 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
25250 20 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69     if( pE->x.pLi
25260 73 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70  st==0 || pE->x.p
25270 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29  List->nExpr!=1 )
25280 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
25290 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
252a0 2c 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72  , "DISTINCT aggr
252b0 65 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65  egates must have
252c0 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20   exactly one ". 
252d0 20 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d            "argum
252e0 65 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70  ent");.        p
252f0 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20  Func->iDistinct 
25300 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
25310 65 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e  e{.        KeyIn
25320 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b  fo *pKeyInfo = k
25330 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
25340 73 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78  st(pParse, pE->x
25350 2e 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20  .pList, 0);.    
25360 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25370 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
25380 45 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63  Ephemeral, pFunc
25390 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20  ->iDistinct, 0, 
253a0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
253c0 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  ar*)pKeyInfo, P4
253d0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
253e0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
253f0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
25400 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20   OP_AggFinalize 
25410 6f 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79  opcode for every
25420 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
25430 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67  ion.** in the Ag
25440 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  gInfo structure.
25450 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25460 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74  finalizeAggFunct
25470 69 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72  ions(Parse *pPar
25480 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
25490 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
254a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
254b0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
254c0 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
254d0 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30  c *pF;.  for(i=0
254e0 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
254f0 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
25500 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
25510 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  ++){.    ExprLis
25520 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70  t *pList = pF->p
25530 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
25540 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
25550 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e  HasProperty(pF->
25560 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
25570 65 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ect) );.    sqli
25580 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
25590 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46   OP_AggFinal, pF
255a0 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20  ->iMem, pList ? 
255b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
255c0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
255d0 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
255e0 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f  *)pF->pFunc, P4_
255f0 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a  FUNCDEF);.  }.}.
25600 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68  ./*.** Update th
25610 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65  e accumulator me
25620 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61  mory cells for a
25630 6e 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65  n aggregate base
25640 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72  d on.** the curr
25650 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
25660 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
25670 6f 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75  oid updateAccumu
25680 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61  lator(Parse *pPa
25690 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41  rse, AggInfo *pA
256a0 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20  ggInfo){.  Vdbe 
256b0 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
256c0 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  be;.  int i;.  i
256d0 6e 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20  nt regHit = 0;. 
256e0 20 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74   int addrHitTest
256f0 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41   = 0;.  struct A
25700 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
25710 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
25720 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41  o_col *pC;..  pA
25730 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
25740 64 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  de = 1;.  for(i=
25750 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e  0, pF=pAggInfo->
25760 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66  aFunc; i<pAggInf
25770 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70  o->nFunc; i++, p
25780 46 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41  F++){.    int nA
25790 72 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72  rg;.    int addr
257a0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Next = 0;.    in
257b0 74 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78  t regAgg;.    Ex
257c0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
257d0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
257e0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
257f0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
25800 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
25810 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
25820 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
25830 20 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74      nArg = pList
25840 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72  ->nExpr;.      r
25850 65 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47  egAgg = sqlite3G
25860 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
25870 73 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20  se, nArg);.     
25880 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
25890 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
258a0 20 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20   pList, regAgg, 
258b0 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29  SQLITE_ECEL_DUP)
258c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
258d0 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20     nArg = 0;.   
258e0 20 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20     regAgg = 0;. 
258f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d     }.    if( pF-
25900 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b  >iDistinct>=0 ){
25910 0a 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20  .      addrNext 
25920 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
25930 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
25940 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31   assert( nArg==1
25950 20 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69   );.      codeDi
25960 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70  stinct(pParse, p
25970 46 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64  F->iDistinct, ad
25980 64 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67  drNext, 1, regAg
25990 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  g);.    }.    if
259a0 28 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e  ( pF->pFunc->fun
259b0 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
259c0 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b  FUNC_NEEDCOLL ){
259d0 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
259e0 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
259f0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
25a00 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
25a10 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
25a20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d   assert( pList!=
25a30 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d  0 );  /* pList!=
25a40 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68  0 if pF->pFunc h
25a50 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20  as NEEDCOLL */. 
25a60 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49       for(j=0, pI
25a70 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70  tem=pList->a; !p
25a80 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20  Coll && j<nArg; 
25a90 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
25aa0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
25ab0 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
25ac0 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  q(pParse, pItem-
25ad0 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  >pExpr);.      }
25ae0 0a 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c  .      if( !pCol
25af0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  l ){.        pCo
25b00 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
25b10 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
25b20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65    }.      if( re
25b30 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49  gHit==0 && pAggI
25b40 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f  nfo->nAccumulato
25b50 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70  r ) regHit = ++p
25b60 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
25b70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
25b80 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53  dOp4(v, OP_CollS
25b90 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30  eq, regHit, 0, 0
25ba0 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
25bb0 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
25bc0 20 20 7d 0a 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 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41  AggStep, 0, regA
25bf0 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20  gg, pF->iMem,.  
25c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c10 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70      (void*)pF->p
25c20 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46  Func, P4_FUNCDEF
25c30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
25c40 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75  beChangeP5(v, (u
25c50 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c  8)nArg);.    sql
25c60 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
25c70 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
25c80 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67  se, regAgg, nArg
25c90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
25ca0 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70  leaseTempRange(p
25cb0 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e  Parse, regAgg, n
25cc0 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64  Arg);.    if( ad
25cd0 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  drNext ){.      
25ce0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
25cf0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e  veLabel(v, addrN
25d00 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ext);.      sqli
25d10 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
25d20 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  r(pParse);.    }
25d30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  .  }..  /* Befor
25d40 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65  e populating the
25d50 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
25d60 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68  isters, clear th
25d70 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a  e column cache..
25d80 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
25d90 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65  if any of the re
25da0 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61  quired column va
25db0 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79  lues are already
25dc0 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69   present .  ** i
25dd0 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c  n registers, sql
25de0 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d  ite3ExprCode() m
25df0 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20  ay use OP_SCopy 
25e00 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75  to copy the valu
25e10 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d  e.  ** to pC->iM
25e20 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74  em. But by the t
25e30 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73  ime the value is
25e40 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69   used, the origi
25e50 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a  nal register.  *
25e60 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  * may have been 
25e70 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69  used, invalidati
25e80 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ng the underlyin
25e90 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67  g buffer holding
25ea0 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f   the.  ** text o
25eb0 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65  r blob value. Se
25ec0 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34  e ticket [883034
25ed0 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  dcb5]..  **.  **
25ee0 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f   Another solutio
25ef0 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68  n would be to ch
25f00 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70  ange the OP_SCop
25f10 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63  y used to copy c
25f20 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65  ached.  ** value
25f30 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e  s to an OP_Copy.
25f40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48  .  */.  if( regH
25f50 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69  it ){.    addrHi
25f60 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  tTest = sqlite3V
25f70 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
25f80 49 66 2c 20 72 65 67 48 69 74 29 3b 0a 20 20 7d  If, regHit);.  }
25f90 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
25fa0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
25fb0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d  ;.  for(i=0, pC=
25fc0 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20  pAggInfo->aCol; 
25fd0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63  i<pAggInfo->nAcc
25fe0 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70  umulator; i++, p
25ff0 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  C++){.    sqlite
26000 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
26010 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d  , pC->pExpr, pC-
26020 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41  >iMem);.  }.  pA
26030 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f  ggInfo->directMo
26040 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  de = 0;.  sqlite
26050 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
26060 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61  pParse);.  if( a
26070 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20  ddrHitTest ){.  
26080 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
26090 70 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74  pHere(v, addrHit
260a0 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Test);.  }.}../*
260b0 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65  .** Add a single
260c0 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
260d0 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56  ruction to the V
260e0 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61  DBE to explain a
260f0 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74   simple.** count
26100 28 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45  (*) query ("SELE
26110 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
26120 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e   pTab")..*/.#ifn
26130 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26140 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76  EXPLAIN.static v
26150 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c  oid explainSimpl
26160 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20  eCount(.  Parse 
26170 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
26180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
26190 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
261a0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20  Table *pTab,    
261b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
261c0 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71  /* Table being q
261d0 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ueried */.  Inde
261e0 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20  x *pIdx         
261f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
26200 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74  ndex used to opt
26210 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e  imize scan, or N
26220 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ULL */.){.  if( 
26230 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
26240 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =2 ){.    char *
26250 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50  zEqp = sqlite3MP
26260 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
26270 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73  , "SCAN TABLE %s
26280 25 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  %s%s",.        p
26290 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20  Tab->zName, .   
262a0 20 20 20 20 20 70 49 64 78 20 3f 20 22 20 55 53       pIdx ? " US
262b0 49 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44  ING COVERING IND
262c0 45 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20  EX " : "",.     
262d0 20 20 20 70 49 64 78 20 3f 20 70 49 64 78 2d 3e     pIdx ? pIdx->
262e0 7a 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29  zName : "".    )
262f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
26300 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20  eAddOp4(.       
26310 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20   pParse->pVdbe, 
26320 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72  OP_Explain, pPar
26330 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30  se->iSelectId, 0
26340 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59  , 0, zEqp, P4_DY
26350 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d  NAMIC.    );.  }
26360 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
26370 65 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43  e explainSimpleC
26380 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64  ount(a,b,c).#end
26390 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
263a0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
263b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
263c0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20   given in the p 
263d0 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a  argument.  .**.*
263e0 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72  * The results ar
263f0 65 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72  e returned accor
26400 64 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65  ding to the Sele
26410 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65  ctDest structure
26420 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ..** See comment
26430 73 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68  s in sqliteInt.h
26440 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66   for further inf
26450 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  ormation..**.** 
26460 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
26470 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
26480 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
26490 6e 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a  ny errors are.**
264a0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
264b0 65 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  en an appropriat
264c0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
264d0 69 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50  is left in.** pP
264e0 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
264f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26500 65 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20  e does NOT free 
26510 74 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63  the Select struc
26520 74 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20  ture passed in. 
26530 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
26540 66 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74  function needs t
26550 6f 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e  o do that..*/.in
26560 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  t sqlite3Select(
26570 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
26580 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
26590 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
265a0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
265b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
265c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
265d0 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
265e0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
265f0 20 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20   *pDest      /* 
26600 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
26610 74 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74  the query result
26620 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  s */.){.  int i,
26630 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
26640 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
26650 73 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  s */.  WhereInfo
26660 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a   *pWInfo;     /*
26670 20 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c   Return from sql
26680 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
26690 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
266a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
266b0 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
266c0 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
266d0 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  uction */.  int 
266e0 69 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20  isAgg;          
266f0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73     /* True for s
26700 65 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65  elect lists like
26710 20 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20   "count(*)" */. 
26720 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
26730 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
26740 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78  of columns to ex
26750 74 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c  tract. */.  SrcL
26760 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20  ist *pTabList;  
26770 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61     /* List of ta
26780 62 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66  bles to select f
26790 72 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  rom */.  Expr *p
267a0 57 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20  Where;          
267b0 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
267c0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
267d0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
267e0 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a  *pOrderBy;    /*
267f0 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
26800 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
26810 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  LL */.  ExprList
26820 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f   *pGroupBy;    /
26830 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63  * The GROUP BY c
26840 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e  lause.  May be N
26850 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
26860 48 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20  Having;         
26870 2f 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c  /* The HAVING cl
26880 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
26890 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  LL */.  int rc =
268a0 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   1;            /
268b0 2a 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72  * Value to retur
268c0 6e 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  n from this func
268d0 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
268e0 64 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20  drSortIndex;    
268f0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
26900 6e 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  n OP_OpenEphemer
26910 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  al instruction *
26920 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20  /.  DistinctCtx 
26930 73 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e  sDistinct; /* In
26940 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64  fo on how to cod
26950 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  e the DISTINCT k
26960 65 79 77 6f 72 64 20 2a 2f 0a 20 20 41 67 67 49  eyword */.  AggI
26970 6e 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20  nfo sAggInfo;   
26980 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
26990 6e 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67  n used by aggreg
269a0 61 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20  ate queries */. 
269b0 20 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20   int iEnd;      
269c0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
269d0 73 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66  ss of the end of
269e0 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20   the query */.  
269f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
26a00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
26a10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
26a20 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  n */..#ifndef SQ
26a30 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
26a40 4e 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65  N.  int iRestore
26a50 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73  SelectId = pPars
26a60 65 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20  e->iSelectId;.  
26a70 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
26a80 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  d = pParse->iNex
26a90 74 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e  tSelectId++;.#en
26aa0 64 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72  dif..  db = pPar
26ab0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d  se->db;.  if( p=
26ac0 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
26ad0 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
26ae0 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65  ->nErr ){.    re
26af0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66  turn 1;.  }.  if
26b00 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
26b10 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
26b20 45 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  E_SELECT, 0, 0, 
26b30 30 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  0) ) return 1;. 
26b40 20 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66   memset(&sAggInf
26b50 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67  o, 0, sizeof(sAg
26b60 67 49 6e 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20  gInfo));..  if( 
26b70 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
26b80 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61  (pDest) ){.    a
26b90 73 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65  ssert(pDest->eDe
26ba0 73 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c  st==SRT_Exists |
26bb0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
26bc0 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20  SRT_Union || .  
26bd0 20 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e           pDest->
26be0 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70  eDest==SRT_Excep
26bf0 74 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73  t || pDest->eDes
26c00 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b  t==SRT_Discard);
26c10 0a 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52  .    /* If ORDER
26c20 20 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66   BY makes no dif
26c30 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f  ference in the o
26c40 75 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68  utput then neith
26c50 65 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44  er does.    ** D
26c60 49 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61  ISTINCT so it ca
26c70 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f  n be removed too
26c80 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
26c90 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
26ca0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
26cb0 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  .    p->pOrderBy
26cc0 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c   = 0;.    p->sel
26cd0 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73  Flags &= ~SF_Dis
26ce0 74 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  tinct;.  }.  sql
26cf0 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
26d00 50 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20  Parse, p, 0);.  
26d10 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
26d20 72 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69  rderBy;.  pTabLi
26d30 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
26d40 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
26d50 73 74 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  st;.  if( pParse
26d60 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
26d70 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
26d80 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e    goto select_en
26d90 64 3b 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d  d;.  }.  isAgg =
26da0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
26db0 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
26dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
26dd0 73 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  st!=0 );..  /* B
26de0 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  egin generating 
26df0 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  code..  */.  v =
26e00 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
26e10 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
26e20 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63  ==0 ) goto selec
26e30 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20  t_end;..  /* If 
26e40 77 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72  writing to memor
26e50 79 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  y or generating 
26e60 61 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20  a set.  ** only 
26e70 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  a single column 
26e80 6d 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20  may be output.. 
26e90 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
26ea0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
26eb0 0a 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d  .  if( checkForM
26ec0 75 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74  ultiColumnSelect
26ed0 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44  Error(pParse, pD
26ee0 65 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  est, pEList->nEx
26ef0 70 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  pr) ){.    goto 
26f00 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
26f10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
26f20 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
26f30 6c 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69  ll sub-queries i
26f40 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
26f50 65 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  e.  */.#if !defi
26f60 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
26f70 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
26f80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
26f90 54 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d  T_VIEW).  for(i=
26fa0 30 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26  0; !p->pPrior &&
26fb0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
26fc0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
26fd0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
26fe0 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
26ff0 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53  ist->a[i];.    S
27000 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
27010 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
27020 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63   = pItem->pSelec
27030 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67  t;.    int isAgg
27040 53 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  Sub;..    if( pS
27050 75 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ub==0 ) continue
27060 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69  ;..    /* Someti
27070 6d 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  mes the code for
27080 20 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c   a subquery will
27090 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f   be generated mo
270a0 72 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f  re than.    ** o
270b0 6e 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71  nce, if the subq
270c0 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20  uery is part of 
270d0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
270e0 20 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c   in a LEFT JOIN,
270f0 0a 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d  .    ** for exam
27100 70 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ple.  In that ca
27110 73 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e  se, do not regen
27120 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
27130 6f 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a  o manifest.    *
27140 2a 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20  * a view or the 
27150 63 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d  co-routine to im
27160 70 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20  plement a view. 
27170 20 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61   The first insta
27180 6e 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75  nce.    ** is su
27190 66 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68  fficient, though
271a0 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
271b0 74 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20  to manifest the 
271c0 76 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20  view does need. 
271d0 20 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f     ** to be invo
271e0 6b 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20  ked again. */.  
271f0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64    if( pItem->add
27200 72 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20  rFillSub ){.    
27210 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 76 69 61    if( pItem->via
27220 43 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a  Coroutine==0 ){.
27230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
27240 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
27250 47 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65  Gosub, pItem->re
27260 67 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  gReturn, pItem->
27270 61 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20  addrFillSub);.  
27280 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74      }.      cont
27290 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
272a0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61   /* Increment Pa
272b0 72 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74  rse.nHeight by t
272c0 68 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  he height of the
272d0 20 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73   largest express
272e0 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20  ion.    ** tree 
272f0 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74  referred to by t
27300 68 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20  his, the parent 
27310 73 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c  select. The chil
27320 64 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20  d select.    ** 
27330 6d 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72  may contain expr
27340 65 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20  ession trees of 
27350 61 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28  at most.    ** (
27360 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
27370 44 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69  DEPTH-Parse.nHei
27380 67 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69  ght) height. Thi
27390 73 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a  s is a bit.    *
273a0 2a 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74  * more conservat
273b0 69 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61  ive than necessa
273c0 72 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73  ry, but much eas
273d0 69 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69  ier than enforci
273e0 6e 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61  ng.    ** an exa
273f0 63 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f  ct limit..    */
27400 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
27410 69 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  ight += sqlite3S
27420 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
27430 70 29 3b 0a 0a 20 20 20 20 69 73 41 67 67 53 75  p);..    isAggSu
27440 62 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c  b = (pSub->selFl
27450 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
27460 74 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20  te)!=0;.    if( 
27470 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28  flattenSubquery(
27480 70 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73  pParse, p, i, is
27490 41 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29  Agg, isAggSub) )
274a0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
274b0 73 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20  subquery can be 
274c0 61 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74  absorbed into it
274d0 73 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  s parent. */.   
274e0 20 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20     if( isAggSub 
274f0 29 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67  ){.        isAgg
27500 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
27510 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
27520 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20  Aggregate;.     
27530 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b   }.      i = -1;
27540 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
27550 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  TabList->nSrc==1
27560 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 4f  .           && O
27570 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
27580 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75  ed(db, SQLITE_Su
27590 62 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20  bqCoroutine).   
275a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70   ){.      /* Imp
275b0 6c 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74  lement a co-rout
275c0 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65  ine that will re
275d0 74 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f  turn a single ro
275e0 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a  w of the result.
275f0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20        ** set on 
27600 65 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  each invocation.
27610 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
27620 69 6e 74 20 61 64 64 72 54 6f 70 3b 0a 20 20 20  int addrTop;.   
27630 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
27640 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
27650 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 2f 2a 20 42  nMem;.      /* B
27660 65 66 6f 72 65 20 63 6f 64 69 6e 67 20 74 68 65  efore coding the
27670 20 4f 50 5f 47 6f 74 6f 20 74 6f 20 6a 75 6d 70   OP_Goto to jump
27680 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
27690 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e   the main routin
276a0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 65 6e 73 75  e,.      ** ensu
276b0 72 65 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  re that the jump
276c0 20 74 6f 20 74 68 65 20 76 65 72 69 66 79 2d 73   to the verify-s
276d0 63 68 65 6d 61 20 72 6f 75 74 69 6e 65 20 68 61  chema routine ha
276e0 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  s already.      
276f0 2a 2a 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 4f  ** been coded. O
27700 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 76 65  therwise, the ve
27710 72 69 66 79 2d 73 63 68 65 6d 61 20 77 6f 75 6c  rify-schema woul
27720 64 20 6c 69 6b 65 6c 79 20 62 65 20 63 6f 64 65  d likely be code
27730 64 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  d as .      ** p
27740 61 72 74 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f  art of the co-ro
27750 75 74 69 6e 65 2e 20 49 66 20 74 68 65 20 6d 61  utine. If the ma
27760 69 6e 20 72 6f 75 74 69 6e 65 20 74 68 65 6e 20  in routine then 
27770 61 63 63 65 73 73 65 64 20 74 68 65 20 0a 20 20  accessed the .  
27780 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
27790 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20  before invoking 
277a0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 66  the co-routine f
277b0 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
277c0 65 20 28 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a  e (for .      **
277d0 20 65 78 61 6d 70 6c 65 20 74 6f 20 69 6e 69 74   example to init
277e0 69 61 6c 69 7a 65 20 61 20 4c 49 4d 49 54 20 72  ialize a LIMIT r
277f0 65 67 69 73 74 65 72 20 66 72 6f 6d 20 61 20 73  egister from a s
27800 75 62 2d 73 65 6c 65 63 74 29 2c 20 69 74 20 77  ub-select), it w
27810 6f 75 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20 62  ould .      ** b
27820 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 74 68 6f  e doing so witho
27830 75 74 20 68 61 76 69 6e 67 20 76 65 72 69 66 69  ut having verifi
27840 65 64 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  ed the schema ve
27850 72 73 69 6f 6e 20 61 6e 64 20 6f 62 74 61 69 6e  rsion and obtain
27860 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ed .      ** the
27870 20 72 65 71 75 69 72 65 64 20 64 62 20 6c 6f 63   required db loc
27880 6b 73 2e 20 53 65 65 20 74 69 63 6b 65 74 20 64  ks. See ticket d
27890 36 62 33 36 62 65 33 38 2e 20 20 2a 2f 0a 20 20  6b36be38.  */.  
278a0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
278b0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
278c0 73 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  se, -1);.      s
278d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
278e0 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
278f0 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
27900 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
27910 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
27920 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
27930 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27940 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
27950 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
27960 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6f 72 6f 75  mment((v, "corou
27970 74 69 6e 65 20 25 73 22 2c 20 70 49 74 65 6d 2d  tine %s", pItem-
27980 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
27990 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
279a0 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54  rFillSub = addrT
279b0 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
279c0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
279d0 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
279e0 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
279f0 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65  Return);.      e
27a00 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
27a10 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
27a20 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
27a30 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
27a40 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
27a50 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
27a60 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
27a70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
27a80 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Est = (unsigned)
27a90 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
27aa0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76  ;.      pItem->v
27ab0 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
27ac0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27ad0 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
27ae0 64 72 54 6f 70 2c 20 64 65 73 74 2e 69 53 64 73  drTop, dest.iSds
27af0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
27b00 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
27b10 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 6e   addrTop, dest.n
27b20 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
27b30 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
27b40 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
27b50 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
27b60 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
27b70 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
27b80 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
27b90 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
27ba0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
27bb0 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
27bc0 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
27bd0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
27be0 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
27bf0 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
27c00 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
27c10 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
27c20 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
27c30 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
27c40 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
27c50 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
27c60 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
27c70 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
27c80 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
27c90 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
27ca0 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
27cb0 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
27cc0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
27cd0 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
27ce0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
27cf0 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
27d00 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
27d10 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
27d20 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
27d30 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
27d40 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sub==0 );.      
27d50 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
27d60 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
27d70 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72  m;.      topAddr
27d80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
27d90 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
27da0 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65  er, 0, pItem->re
27db0 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
27dc0 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
27dd0 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
27de0 20 20 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f        VdbeNoopCo
27df0 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61 74 65 72  mment((v, "mater
27e00 69 61 6c 69 7a 65 20 25 73 22 2c 20 70 49 74 65  ialize %s", pIte
27e10 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
27e20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
27e30 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d  m->isCorrelated=
27e40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
27e50 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
27e60 20 69 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74   is not correlat
27e70 65 64 20 61 6e 64 20 69 66 20 77 65 20 61 72 65  ed and if we are
27e80 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20   not inside of. 
27e90 20 20 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67         ** a trig
27ea0 67 65 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c  ger, then we onl
27eb0 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  y need to comput
27ec0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
27ed0 68 65 20 73 75 62 71 75 65 72 79 0a 20 20 20 20  he subquery.    
27ee0 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a      ** once. */.
27ef0 20 20 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72          onceAddr
27f00 20 3d 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e   = sqlite3CodeOn
27f10 63 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  ce(pParse);.    
27f20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
27f30 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
27f40 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68 65 6d  &dest, SRT_Ephem
27f50 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  Tab, pItem->iCur
27f60 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  sor);.      expl
27f70 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
27f80 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
27f90 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
27fa0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
27fb0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
27fc0 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
27fd0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
27fe0 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  m->pTab->nRowEst
27ff0 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53 75   = (unsigned)pSu
28000 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
28010 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41 64 64       if( onceAdd
28020 72 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a  r ) sqlite3VdbeJ
28030 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63 65 41  umpHere(v, onceA
28040 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65 74 41  ddr);.      retA
28050 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
28060 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
28070 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72 65 67  turn, pItem->reg
28080 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56  Return);.      V
28090 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
280a0 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  end %s", pItem->
280b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
280c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
280d0 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f 70 41  ChangeP1(v, topA
280e0 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b 0a 20  ddr, retAddr);. 
280f0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
28100 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
28110 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  arse);.    }.   
28120 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d 3e 6e   if( /*pParse->n
28130 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c  Err ||*/ db->mal
28140 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
28150 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
28160 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  nd;.    }.    pP
28170 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
28180 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
28190 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20 20 20  prHeight(p);.   
281a0 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70   pTabList = p->p
281b0 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21 49 67  Src;.    if( !Ig
281c0 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70  norableOrderby(p
281d0 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Dest) ){.      p
281e0 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
281f0 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  derBy;.    }.  }
28200 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  .  pEList = p->p
28210 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a 20 20  EList;.#endif.  
28220 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57 68 65  pWhere = p->pWhe
28230 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79 20 3d  re;.  pGroupBy =
28240 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
28250 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70 48 61  pHaving = p->pHa
28260 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69 6e 63  ving;.  sDistinc
28270 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d 3e 73  t.isTnct = (p->s
28280 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
28290 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69 66 6e  tinct)!=0;..#ifn
282a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
282b0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
282c0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
282d0 20 61 72 65 20 61 20 73 65 71 75 65 6e 63 65 20   are a sequence 
282e0 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f 20 74  of queries, do t
282f0 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65 73 20  he earlier ones 
28300 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  first..  */.  if
28310 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
28320 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
28330 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  most==0 ){.     
28340 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 2c 20   Select *pLoop, 
28350 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  *pRight = 0;.   
28360 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a     int cnt = 0;.
28370 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65        int mxSele
28380 63 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c  ct;.      for(pL
28390 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c  oop=p; pLoop; pL
283a0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f  oop=pLoop->pPrio
283b0 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20  r, cnt++){.     
283c0 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69 67 68 74     pLoop->pRight
283d0 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  most = p;.      
283e0 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d    pLoop->pNext =
283f0 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20   pRight;.       
28400 20 70 52 69 67 68 74 20 3d 20 70 4c 6f 6f 70 3b   pRight = pLoop;
28410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
28420 78 53 65 6c 65 63 74 20 3d 20 64 62 2d 3e 61 4c  xSelect = db->aL
28430 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
28440 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
28450 54 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  T];.      if( mx
28460 53 65 6c 65 63 74 20 26 26 20 63 6e 74 3e 6d 78  Select && cnt>mx
28470 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
28480 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
28490 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
284a0 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d  any terms in com
284b0 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a  pound SELECT");.
284c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
284d0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
284e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
284f0 6d 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72  multiSelect(pPar
28500 73 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20  se, p, pDest);. 
28510 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
28520 65 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65  eger(pParse->iSe
28530 6c 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65  lectId, iRestore
28540 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 72  SelectId);.    r
28550 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
28560 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
28570 65 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52  ere is both a GR
28580 4f 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52  OUP BY and an OR
28590 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e  DER BY clause an
285a0 64 20 74 68 65 79 20 61 72 65 0a 20 20 2a 2a 20  d they are.  ** 
285b0 69 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20  identical, then 
285c0 64 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45  disable the ORDE
285d0 52 20 42 59 20 63 6c 61 75 73 65 20 73 69 6e 63  R BY clause sinc
285e0 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 0a 20  e the GROUP BY. 
285f0 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20 65   ** will cause e
28600 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20  lements to come 
28610 6f 75 74 20 69 6e 20 74 68 65 20 63 6f 72 72 65  out in the corre
28620 63 74 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ct order.  This 
28630 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d  is.  ** an optim
28640 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f  ization - the co
28650 72 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f  rrect answer sho
28660 75 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72  uld result regar
28670 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20  dless..  ** Use 
28680 74 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  the SQLITE_Group
28690 42 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74  ByOrder flag wit
286a0 68 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  h SQLITE_TESTCTR
286b0 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a  L_OPTIMIZER.  **
286c0 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 69 73   to disable this
286d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
286e0 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
286f0 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  es..  */.  if( s
28700 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
28710 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f 75 70 42  mpare(p->pGroupB
28720 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 29  y, pOrderBy, -1)
28730 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
28740 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
28750 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47  led(db, SQLITE_G
28760 72 6f 75 70 42 79 4f 72 64 65 72 29 20 29 7b 0a  roupByOrder) ){.
28770 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30      pOrderBy = 0
28780 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
28790 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54  he query is DIST
287a0 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  INCT with an ORD
287b0 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74  ER BY but is not
287c0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61   an aggregate, a
287d0 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  nd .  ** if the 
287e0 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74  select-list is t
287f0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f  he same as the O
28800 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68  RDER BY list, th
28810 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20  en this query.  
28820 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74  ** can be rewrit
28830 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42  ten as a GROUP B
28840 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  Y. In other word
28850 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  s, this:.  **.  
28860 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49  **     SELECT DI
28870 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20  STINCT xyz FROM 
28880 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a  ... ORDER BY xyz
28890 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72  .  **.  ** is tr
288a0 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20  ansformed to:.  
288b0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
288c0 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
288d0 47 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20 2a  GROUP BY xyz.  *
288e0 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e  *.  ** The secon
288f0 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72  d form is prefer
28900 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20  red as a single 
28910 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74  index (or temp-t
28920 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20  able) may be .  
28930 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68  ** used for both
28940 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e   the ORDER BY an
28950 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65  d DISTINCT proce
28960 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e  ssing. As origin
28970 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74  ally .  ** writt
28980 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73  en the query mus
28990 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62  t use a temp-tab
289a0 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  le for at least 
289b0 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52  one of the ORDER
289c0 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49   .  ** BY and DI
289d0 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69  STINCT, and an i
289e0 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65  ndex or separate
289f0 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20   temp-table for 
28a00 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a  the other..  */.
28a10 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
28a20 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
28a30 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
28a40 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20  ==SF_Distinct . 
28a50 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
28a60 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 4f 72 64  ListCompare(pOrd
28a70 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  erBy, p->pEList,
28a80 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20   -1)==0.  ){.   
28a90 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
28aa0 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20  ~SF_Distinct;.  
28ab0 20 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20    p->pGroupBy = 
28ac0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
28ad0 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  up(db, p->pEList
28ae0 2c 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70  , 0);.    pGroup
28af0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
28b00 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d  ;.    pOrderBy =
28b10 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63   0;.    /* Notic
28b20 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
28b30 67 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20  ght SF_Distinct 
28b40 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
28b50 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67   from p->selFlag
28b60 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44  s,.    ** the sD
28b70 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69  istinct.isTnct i
28b80 73 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65  s still set.  He
28b90 6e 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72  nce, isTnct repr
28ba0 65 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a  esents the.    *
28bb0 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69  * original setti
28bc0 6e 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73  ng of the SF_Dis
28bd0 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20  tinct flag, not 
28be0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74  the current sett
28bf0 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ing */.    asser
28c00 74 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  t( sDistinct.isT
28c10 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nct );.  }..  /*
28c20 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
28c30 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
28c40 20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69   then this sorti
28c50 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69  ng.  ** index mi
28c60 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
28c70 20 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64   unused if the d
28c80 61 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a  ata can be .  **
28c90 20 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72   extracted in pr
28ca0 65 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  e-sorted order. 
28cb0 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
28cc0 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20  case, then the. 
28cd0 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d   ** OP_OpenEphem
28ce0 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e  eral instruction
28cf0 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
28d00 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f   to an OP_Noop o
28d10 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75  nce.  ** we figu
28d20 72 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20  re out that the 
28d30 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73  sorting index is
28d40 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68   not needed.  Th
28d50 65 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a  e addrSortIndex.
28d60 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73    ** variable is
28d70 20 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74   used to facilit
28d80 61 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e  ate that change.
28d90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
28da0 65 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49  erBy ){.    KeyI
28db0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
28dc0 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
28dd0 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
28de0 74 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  t(pParse, pOrder
28df0 42 79 2c 20 30 29 3b 0a 20 20 20 20 70 4f 72 64  By, 0);.    pOrd
28e00 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d  erBy->iECursor =
28e10 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
28e20 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
28e30 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f  Ephm[2] = addrSo
28e40 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20  rtIndex =.      
28e50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
28e60 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
28e70 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
28ea0 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e  rsor, pOrderBy->
28eb0 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
28ee0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
28ef0 46 4f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FO);.  }else{.  
28f00 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20    addrSortIndex 
28f10 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
28f20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
28f30 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
28f40 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
28f50 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
28f60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
28f70 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
28f80 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
28f90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28fa0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
28fb0 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
28fc0 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
28fd0 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
28fe0 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
28ff0 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
29000 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
29010 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
29020 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53  lectRow = LARGES
29030 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75  T_INT64;.  compu
29040 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
29050 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
29060 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
29070 69 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f 72  it==0 && addrSor
29080 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20  tIndex>=0 ){.   
29090 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
290a0 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
290b0 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  ex)->opcode = OP
290c0 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20  _SorterOpen;.   
290d0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
290e0 53 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  SF_UseSorter;.  
290f0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76  }..  /* Open a v
29100 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
29110 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
29120 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
29130 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
29140 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
29150 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
29160 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65  tabTnct = pParse
29170 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44  ->nTab++;.    sD
29180 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74  istinct.addrTnct
29190 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
291a0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
291b0 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291d0 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
291e0 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
291f0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66     (char*)keyInf
29220 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
29230 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  arse, p->pEList,
29240 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29       P4_KEYINFO)
29270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
29280 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52  eChangeP5(v, BTR
29290 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20  EE_UNORDERED);. 
292a0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
292b0 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44  ctType = WHERE_D
292c0 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
292d0 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
292e0 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
292f0 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
29300 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a  INCT_NOOP;.  }..
29310 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20    if( !isAgg && 
29320 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20  pGroupBy==0 ){. 
29330 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61     /* No aggrega
29340 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
29350 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
29360 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77  use */.    u16 w
29370 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69  ctrlFlags = (sDi
29380 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20  stinct.isTnct ? 
29390 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
293a0 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  NCT : 0);..    /
293b0 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61  * Begin the data
293c0 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  base scan. */.  
293d0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
293e0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
293f0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
29400 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79 2c  Where, pOrderBy,
29410 20 70 2d 3e 70 45 4c 69 73 74 2c 0a 20 20 20 20   p->pEList,.    
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29430 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72 6c             wctrl
29440 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69  Flags, 0);.    i
29450 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67  f( pWInfo==0 ) g
29460 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
29470 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
29480 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75  hereOutputRowCou
29490 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e  nt(pWInfo) < p->
294a0 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20  nSelectRow ){.  
294b0 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
294c0 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  w = sqlite3Where
294d0 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
294e0 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
294f0 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e    if( sDistinct.
29500 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65  isTnct && sqlite
29510 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74  3WhereIsDistinct
29520 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
29530 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
29540 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57  tType = sqlite3W
29550 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70  hereIsDistinct(p
29560 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  WInfo);.    }.  
29570 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26    if( pOrderBy &
29580 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  & sqlite3WhereIs
29590 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 20  Ordered(pWInfo) 
295a0 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
295b0 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69  .    /* If sorti
295c0 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61  ng index that wa
295d0 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
295e0 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65  rior OP_OpenEphe
295f0 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e  meral .    ** in
29600 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20  struction ended 
29610 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65  up not being nee
29620 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65  ded, then change
29630 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
29640 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74  meral.    ** int
29650 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20  o an OP_Noop..  
29660 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64    */.    if( add
29670 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26  rSortIndex>=0 &&
29680 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a   pOrderBy==0 ){.
29690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
296a0 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c  eChangeToNoop(v,
296b0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b   addrSortIndex);
296c0 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  .      p->addrOp
296d0 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a  enEphm[2] = -1;.
296e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
296f0 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69  e the standard i
29700 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20  nner loop. */.  
29710 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
29720 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c  p(pParse, p, pEL
29730 69 73 74 2c 20 2d 31 2c 20 70 4f 72 64 65 72 42  ist, -1, pOrderB
29740 79 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70  y, &sDistinct, p
29750 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Dest,.          
29760 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29770 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61  3WhereContinueLa
29780 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20  bel(pWInfo),.   
29790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
297b0 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
297c0 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68  ;..    /* End th
297d0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20  e database scan 
297e0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
297f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
29800 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  (pWInfo);.  }els
29810 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  e{.    /* This c
29820 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65  ase when there e
29830 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66  xist aggregate f
29840 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52  unctions or a GR
29850 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20  OUP BY clause.  
29860 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a    ** or both */.
29870 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
29880 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  sNC;    /* Name 
29890 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63  context for proc
298a0 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65  essing aggregate
298b0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
298c0 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20      int iAMem;  
298d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
298e0 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72   Mem address for
298f0 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74   storing current
29900 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
29910 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20   int iBMem;     
29920 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65       /* First Me
29930 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72  m address for pr
29940 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20  evious GROUP BY 
29950 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46  */.    int iUseF
29960 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65  lag;       /* Me
29970 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e  m address holdin
29980 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e  g flag indicatin
29990 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a  g that at least.
299a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299b0 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72          ** one r
299c0 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  ow of the input 
299d0 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f  to the aggregato
299e0 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20  r has been.     
299f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a00 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20     ** processed 
29a10 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72  */.    int iAbor
29a20 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65  tFlag;     /* Me
29a30 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20  m address which 
29a40 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f  causes query abo
29a50 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a  rt if positive *
29a60 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42  /.    int groupB
29a70 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77  ySort;    /* Row
29a80 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72  s come from sour
29a90 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ce in GROUP BY o
29aa0 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rder */.    int 
29ab0 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20  addrEnd;        
29ac0 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73  /* End of proces
29ad0 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
29ae0 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20  LECT */.    int 
29af0 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20  sortPTab = 0;   
29b00 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75  /* Pseudotable u
29b10 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f  sed to decode so
29b20 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f  rting results */
29b30 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74  .    int sortOut
29b40 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70   = 0;    /* Outp
29b50 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d  ut register from
29b60 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a   the sorter */..
29b70 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
29b80 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65  y and all aliase
29b90 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65  s between the re
29ba0 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65  sult set and the
29bb0 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59  .    ** GROUP BY
29bc0 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
29bd0 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
29be0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
29c10 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
29c20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
29c30 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f  _item *pItem;  /
29c40 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
29c50 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
29c60 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20   a list */..    
29c70 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73    for(k=p->pELis
29c80 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d  t->nExpr, pItem=
29c90 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e  p->pEList->a; k>
29ca0 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29  0; k--, pItem++)
29cb0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
29cc0 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b  >u.x.iAlias = 0;
29cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
29ce0 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e  or(k=pGroupBy->n
29cf0 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f  Expr, pItem=pGro
29d00 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  upBy->a; k>0; k-
29d10 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
29d20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
29d30 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  iAlias = 0;.    
29d40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
29d50 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20  >nSelectRow>100 
29d60 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
29d70 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65  = 100;.    }else
29d80 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  {.      p->nSele
29d90 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d  ctRow = 1;.    }
29da0 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .. .    /* Creat
29db0 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d  e a label to jum
29dc0 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e  p to when we wan
29dd0 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71  t to abort the q
29de0 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72  uery */.    addr
29df0 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  End = sqlite3Vdb
29e00 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
29e10 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54      /* Convert T
29e20 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69  K_COLUMN nodes i
29e30 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  nto TK_AGG_COLUM
29e40 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69  N and make entri
29e50 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67  es in.    ** sAg
29e60 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b  gInfo for all TK
29e70 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f  _AGG_FUNCTION no
29e80 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  des in expressio
29e90 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ns of the.    **
29ea0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
29eb0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
29ec0 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
29ed0 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
29ee0 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
29ef0 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
29f00 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
29f10 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e  ;.    sNC.pAggIn
29f20 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a  fo = &sAggInfo;.
29f30 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52      sAggInfo.mnR
29f40 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
29f50 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  m+1;.    sAggInf
29f60 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e  o.nSortingColumn
29f70 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47   = pGroupBy ? pG
29f80 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20  roupBy->nExpr+1 
29f90 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66  : 0;.    sAggInf
29fa0 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72  o.pGroupBy = pGr
29fb0 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74  oupBy;.    sqlit
29fc0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
29fd0 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73  List(&sNC, pELis
29fe0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
29ff0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73  xprAnalyzeAggLis
2a000 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79  t(&sNC, pOrderBy
2a010 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69  );.    if( pHavi
2a020 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ng ){.      sqli
2a030 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
2a040 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70  gregates(&sNC, p
2a050 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20  Having);.    }. 
2a060 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63     sAggInfo.nAcc
2a070 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49  umulator = sAggI
2a080 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  nfo.nColumn;.   
2a090 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2a0a0 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29  Info.nFunc; i++)
2a0b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2a0c0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
2a0d0 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b  (sAggInfo.aFunc[
2a0e0 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  i].pExpr, EP_xIs
2a0f0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
2a100 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
2a110 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20  NC_InAggFunc;.  
2a120 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2a130 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2a140 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  NC, sAggInfo.aFu
2a150 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  nc[i].pExpr->x.p
2a160 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43  List);.      sNC
2a170 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  .ncFlags &= ~NC_
2a180 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d  InAggFunc;.    }
2a190 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78  .    sAggInfo.mx
2a1a0 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
2a1b0 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  em;.    if( db->
2a1c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2a1d0 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2a1e0 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69  .    /* Processi
2a1f0 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  ng for aggregate
2a200 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20  s with GROUP BY 
2a210 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e  is very differen
2a220 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63  t and.    ** muc
2a230 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74  h more complex t
2a240 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77  han aggregates w
2a250 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42  ithout a GROUP B
2a260 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  Y..    */.    if
2a270 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
2a280 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
2a290 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e  yInfo;  /* Keyin
2a2a0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
2a2b0 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63  r the group by c
2a2c0 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
2a2d0 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
2a2e0 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d     /* A-vs-B com
2a2f0 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f  parision jump */
2a300 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f  .      int addrO
2a310 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74  utputRow;  /* St
2a320 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e  art of subroutin
2a330 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61  e that outputs a
2a340 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20   result row */. 
2a350 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70       int regOutp
2a360 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75  utRow;   /* Retu
2a370 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
2a380 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73  ter for output s
2a390 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20  ubroutine */.   
2a3a0 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62     int addrSetAb
2a3b0 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68  ort;   /* Set th
2a3c0 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64  e abort flag and
2a3d0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20   return */.     
2a3e0 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f   int addrTopOfLo
2a3f0 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  op;  /* Top of t
2a400 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f  he input loop */
2a410 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53  .      int addrS
2a420 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68  ortingIdx; /* Th
2a430 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2a440 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69  al for the sorti
2a450 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ng index */.    
2a460 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b    int addrReset;
2a470 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74        /* Subrout
2a480 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e  ine for resettin
2a490 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
2a4a0 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  r */.      int r
2a4b0 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f  egReset;       /
2a4c0 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73  * Return address
2a4d0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65   register for re
2a4e0 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  set subroutine *
2a4f0 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  /..      /* If t
2a500 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20  here is a GROUP 
2a510 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67  BY clause we mig
2a520 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e  ht need a sortin
2a530 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20  g index to.     
2a540 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74   ** implement it
2a550 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74  .  Allocate that
2a560 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e   sorting index n
2a570 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73  ow.  If it turns
2a580 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68   out.      ** th
2a590 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65  at we do not nee
2a5a0 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20  d it after all, 
2a5b0 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  the OP_SorterOpe
2a5c0 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20  n instruction.  
2a5d0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63      ** will be c
2a5e0 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
2a5f0 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f  Noop.  .      */
2a600 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e  .      sAggInfo.
2a610 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61  sortingIdx = pPa
2a620 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
2a630 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65     pKeyInfo = ke
2a640 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
2a650 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
2a660 42 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64  By, 0);.      ad
2a670 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73  drSortingIdx = s
2a680 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2a690 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
2a6a0 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41  n, .          sA
2a6b0 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2a6c0 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72  x, sAggInfo.nSor
2a6d0 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20  tingColumn, .   
2a6e0 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a         0, (char*
2a6f0 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
2a700 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f  YINFO);..      /
2a710 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d  * Initialize mem
2a720 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73  ory locations us
2a730 65 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61  ed by GROUP BY a
2a740 67 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73  ggregate process
2a750 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ing.      */.   
2a760 20 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b     iUseFlag = ++
2a770 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
2a780 20 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d      iAbortFlag =
2a790 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
2a7a0 0a 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74  .      regOutput
2a7b0 52 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Row = ++pParse->
2a7c0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
2a7d0 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
2a7e0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
2a7f0 28 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65  (v);.      regRe
2a800 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  set = ++pParse->
2a810 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
2a820 52 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56  Reset = sqlite3V
2a830 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2a840 0a 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70  .      iAMem = p
2a850 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
2a860 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
2a870 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d  Mem += pGroupBy-
2a880 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42  >nExpr;.      iB
2a890 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
2a8a0 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50  em + 1;.      pP
2a8b0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47  arse->nMem += pG
2a8c0 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  roupBy->nExpr;. 
2a8d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a8e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2a8f0 65 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46  eger, 0, iAbortF
2a900 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2a910 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65  Comment((v, "cle
2a920 61 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ar abort flag"))
2a930 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2a940 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2a950 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65  Integer, 0, iUse
2a960 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2a970 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
2a980 64 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74  dicate accumulat
2a990 6f 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20  or empty"));.   
2a9a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a9b0 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp3(v, OP_Null,
2a9c0 20 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d   0, iAMem, iAMem
2a9d0 2b 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  +pGroupBy->nExpr
2a9e0 2d 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42  -1);..      /* B
2a9f0 65 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74  egin a loop that
2aa00 20 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c   will extract al
2aa10 6c 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e  l source rows in
2aa20 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e   GROUP BY order.
2aa30 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d  .      ** This m
2aa40 69 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f  ight involve two
2aa50 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20   separate loops 
2aa60 77 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20  with an OP_Sort 
2aa70 69 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20  in between, or. 
2aa80 20 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74       ** it might
2aa90 20 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f   be a single loo
2aaa0 70 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69  p that uses an i
2aab0 6e 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20  ndex to extract 
2aac0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20  information.    
2aad0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68    ** in the righ
2aae0 74 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e  t order to begin
2aaf0 20 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   with..      */.
2ab00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2ab10 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2ab20 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
2ab30 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
2ab40 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
2ab50 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
2ab60 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
2ab70 68 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  here, pGroupBy, 
2ab80 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
2ab90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aba0 20 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50       WHERE_GROUP
2abb0 42 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  BY, 0);.      if
2abc0 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
2abd0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2abe0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2abf0 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70  WhereIsOrdered(p
2ac00 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20  WInfo) ){.      
2ac10 20 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a    /* The optimiz
2ac20 65 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65  er is able to de
2ac30 6c 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72  liver rows in gr
2ac40 6f 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a  oup by order so.
2ac50 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f          ** we do
2ac60 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72   not have to sor
2ac70 74 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45  t.  The OP_OpenE
2ac80 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
2ac90 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
2aca0 2a 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65  * cancelled late
2acb0 72 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69  r because we sti
2acc0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74  ll need to use t
2acd0 68 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20  he pKeyInfo.    
2ace0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67      */.        g
2acf0 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a  roupBySort = 0;.
2ad00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ad10 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65       /* Rows are
2ad20 20 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75   coming out in u
2ad30 6e 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65  ndetermined orde
2ad40 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70  r.  We have to p
2ad50 75 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65  ush.        ** e
2ad60 61 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73  ach row into a s
2ad70 6f 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65  orting index, te
2ad80 72 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73  rminate the firs
2ad90 74 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20  t loop,.        
2ada0 2a 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65  ** then loop ove
2adb0 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e  r the sorting in
2adc0 64 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  dex in order to 
2add0 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20  get the output. 
2ade0 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72         ** in sor
2adf0 74 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20  ted order.      
2ae00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
2ae10 20 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20   regBase;.      
2ae20 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
2ae30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
2ae40 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  l;.        int n
2ae50 47 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20  GroupBy;..      
2ae60 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62    explainTempTab
2ae70 6c 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  le(pParse, .    
2ae80 20 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e          (sDistin
2ae90 63 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d  ct.isTnct && (p-
2aea0 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73  >selFlags&SF_Dis
2aeb0 74 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20  tinct)==0) ?.   
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aed0 20 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47   "DISTINCT" : "G
2aee0 52 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20  ROUP BY");..    
2aef0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
2af00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72  = 1;.        nGr
2af10 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79  oupBy = pGroupBy
2af20 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
2af30 20 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79   nCol = nGroupBy
2af40 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20   + 1;.        j 
2af50 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20  = nGroupBy+1;.  
2af60 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2af70 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d  <sAggInfo.nColum
2af80 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
2af90 20 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e     if( sAggInfo.
2afa0 61 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43  aCol[i].iSorterC
2afb0 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20  olumn>=j ){.    
2afc0 20 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a          nCol++;.
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b              j++;
2afe0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2aff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
2b000 65 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33  egBase = sqlite3
2b010 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
2b020 72 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  rse, nCol);.    
2b030 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2b040 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2b050 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2b060 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
2b070 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
2b080 70 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29  pBy, regBase, 0)
2b090 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2b0a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2b0b0 50 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67  P_Sequence, sAgg
2b0c0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2b0d0 72 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79  regBase+nGroupBy
2b0e0 29 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e  );.        j = n
2b0f0 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20  GroupBy+1;.     
2b100 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41     for(i=0; i<sA
2b110 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20  ggInfo.nColumn; 
2b120 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2b130 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63  struct AggInfo_c
2b140 6f 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67  ol *pCol = &sAgg
2b150 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  Info.aCol[i];.  
2b160 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
2b170 2d 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ->iSorterColumn>
2b180 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
2b190 20 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72    int r1 = j + r
2b1a0 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2b1b0 20 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20      int r2;..   
2b1c0 20 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71           r2 = sq
2b1d0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
2b1e0 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a  Column(pParse, .
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2b210 43 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d  Col->pTab, pCol-
2b220 3e 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e  >iColumn, pCol->
2b230 69 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a  iTable, r1, 0);.
2b240 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2b250 72 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20  r1!=r2 ){.      
2b260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b270 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b280 53 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a  SCopy, r2, r1);.
2b290 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2b2a0 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
2b2b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b2c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
2b2d0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
2b2e0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
2b2f0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2b300 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2b310 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
2b320 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72  regBase, nCol, r
2b330 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2b340 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b350 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2b360 72 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66  rInsert, sAggInf
2b370 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65  o.sortingIdx, re
2b380 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2b390 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2b3a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
2b3b0 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20  regRecord);.    
2b3c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
2b3d0 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
2b3e0 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f  se, regBase, nCo
2b3f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2b400 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
2b410 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  fo);.        sAg
2b420 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2b430 50 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20  PTab = sortPTab 
2b440 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2b450 3b 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75  ;.        sortOu
2b460 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
2b470 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
2b480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2b490 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
2b4a0 70 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50  penPseudo, sortP
2b4b0 54 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43  Tab, sortOut, nC
2b4c0 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
2b4d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2b4e0 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c  , OP_SorterSort,
2b4f0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2b500 67 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a  gIdx, addrEnd);.
2b510 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
2b520 65 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42  ent((v, "GROUP B
2b530 59 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20  Y sort"));.     
2b540 20 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53     sAggInfo.useS
2b550 6f 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20  ortingIdx = 1;. 
2b560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2b570 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2b580 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rse);.      }.. 
2b590 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
2b5a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2b5b0 55 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20  UP BY terms and 
2b5c0 73 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c  store in b0, b1,
2b5d0 20 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20   b2....      ** 
2b5e0 28 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f  (b0 is memory lo
2b5f0 63 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20  cation iBMem+0, 
2b600 62 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61  b1 is iBMem+1, a
2b610 6e 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20  nd so forth).   
2b620 20 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61     ** Then compa
2b630 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47  re the current G
2b640 52 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67  ROUP BY terms ag
2b650 61 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20  ainst the GROUP 
2b660 42 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a  BY terms.      *
2b670 2a 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  * from the previ
2b680 6f 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c  ous row currentl
2b690 79 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20  y stored in a0, 
2b6a0 61 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20  a1, a2....      
2b6b0 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70  */.      addrTop
2b6c0 4f 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33  OfLoop = sqlite3
2b6d0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2b6e0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2b6f0 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
2b700 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
2b710 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
2b720 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2b730 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2b740 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41  P_SorterData, sA
2b750 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
2b760 78 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20  x, sortOut);.   
2b770 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a     }.      for(j
2b780 3d 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e  =0; j<pGroupBy->
2b790 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
2b7a0 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79       if( groupBy
2b7b0 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Sort ){.        
2b7c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b7d0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
2b7e0 2c 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69  , sortPTab, j, i
2b7f0 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
2b800 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71     if( j==0 ) sq
2b810 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2b820 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
2b830 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20  RCACHE);.       
2b840 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b850 20 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63    sAggInfo.direc
2b860 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20  tMode = 1;.     
2b870 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2b880 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72  Code(pParse, pGr
2b890 6f 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70  oupBy->a[j].pExp
2b8a0 72 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20  r, iBMem+j);.   
2b8b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2b8c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2b8d0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d  AddOp4(v, OP_Com
2b8e0 70 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d  pare, iAMem, iBM
2b8f0 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  em, pGroupBy->nE
2b900 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
2b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2b920 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
2b930 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
2b940 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
2b950 20 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74        j1 = sqlit
2b960 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2b970 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
2b980 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2b990 20 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20   OP_Jump, j1+1, 
2b9a0 30 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20  0, j1+1);..     
2b9b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
2b9c0 65 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e  e that runs when
2b9d0 65 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42  ever the GROUP B
2b9e0 59 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20  Y changes..     
2b9f0 20 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74   ** Changes in t
2ba00 68 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20  he GROUP BY are 
2ba10 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20  detected by the 
2ba20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20  previous code.  
2ba30 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49      ** block.  I
2ba40 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20  f there were no 
2ba50 63 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c  changes, this bl
2ba60 6f 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  ock is skipped..
2ba70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2ba80 2a 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69  * This code copi
2ba90 65 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70  es current group
2baa0 20 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c   by terms in b0,
2bab0 62 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20  b1,b2,....      
2bac0 2a 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31  ** over to a0,a1
2bad0 2c 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61  ,a2.  It then ca
2bae0 6c 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73  lls the output s
2baf0 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20  ubroutine.      
2bb00 2a 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68  ** and resets th
2bb10 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2bb20 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72  mulator register
2bb30 73 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  s in preparation
2bb40 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
2bb50 65 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20  e next GROUP BY 
2bb60 62 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a  batch..      */.
2bb70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2bb80 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
2bb90 2c 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20  , iBMem, iAMem, 
2bba0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29  pGroupBy->nExpr)
2bbb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2bbc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2bbd0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
2bbe0 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
2bbf0 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
2bc00 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
2bc10 75 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20  ut one row"));. 
2bc20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bc30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50  AddOp2(v, OP_IfP
2bc40 6f 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20  os, iAbortFlag, 
2bc50 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
2bc60 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2bc70 22 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61  "check abort fla
2bc80 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  g"));.      sqli
2bc90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2bca0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
2bcb0 73 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b  set, addrReset);
2bcc0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2bcd0 6e 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63  nt((v, "reset ac
2bce0 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
2bcf0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74       /* Update t
2bd00 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
2bd10 75 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20  umulators based 
2bd20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  on the content o
2bd30 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  f.      ** the c
2bd40 75 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20  urrent row.     
2bd50 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2bd60 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
2bd70 20 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61   j1);.      upda
2bd80 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
2bd90 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2bda0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2bdb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2bdc0 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65  Integer, 1, iUse
2bdd0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2bde0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e  eComment((v, "in
2bdf0 64 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61  dicate data in a
2be00 63 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a  ccumulator"));..
2be10 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2be20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a  the loop.      *
2be30 2f 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75  /.      if( grou
2be40 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20  pBySort ){.     
2be50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2be60 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
2be70 72 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e  rNext, sAggInfo.
2be80 73 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72  sortingIdx, addr
2be90 54 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20  TopOfLoop);.    
2bea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2beb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2bec0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2bed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
2bee0 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
2bef0 72 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20  rSortingIdx);.  
2bf00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2bf10 4f 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c  Output the final
2bf20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20   row of result. 
2bf30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
2bf40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2bf50 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
2bf60 4f 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f  OutputRow, addrO
2bf70 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2bf80 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2bf90 20 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72   "output final r
2bfa0 6f 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ow"));..      /*
2bfb0 20 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73   Jump over the s
2bfc0 75 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20  ubroutines.     
2bfd0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2bfe0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2bff0 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
2c000 6e 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nd);..      /* G
2c010 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
2c020 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
2c030 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
2c040 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
2c050 20 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73     ** set.  This
2c060 20 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73   subroutine firs
2c070 74 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69  t looks at the i
2c080 55 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73  UseFlag.  If iUs
2c090 65 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69  eFlag.      ** i
2c0a0 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
2c0b0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
2c0c0 65 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20  e subroutine is 
2c0d0 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20  a no-op.  If.   
2c0e0 20 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73     ** the proces
2c0f0 73 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74  sing calls for t
2c100 68 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72  he query to abor
2c110 74 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69  t, this subrouti
2c120 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72  ne.      ** incr
2c130 65 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72  ements the iAbor
2c140 74 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63  tFlag memory loc
2c150 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74  ation before ret
2c160 75 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20  urning in.      
2c170 2a 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e  ** order to sign
2c180 61 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  al the caller to
2c190 20 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f   abort..      */
2c1a0 0a 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62  .      addrSetAb
2c1b0 6f 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ort = sqlite3Vdb
2c1c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2c1d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c1e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2c1f0 6e 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72  nteger, 1, iAbor
2c200 74 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64  tFlag);.      Vd
2c210 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
2c220 65 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  et abort flag"))
2c230 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2c240 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2c250 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75  Return, regOutpu
2c260 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c  tRow);.      sql
2c270 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2c280 61 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70  abel(v, addrOutp
2c290 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64  utRow);.      ad
2c2a0 64 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71  drOutputRow = sq
2c2b0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2c2c0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2c2d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2c2e0 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55  (v, OP_IfPos, iU
2c2f0 73 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70  seFlag, addrOutp
2c300 75 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20  utRow+2);.      
2c310 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2c320 22 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20  "Groupby result 
2c330 67 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20  generator entry 
2c340 70 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20  point"));.      
2c350 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c360 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2c370 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
2c380 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
2c390 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
2c3a0 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2c3b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
2c3c0 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
2c3d0 48 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70  Having, addrOutp
2c3e0 75 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f  utRow+1, SQLITE_
2c3f0 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20  JUMPIFNULL);.   
2c400 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
2c410 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
2c420 3e 70 45 4c 69 73 74 2c 20 2d 31 2c 20 70 4f 72  >pEList, -1, pOr
2c430 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20  derBy,.         
2c440 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44               &sD
2c450 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c470 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2c480 52 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62  Row+1, addrSetAb
2c490 6f 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ort);.      sqli
2c4a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2c4b0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2c4c0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2c4d0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2c4e0 20 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65   "end groupby re
2c4f0 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29  sult generator")
2c500 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
2c510 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
2c520 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73  ne that will res
2c530 65 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20  et the group-by 
2c540 61 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20  accumulator.    
2c550 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
2c560 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2c570 65 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29  el(v, addrReset)
2c580 3b 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63  ;.      resetAcc
2c590 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c  umulator(pParse,
2c5a0 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2c5b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2c5c0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
2c5d0 6e 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20  n, regReset);.  
2c5e0 20 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64     .    } /* end
2c5f0 69 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65  if pGroupBy.  Be
2c600 67 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75  gin aggregate qu
2c610 65 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52  eries without GR
2c620 4f 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65  OUP BY: */.    e
2c630 6c 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72  lse {.      Expr
2c640 4c 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a  List *pDel = 0;.
2c650 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c660 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20  MIT_BTREECOUNT. 
2c670 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
2c680 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61  ;.      if( (pTa
2c690 62 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e  b = isSimpleCoun
2c6a0 74 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29  t(p, &sAggInfo))
2c6b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
2c6c0 2a 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75  * If isSimpleCou
2c6d0 6e 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70  nt() returns a p
2c6e0 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c  ointer to a Tabl
2c6f0 65 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65  e structure, the
2c700 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  n.        ** the
2c710 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
2c720 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
2c730 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2c740 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f    **   SELECT co
2c750 75 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c  unt(*) FROM <tbl
2c760 3e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  >.        **.   
2c770 20 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68       ** where th
2c780 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
2c790 65 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65  e returned repre
2c7a0 73 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c  sents table <tbl
2c7b0 3e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  >..        **.  
2c7c0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74        ** This st
2c7d0 61 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f  atement is so co
2c7e0 6d 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20  mmon that it is 
2c7f0 6f 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61  optimized specia
2c800 6c 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20  lly. The.       
2c810 20 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73   ** OP_Count ins
2c820 74 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63  truction is exec
2c830 75 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74  uted either on t
2c840 68 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20  he intkey table 
2c850 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2c860 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74  contains the dat
2c870 61 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c  a for table <tbl
2c880 3e 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69  > or on one of i
2c890 74 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20  ts indexes. It. 
2c8a0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74         ** is bet
2c8b0 74 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74  ter to execute t
2c8c0 68 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65  he op on an inde
2c8d0 78 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72  x, as indexes ar
2c8e0 65 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20  e almost.       
2c8f0 20 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61   ** always sprea
2c900 64 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61  d across less pa
2c910 67 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63  ges than their c
2c920 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
2c930 6c 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  les..        */.
2c940 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
2c950 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
2c960 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
2c970 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
2c980 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
2c990 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20   const int iCsr 
2c9a0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2c9b0 3b 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ;     /* Cursor 
2c9c0 74 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a  to scan b-tree *
2c9d0 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
2c9e0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ca00 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
2ca10 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b  ble */.        K
2ca20 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
2ca30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ca40 20 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66      /* Keyinfo f
2ca50 6f 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78  or scanned index
2ca60 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65   */.        Inde
2ca70 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20  x *pBest = 0;   
2ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca90 20 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66   /* Best index f
2caa0 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ound so far */. 
2cab0 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74         int iRoot
2cac0 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20   = pTab->tnum;  
2cad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2cae0 6f 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e  oot page of scan
2caf0 6e 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20  ned b-tree */.. 
2cb00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
2cb10 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
2cb20 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
2cb30 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c       sqlite3Tabl
2cb40 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
2cb50 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30  b, pTab->tnum, 0
2cb60 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
2cb70 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72  .        /* Sear
2cb80 63 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ch for the index
2cb90 20 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f   that has the lo
2cba0 77 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a  west scan cost..
2cbb0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2cbc0 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31     ** (2011-04-1
2cbd0 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66  5) Do not do a f
2cbe0 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75  ull scan of an u
2cbf0 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a  nordered index..
2cc00 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2cc10 20 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30     ** (2013-10-0
2cc20 33 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20  3) Do not count 
2cc30 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61  the entries in a
2cc40 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a   partial index..
2cc50 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2cc60 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63     ** In practic
2cc70 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  e the KeyInfo st
2cc80 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74  ructure will not
2cc90 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20   be used. It is 
2cca0 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  only .        **
2ccb0 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20   passed to keep 
2ccc0 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70  OP_OpenRead happ
2ccd0 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
2cce0 20 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f        if( !HasRo
2ccf0 77 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73  wid(pTab) ) pBes
2cd00 74 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  t = sqlite3Prima
2cd10 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
2cd20 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49  ;.        for(pI
2cd30 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
2cd40 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
2cd50 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
2cd60 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55      if( pIdx->bU
2cd70 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20  nordered==0.    
2cd80 20 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e         && pIdx->
2cd90 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73  szIdxRow<pTab->s
2cda0 7a 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20  zTabRow.        
2cdb0 20 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72     && pIdx->pPar
2cdc0 74 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20  tIdxWhere==0.   
2cdd0 20 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65          && (!pBe
2cde0 73 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64  st || pIdx->szId
2cdf0 78 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64  xRow<pBest->szId
2ce00 78 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20  xRow).          
2ce10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2ce20 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20  Best = pIdx;.   
2ce30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ce40 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
2ce50 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
2ce60 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d    iRoot = pBest-
2ce70 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  >tnum;.         
2ce80 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69   pKeyInfo = sqli
2ce90 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65  te3KeyInfoOfInde
2cea0 78 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  x(pParse, pBest)
2ceb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2cec0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
2ced0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
2cee0 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
2cef0 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
2cf00 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
2cf10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2cf20 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f  ddOp4Int(v, OP_O
2cf30 70 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69  penRead, iCsr, i
2cf40 52 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20  Root, iDb, 1);. 
2cf50 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
2cf60 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
2cf70 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2cf80 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
2cf90 72 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  r *)pKeyInfo, P4
2cfa0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
2cfb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2cfc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2cfd0 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72  , OP_Count, iCsr
2cfe0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  , sAggInfo.aFunc
2cff0 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  [0].iMem);.     
2d000 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2d010 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
2d020 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20  , iCsr);.       
2d030 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
2d040 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  unt(pParse, pTab
2d050 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  , pBest);.      
2d060 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
2d070 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
2d080 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20  ECOUNT */.      
2d090 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65  {.        /* Che
2d0a0 63 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20  ck if the query 
2d0b0 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  is of one of the
2d0c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73   following forms
2d0d0 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
2d0e0 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54       **   SELECT
2d0f0 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e   min(x) FROM ...
2d100 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
2d110 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d  LECT max(x) FROM
2d120 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a   ....        **.
2d130 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74          ** If it
2d140 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68   is, then ask th
2d150 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  e code in where.
2d160 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  c to attempt to 
2d170 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20  sort results.   
2d180 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68       ** as if th
2d190 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45  ere was an "ORDE
2d1a0 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45  R ON x" or "ORDE
2d1b0 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61  R ON x DESC" cla
2d1c0 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  use. .        **
2d1d0 20 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61   If where.c is a
2d1e0 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72  ble to produce r
2d1f0 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e  esults sorted in
2d200 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65   this order, the
2d210 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  n.        ** add
2d220 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72   vdbe code to br
2d230 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70  eak out of the p
2d240 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61  rocessing loop a
2d250 66 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20  fter the .      
2d260 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61    ** first itera
2d270 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20  tion (since the 
2d280 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
2d290 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a  of the loop is .
2d2a0 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61          ** guara
2d2b0 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65  nteed to operate
2d2c0 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68   on the row with
2d2d0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20   the minimum or 
2d2e0 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20  maximum .       
2d2f0 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20   ** value of x, 
2d300 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71  the only row req
2d310 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20  uired)..        
2d320 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20  **.        ** A 
2d330 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73  special flag mus
2d340 74 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73  t be passed to s
2d350 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
2d360 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20  () to slightly. 
2d370 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79         ** modify
2d380 20 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c   behavior as fol
2d390 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a  lows:.        **
2d3a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
2d3b0 49 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20  If the query is 
2d3c0 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  a "SELECT min(x)
2d3d0 22 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70  ", then the loop
2d3e0 20 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20   coded by.      
2d3f0 20 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63    **     where.c
2d400 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72   should not iter
2d410 61 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c  ate over any val
2d420 75 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20  ues with a NULL 
2d430 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a  value.        **
2d440 20 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20       for x..    
2d450 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2d460 2a 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69  *   + The optimi
2d470 7a 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72  zer code in wher
2d480 65 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74  e.c (the thing t
2d490 68 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63  hat decides whic
2d4a0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  h.        **    
2d4b0 20 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65   index or indice
2d4c0 73 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64  s to use) should
2d4d0 20 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65   place a differe
2d4e0 6e 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a  nt priority on .
2d4f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73          **     s
2d500 61 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f  atisfying the 'O
2d510 52 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20  RDER BY' clause 
2d520 74 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20  than it does in 
2d530 6f 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20  other cases..   
2d540 20 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65       **     Refe
2d550 72 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f  r to code and co
2d560 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e  mments in where.
2d570 63 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20  c for details.. 
2d580 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2d590 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e    ExprList *pMin
2d5a0 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Max = 0;.       
2d5b0 20 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45   u8 flag = WHERE
2d5c0 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b  _ORDERBY_NORMAL;
2d5d0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
2d5e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72    assert( p->pGr
2d5f0 6f 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20  oupBy==0 );.    
2d600 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67      assert( flag
2d610 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
2d620 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30  f( p->pHaving==0
2d630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c   ){.          fl
2d640 61 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79  ag = minMaxQuery
2d650 28 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69  (&sAggInfo, &pMi
2d660 6e 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  nMax);.        }
2d670 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d680 20 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69   flag==0 || (pMi
2d690 6e 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d  nMax!=0 && pMinM
2d6a0 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b  ax->nExpr==1) );
2d6b0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c  ..        if( fl
2d6c0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
2d6d0 70 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65  pMinMax = sqlite
2d6e0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
2d6f0 20 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20   pMinMax, 0);.  
2d700 20 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70          pDel = p
2d710 4d 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20  MinMax;.        
2d720 20 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26    if( pMinMax &&
2d730 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
2d740 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
2d750 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e    pMinMax->a[0].
2d760 73 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67  sortOrder = flag
2d770 21 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  !=WHERE_ORDERBY_
2d780 4d 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20  MIN ?1:0;.      
2d790 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61        pMinMax->a
2d7a0 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20  [0].pExpr->op = 
2d7b0 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
2d7c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d7d0 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  .  .        /* T
2d7e0 68 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66  his case runs if
2d7f0 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68   the aggregate h
2d800 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63  as no GROUP BY c
2d810 6c 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20  lause.  The.    
2d820 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e      ** processin
2d830 67 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65  g is much simple
2d840 72 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  r since there is
2d850 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72   only a single r
2d860 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ow.        ** of
2d870 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20   output..       
2d880 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65   */.        rese
2d890 74 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  tAccumulator(pPa
2d8a0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2d8b0 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20  .        pWInfo 
2d8c0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
2d8d0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
2d8e0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d  List, pWhere, pM
2d8f0 69 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b  inMax,0,flag,0);
2d900 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49  .        if( pWI
2d910 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
2d920 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2d930 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
2d940 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  el);.          g
2d950 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
2d960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d970 20 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61    updateAccumula
2d980 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2d990 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
2d9a0 61 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d  assert( pMinMax=
2d9b0 3d 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e  =0 || pMinMax->n
2d9c0 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
2d9d0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2d9e0 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2d9f0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nfo) ){.        
2da00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2da10 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2da20 30 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  0, sqlite3WhereB
2da30 72 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f  reakLabel(pWInfo
2da40 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  ));.          Vd
2da50 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25  beComment((v, "%
2da60 73 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20  s() by index",. 
2da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2da80 66 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45  flag==WHERE_ORDE
2da90 52 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d  RBY_MIN?"min":"m
2daa0 61 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ax")));.        
2dab0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2dac0 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2dad0 29 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  );.        final
2dae0 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28  izeAggFunctions(
2daf0 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
2db00 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  o);.      }..   
2db10 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
2db20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2db30 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2db40 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45  , pHaving, addrE
2db50 6e 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  nd, SQLITE_JUMPI
2db60 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65  FNULL);.      se
2db70 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
2db80 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
2db90 73 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20  st, -1, 0, 0, . 
2dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbb0 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
2dbc0 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
2dbd0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2dbe0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2dbf0 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
2dc00 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2dc10 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
2dc20 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
2dc30 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
2dc40 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
2dc50 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2dc60 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
2dc70 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
2dc80 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
2dc90 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
2dca0 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
2dcb0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
2dcc0 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
2dcd0 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
2dce0 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
2dcf0 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
2dd00 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
2dd10 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
2dd20 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
2dd30 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
2dd40 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2dd50 65 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45 52  e(pParse, "ORDER
2dd60 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72   BY");.    gener
2dd70 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
2dd80 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74  se, p, v, pEList
2dd90 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
2dda0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
2ddb0 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
2ddc0 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
2ddd0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2dde0 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
2ddf0 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
2de00 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
2de10 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
2de20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
2de30 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
2de40 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
2de50 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
2de60 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
2de70 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
2de80 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
2de90 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
2dea0 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
2deb0 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
2dec0 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
2ded0 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
2dee0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2def0 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
2df00 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
2df10 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65  ctId);..  /* Ide
2df20 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
2df30 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66  es if results of
2df40 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
2df50 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  to be output..  
2df60 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2df70 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d  ITE_OK && pDest-
2df80 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
2df90 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
2dfa0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
2dfb0 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2dfc0 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
2dfd0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2dfe0 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  , sAggInfo.aCol)
2dff0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2e000 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
2e010 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Func);.  return 
2e020 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
2e030 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2e040 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f  _TREE_EXPLAIN)./
2e050 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
2e060 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64  human-readable d
2e070 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20  escription of a 
2e080 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
2e090 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2e0a0 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65  d explainOneSele
2e0b0 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  ct(Vdbe *pVdbe, 
2e0c0 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71  Select *p){.  sq
2e0d0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2e0e0 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43  tf(pVdbe, "SELEC
2e0f0 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  T ");.  if( p->s
2e100 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
2e110 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
2e120 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ate) ){.    if( 
2e130 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2e140 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
2e150 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e160 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2e170 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20  DISTINCT ");.   
2e180 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65   }.    if( p->se
2e190 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2e1a0 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  egate ){.      s
2e1b0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2e1c0 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f  ntf(pVdbe, "agg_
2e1d0 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20  flag ");.    }. 
2e1e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e1f0 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20  nNL(pVdbe);.    
2e200 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2e210 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20 20  intf(pVdbe, "   
2e220 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
2e230 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2e240 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73  (pVdbe, p->pELis
2e250 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
2e260 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2e270 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20   if( p->pSrc && 
2e280 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b  p->pSrc->nSrc ){
2e290 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2e2a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2e2b0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f  intf(pVdbe, "FRO
2e2c0 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  M ");.    sqlite
2e2d0 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64  3ExplainPush(pVd
2e2e0 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  be);.    for(i=0
2e2f0 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ; i<p->pSrc->nSr
2e300 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
2e310 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2e320 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
2e330 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
2e340 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e350 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b  Printf(pVdbe, "{
2e360 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d  %d,*} = ", pItem
2e370 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2e380 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
2e390 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
2e3a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
2e3b0 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49 74 65  lect(pVdbe, pIte
2e3c0 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
2e3d0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2e3e0 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
2e3f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e400 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2e410 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70  (tabname=%s)", p
2e420 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2e430 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2e440 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
2e450 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
2e460 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2e470 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2e480 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  , "%s", pItem->z
2e490 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
2e4a0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2e4b0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
2e4c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e4d0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2e4e0 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  (AS %s)", pItem-
2e4f0 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
2e500 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
2e510 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
2e520 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20  _LEFT ){.       
2e530 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e540 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c  rintf(pVdbe, " L
2e550 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20  EFT-JOIN");.    
2e560 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2e570 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2e580 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2e590 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70  ite3ExplainPop(p
2e5a0 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
2e5b0 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
2e5c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e5d0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57  Printf(pVdbe, "W
2e5e0 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c  HERE ");.    sql
2e5f0 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
2e600 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65  pVdbe, p->pWhere
2e610 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2e620 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2e630 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72    }.  if( p->pGr
2e640 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
2e650 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2e660 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42  f(pVdbe, "GROUPB
2e670 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Y ");.    sqlite
2e680 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2e690 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75  (pVdbe, p->pGrou
2e6a0 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
2e6b0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2e6c0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2e6d0 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73  pHaving ){.    s
2e6e0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2e6f0 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41 56 49  ntf(pVdbe, "HAVI
2e700 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  NG ");.    sqlit
2e710 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2e720 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  dbe, p->pHaving)
2e730 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2e740 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2e750 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
2e760 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
2e770 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2e780 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59  (pVdbe, "ORDERBY
2e790 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2e7a0 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2e7b0 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72  pVdbe, p->pOrder
2e7c0 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
2e7d0 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2e7e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2e7f0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
2e800 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2e810 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20  f(pVdbe, "LIMIT 
2e820 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2e830 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65  xplainExpr(pVdbe
2e840 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
2e850 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e860 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
2e870 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
2e880 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2e890 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2e8a0 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20  e, "OFFSET ");. 
2e8b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e8c0 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e  nExpr(pVdbe, p->
2e8d0 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  pOffset);.    sq
2e8e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2e8f0 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  Vdbe);.  }.}.voi
2e900 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
2e910 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64  Select(Vdbe *pVd
2e920 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  be, Select *p){.
2e930 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
2e940 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e950 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28  Printf(pVdbe, "(
2e960 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a  null-select)");.
2e970 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2e980 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 50 72 69    while( p->pPri
2e990 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  or ){.    p->pPr
2e9a0 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  ior->pNext = p;.
2e9b0 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f      p = p->pPrio
2e9c0 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
2e9d0 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62  ExplainPush(pVdb
2e9e0 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e);.  while( p )
2e9f0 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65  {.    explainOne
2ea00 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 29  Select(pVdbe, p)
2ea10 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  ;.    p = p->pNe
2ea20 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  xt;.    if( p==0
2ea30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
2ea40 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2ea50 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Vdbe);.    sqlit
2ea60 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2ea70 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20 73  pVdbe, "%s\n", s
2ea80 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
2ea90 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p));.  }.  sqlit
2eaa0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2eab0 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a 20  pVdbe, "END");. 
2eac0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2ead0 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a  op(pVdbe);.}../*
2eae0 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75   End of the stru
2eaf0 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e  cture debug prin
2eb00 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a  ting code.******
2eb10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb50 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
2eb60 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
2eb70 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
2eb80 50 4c 41 49 4e 29 20 2a 2f 0a                    PLAIN) */.