/ Hex Artifact Content
Login

Artifact 11c02c82a6f3cb8a491452fc7474a568a48c64ef:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  fset);.  sqlite3
0400: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0410: 2d 3e 70 57 69 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pWith);.}../*.
0420: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0430: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0440: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0450: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0460: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0470: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0480: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0490: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
04a0: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
04b0: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
04c0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04d0: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
04e0: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
04f0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0500: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0510: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0520: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0530: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0540: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0550: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0560: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0570: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0580: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0590: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
05a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
05b0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
05c0: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
05d0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
05e0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
05f0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0600: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0610: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0620: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0630: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0640: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0650: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0660: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0670: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0680: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0690: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
06a0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
06b0: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
06c0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
06d0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
06e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
06f0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0700: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0710: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0720: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0730: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0740: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0750: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0760: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0770: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0780: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0790: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
07a0: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
07b0: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07c0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07d0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07f0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0810: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0820: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0830: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0840: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0850: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0860: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0870: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0880: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0890: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
08a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
08b0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08c0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08d0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0900: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0910: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0920: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0930: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0940: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0950: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0960: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0970: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0980: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0990: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
09a0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09c0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09e0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09f0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0a00: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
0a10: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a20: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a30: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
0a40: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
0a50: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
0a60: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
0a70: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
0a80: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
0a90: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
0aa0: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
0ab0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0ac0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0ad0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ae0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0af0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0b00: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  ] = -1;.  if( db
0b10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0b20: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
0b30: 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ct(db, pNew);.  
0b40: 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61    if( pNew!=&sta
0b50: 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62  ndin ) sqlite3Db
0b60: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
0b70: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
0b80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
0b90: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
0ba0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
0bb0: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
0bc0: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
0bd0: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
0be0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0bf0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0c00: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0c10: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0c20: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0c40: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0c50: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0c60: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0c70: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0c80: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0c90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0ca0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0cb0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0cc0: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
0cd0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0ce0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0cf0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0d00: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0d10: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0d20: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0d30: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0d40: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0d50: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0d60: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0d70: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
0d80: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
0d90: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0da0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0db0: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0dc0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0dd0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0de0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0df0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0e00: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0e10: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0e20: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0e30: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0e40: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0e50: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0e60: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0e70: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0e80: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0e90: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
0ea0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0eb0: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0ec0: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0ed0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0ee0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0ef0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0f00: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
0f30: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
0f40: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
0f50: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0f60: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
0f70: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
0f80: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
0f90: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0fa0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
0fb0: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
0fc0: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
0fd0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
0fe0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
0ff0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
1000: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
1010: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
1020: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1030: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1040: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1050: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1060: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1070: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1080: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1090: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
10a0: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
10b0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
10c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
10d0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
10e0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
1110: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
1120: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1130: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1140: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1150: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1160: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1170: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1180: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1190: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
11a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
11b0: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
11c0: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
11d0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
11e0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
11f0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
1200: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
1210: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
1220: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1230: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1240: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1250: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1260: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1270: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1280: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1290: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
12a0: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
12b0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
12c0: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
12d0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
12e0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
12f0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1300: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1310: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1320: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1340: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1350: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1360: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1370: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1380: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1390: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
13a0: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
13b0: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
13c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
13e0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
13f0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1400: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1410: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1420: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1430: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1440: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1450: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1460: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1470: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1480: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1490: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14a0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
14b0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
14c0: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
14d0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
14e0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
14f0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1500: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1510: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1520: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1530: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1540: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1550: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1560: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1570: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1580: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1590: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
15a0: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
15b0: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
15c0: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
15d0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
15e0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
15f0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1600: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1610: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1620: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1630: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1640: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1650: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1670: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1680: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1690: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
16a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
16b0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
16c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
16d0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
16e0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
16f0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1700: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1710: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1720: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1730: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1740: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1750: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1760: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1770: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1780: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1790: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
17a0: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
17b0: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
17c0: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
17d0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
17e0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
17f0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1800: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1810: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1820: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
1830: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
1840: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
1850: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
1860: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
1870: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
1880: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
1890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18a0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
18b0: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
18c0: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
18d0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
18e0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
18f0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
1900: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
1910: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
1920: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
1930: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
1940: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
1950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1960: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
1970: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
1980: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
1990: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
19a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
19b0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
19c0: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
19d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
19e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19f0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
1a00: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
1a10: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
1a20: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
1a30: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
1a40: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
1a50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
1a60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
1a70: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
1a80: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
1a90: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
1aa0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
1ab0: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
1ac0: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
1ad0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
1ae0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
1af0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1b00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
1b20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1b30: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
1b40: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
1b50: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
1b60: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
1b70: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
1b80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1b90: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
1ba0: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
1bb0: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
1bc0: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
1bd0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1be0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
1bf0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
1c00: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
1c10: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
1c20: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
1c30: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
1c40: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
1c50: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
1c60: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
1c70: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
1c80: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
1c90: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
1ca0: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
1cb0: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1cc0: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
1cd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1cf0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d00: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1d30: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
1d40: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
1d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1d70: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
1d80: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
1d90: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
1da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1db0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1dc0: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
1dd0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1de0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
1df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1e00: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
1e10: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
1e20: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1e50: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
1e60: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
1e70: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e90: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
1ea0: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
1eb0: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
1ee0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
1ef0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
1f00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1f10: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
1f20: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
1f30: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
1f40: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
1f50: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
1f60: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
1f70: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1f80: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
1f90: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
1fa0: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
1fb0: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
1fc0: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
1fd0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
1fe0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
1ff0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
2000: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
2010: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
2020: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2030: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2040: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2050: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2060: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2070: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2080: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2090: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20a0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
20b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20c0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
20e0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
20f0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2100: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2110: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2120: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2130: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2140: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2150: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2160: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2170: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2180: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2190: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
21a0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
21b0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
21c0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
21d0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
21e0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
21f0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2200: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2210: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2220: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2230: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2240: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2250: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2260: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2270: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2280: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2290: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
22a0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
22b0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
22c0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
22d0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
22e0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
22f0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2300: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2310: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2320: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2330: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2340: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2350: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2360: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2370: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2380: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2390: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
23a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
23b0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
23c0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
23e0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
23f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2400: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2410: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2420: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2430: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2440: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2450: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2460: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2470: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2480: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2490: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
24a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
24b0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
24c0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
24d0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
24e0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
24f0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2500: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2510: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2520: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2530: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2540: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2550: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2560: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2570: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2580: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2590: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
25a0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
25b0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
25c0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
25d0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
25e0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
25f0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2600: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2610: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2620: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2630: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2640: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2650: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2660: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2670: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2680: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2690: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
26a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
26b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
26c0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
26d0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
26e0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
26f0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2700: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2710: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2720: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2730: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2740: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2750: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2770: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2780: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2790: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
27a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
27b0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
27c0: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
27d0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
27e0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
27f0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2800: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2810: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2820: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
2830: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
2840: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
2850: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
2860: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
2870: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
2880: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
2890: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
28a0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
28b0: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
28c0: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
28d0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
28e0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
28f0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
2900: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
2910: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
2920: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
2930: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
2940: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
2950: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
2960: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
2970: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
2980: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
2990: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
29a0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
29b0: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
29c0: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
29d0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29e0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29f0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
2a00: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2a10: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
2a20: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
2a30: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2a40: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
2a70: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a80: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
2a90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ab0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
2ac0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ad0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
2ae0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
2af0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
2b00: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b10: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
2b20: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
2b30: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
2b40: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
2b50: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
2b60: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
2b70: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
2b80: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
2b90: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
2ba0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
2bc0: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
2bd0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
2be0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
2bf0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
2c00: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
2c10: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
2c20: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
2c30: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
2c40: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
2c50: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
2c60: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2c70: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
2c80: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
2c90: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
2ca0: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
2cb0: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
2cc0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
2cd0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
2ce0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
2cf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d00: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
2d10: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
2d20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
2d30: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
2d40: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
2d50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
2d70: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
2d80: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
2d90: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
2da0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
2db0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
2dc0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
2dd0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2de0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
2df0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
2e00: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
2e10: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
2e20: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
2e30: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
2e40: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
2e50: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
2e60: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
2e70: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
2e80: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
2e90: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
2ea0: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
2eb0: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
2ec0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
2ed0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
2ee0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
2ef0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
2f00: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
2f10: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
2f20: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2f30: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
2f40: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
2f50: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2f70: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
2f80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2fa0: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
2fb0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2fc0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2fd0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
2fe0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2ff0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
3000: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
3010: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3020: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3030: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3040: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3050: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3060: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3080: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3090: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
30a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
30b0: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
30c0: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
30d0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
30e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
30f0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
3100: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
3110: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
3120: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3130: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3140: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3150: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3160: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3170: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3180: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3190: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
31a0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
31b0: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
31c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
31d0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
31e0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
31f0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
3200: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
3210: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
3220: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3230: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3240: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3250: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3260: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3270: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3280: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3290: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
32a0: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
32b0: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
32c0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
32d0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
32e0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
32f0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3300: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3310: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3320: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3330: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3340: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3350: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3360: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3370: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3380: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
33a0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
33b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
33c0: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
33d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
33e0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
33f0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3400: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3410: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3430: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3440: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3450: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3460: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3470: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3480: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3490: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
34a0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
34b0: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
34c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
34d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
34e0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
34f0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3500: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3510: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3520: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3530: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3540: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3550: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3560: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3570: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3590: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
35a0: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
35b0: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
35c0: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
35d0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
35e0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
35f0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3620: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3630: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3640: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3650: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3680: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3690: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
36a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
36b0: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
36c0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
36d0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
36e0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
36f0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
3700: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
3710: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
3720: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
3730: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3740: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3750: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3760: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
3770: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
3780: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
3790: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
37a0: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
37b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
37c0: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20  /.  int regData 
37d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37e0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
37f0: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
3800: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3810: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3820: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
3830: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3840: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3850: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3860: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
3870: 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67  pr+2);.  int reg
3880: 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
3890: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
38a0: 65 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20  e);.  int op;.  
38b0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
38c0: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
38d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
38e0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
38f0: 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61   pOrderBy, regBa
3900: 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  se, 0);.  sqlite
3910: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3920: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
3930: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3940: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
3950: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3960: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
3970: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
3980: 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71  Expr+1, 1);.  sq
3990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
39a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
39b0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
39c0: 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29   + 2, regRecord)
39d0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  ;.  if( pSelect-
39e0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
39f0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
3a00: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
3a10: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
3a20: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
3a30: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
3a40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3a50: 20 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69   op, pOrderBy->i
3a60: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
3a70: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
3a80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
3a90: 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
3aa0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
3ab0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
3ac0: 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  e, regBase, nExp
3ad0: 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  r+2);.  if( pSel
3ae0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ect->iLimit ){. 
3af0: 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
3b00: 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  dr2;.    int iLi
3b10: 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65  mit;.    if( pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b  lect->iOffset ){
3b30: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
3b40: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
3b50: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
3b60: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
3b70: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
3b80: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d     }.    addr1 =
3b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ba0: 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p1(v, OP_IfZero,
3bb0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71   iLimit);.    sq
3bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3bd0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c  v, OP_AddImm, iL
3be0: 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  imit, -1);.    a
3bf0: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
3c00: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
3c10: 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oto);.    sqlite
3c20: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3c30: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
3c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3c50: 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65  , OP_Last, pOrde
3c60: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
3c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3c80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
3c90: 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  te, pOrderBy->iE
3ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
3cb0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3cc0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
3cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
3ce0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
3cf0: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
3d00: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
3d10: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
3d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3d30: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3d40: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
3d50: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
3d60: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
3d70: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3d80: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3d90: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
3da0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
3db0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
3dc0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
3dd0: 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74  iOffset && iCont
3de0: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
3df0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
3e00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3e10: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
3e20: 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20  iOffset, -1);.  
3e30: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
3e40: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
3e50: 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73  _IfNeg, p->iOffs
3e60: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
3e70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3e80: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
3e90: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
3ea0: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20  mment((v, "skip 
3eb0: 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29  OFFSET records")
3ec0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3ed0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3ee0: 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  dr);.  }.}../*.*
3ef0: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
3f00: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
3f10: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
3f20: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
3f30: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
3f40: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
3f50: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
3f60: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
3f70: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
3f80: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
3f90: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
3fa0: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
3fb0: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
3fc0: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
3fd0: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
3fe0: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
3ff0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
4000: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
4010: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
4020: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
4030: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
4040: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
4050: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
4060: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
4070: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
4080: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4090: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
40a0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
40b0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
40c0: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
40d0: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
40e0: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
40f0: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
4100: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
4110: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
4120: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
4130: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
4140: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
4150: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4160: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
4170: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
4180: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
4190: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
41a0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
41b0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
41c0: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
41d0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
41e0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
41f0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
4200: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
4210: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d  , addrRepeat, iM
4220: 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65  em, N);.  sqlite
4230: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4240: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
4250: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
4260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4270: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
4280: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
4290: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
42a0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
42b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
42c0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
42d0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
42e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
42f0: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
4300: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
4310: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
4320: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
4330: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
4340: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
4350: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
4360: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
4370: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
4380: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
4390: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
43a0: 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a   used to occur.*
43b0: 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  * in multiple pl
43c0: 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f  aces.  (The erro
43d0: 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e  r only occurs in
43e0: 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20   one place now, 
43f0: 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e  but we.** retain
4400: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
4410: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65  to minimize code
4420: 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f   disruption.).*/
4430: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
4440: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
4450: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
4460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4470: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
4480: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
4490: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
44a0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
44b0: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
44c0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
44d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
44e0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
44f0: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
4500: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
4510: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4520: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
4530: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
4540: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
4550: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
4560: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4570: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
4580: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
4590: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
45a0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
45b0: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
45c0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
45d0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
45e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
45f0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23  eturn 0;.  }.}.#
4600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  endif../*.** An 
4610: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
4620: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74  following object
4630: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f   is used to reco
4640: 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  rd information a
4650: 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70  bout.** how to p
4660: 72 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49  rocess the DISTI
4670: 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20  NCT keyword, to 
4680: 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67  simplify passing
4690: 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   that informatio
46a0: 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65  n.** into the se
46b0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
46c0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65  routine..*/.type
46d0: 64 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69  def struct Disti
46e0: 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43  nctCtx DistinctC
46f0: 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69  tx;.struct Disti
4700: 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73  nctCtx {.  u8 is
4710: 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  Tnct;      /* Tr
4720: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
4730: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
4740: 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54  esent */.  u8 eT
4750: 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e  nctType;   /* On
4760: 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44  e of the WHERE_D
4770: 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74  ISTINCT_* operat
4780: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62  ors */.  int tab
4790: 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65  Tnct;    /* Ephe
47a0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64  meral table used
47b0: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
47c0: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
47d0: 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a  t addrTnct;   /*
47e0: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
47f0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63  penEphemeral opc
4800: 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20  ode for tabTnct 
4810: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.};../*.** Thi
4820: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
4830: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
4840: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
4850: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
4860: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
4870: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 69 73  .** If srcTab is
4880: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
4890: 74 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65  the pEList expre
48a0: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76  ssions.** are ev
48b0: 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72  aluated in order
48c0: 20 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61   to get the data
48d0: 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20   for this row.  
48e0: 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a 2a 20  If srcTab is.** 
48f0: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20 74 68  zero or more, th
4900: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
4910: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
4920: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
4930: 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67 65 74   only .** to get
4940: 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d 6e 73 20   number columns 
4950: 61 6e 64 20 74 68 65 20 64 61 74 61 74 79 70 65  and the datatype
4960: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
4970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4980: 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
4990: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
49a0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
49b0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
49c0: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
49d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
49e0: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  * The complete s
49f0: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
4a00: 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20  being coded */. 
4a10: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
4a20: 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  t,       /* List
4a30: 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67   of values being
4a40: 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20   extracted */.  
4a50: 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20 20 20  int srcTab,     
4a60: 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20          /* Pull 
4a70: 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74  data from this t
4a80: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
4a90: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
4aa0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c    /* If not NULL
4ab0: 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73 20 75  , sort results u
4ac0: 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20 2a 2f  sing this key */
4ad0: 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 2a  .  DistinctCtx *
4ae0: 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20 49 66  pDistinct, /* If
4af0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66 6f 20   not NULL, info 
4b00: 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63 65 73  on how to proces
4b10: 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20  s DISTINCT */.  
4b20: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
4b30: 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 74  t,      /* How t
4b40: 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74 68 65  o dispose of the
4b50: 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69 6e   results */.  in
4b60: 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20 20 20  t iContinue,    
4b70: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4b80: 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77  re to continue w
4b90: 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a  ith next row */.
4ba0: 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20    int iBreak    
4bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4bc0: 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
4bd0: 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  out of the inner
4be0: 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 56 64   loop */.){.  Vd
4bf0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
4c00: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
4c10: 20 20 69 6e 74 20 68 61 73 44 69 73 74 69 6e 63    int hasDistinc
4c20: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  t;        /* Tru
4c30: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
4c40: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
4c50: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  sent */.  int re
4c60: 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  gResult;        
4c70: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
4c80: 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69 6e 67  f memory holding
4c90: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
4ca0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4cb0: 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f 2a 20  st->eDest;   /* 
4cc0: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
4cd0: 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 69  f results */.  i
4ce0: 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74  nt iParm = pDest
4cf0: 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20 46 69  ->iSDParm; /* Fi
4d00: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
4d10: 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f 64 20  disposal method 
4d20: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
4d30: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
4d40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4d50: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
4d60: 0a 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a  .  assert( v );.
4d70: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4d80: 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74  !=0 );.  hasDist
4d90: 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74  inct = pDistinct
4da0: 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54   ? pDistinct->eT
4db0: 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f  nctType : WHERE_
4dc0: 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
4dd0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4de0: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
4df0: 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   ){.    codeOffs
4e00: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4e10: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
4e20: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
4e30: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
4e40: 20 20 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70    nResultCol = p
4e50: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
4e60: 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
4e70: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 73 74  ==0 ){.    pDest
4e80: 2d 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65  ->iSdst = pParse
4e90: 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 44  ->nMem+1;.    pD
4ea0: 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 6e 52 65  est->nSdst = nRe
4eb0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 70 50 61  sultCol;.    pPa
4ec0: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
4ed0: 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20 69 66 28  sultCol;.    if(
4ee0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 51 75 65 75   eDest==SRT_Queu
4ef0: 65 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e ) pParse->nMem
4f00: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20  ++;.  }else{ .  
4f10: 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
4f20: 3e 6e 53 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43  >nSdst==nResultC
4f30: 6f 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ol );.    assert
4f40: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 51 75 65  ( eDest!=SRT_Que
4f50: 75 65 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52  ue );.  }.  regR
4f60: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
4f70: 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54  Sdst;.  if( srcT
4f80: 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ab>=0 ){.    for
4f90: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
4fa0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
4fb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4fc0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
4fd0: 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65  srcTab, i, regRe
4fe0: 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56  sult+i);.      V
4ff0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5000: 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  %s", pEList->a[i
5010: 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
5020: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
5030: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
5040: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
5050: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
5060: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
5070: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
5080: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
5090: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
50a0: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
50b0: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
50c0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
50d0: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
50e0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72  Parse, pEList, r
50f0: 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20  egResult,.      
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5110: 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52        (eDest==SR
5120: 54 5f 4f 75 74 70 75 74 29 3f 53 51 4c 49 54 45  T_Output)?SQLITE
5130: 5f 45 43 45 4c 5f 44 55 50 3a 30 29 3b 0a 20 20  _ECEL_DUP:0);.  
5140: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
5150: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
5160: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
5170: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
5180: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
5190: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
51a0: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
51b0: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
51c0: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
51d0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
51e0: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
51f0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69  tinct ){.    swi
5200: 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  tch( pDistinct->
5210: 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20  eTnctType ){.   
5220: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
5230: 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
5240: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
5250: 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20   *pOp;          
5260: 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72    /* No longer r
5270: 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65  equired OpenEphe
5280: 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a  meral instr. */.
5290: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d          int iJum
52a0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
52b0: 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
52c0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ion */.        i
52d0: 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
52e0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
52f0: 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a  us row content *
5300: 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  /..        /* Al
5310: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
5320: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
5330: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67  w */.        reg
5340: 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
5350: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70  Mem+1;.        p
5360: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
5370: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20  ResultCol;..    
5380: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
5390: 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
53a0: 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  al coded earlier
53b0: 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20   to an OP_Null. 
53c0: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74         ** sets t
53d0: 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62  he MEM_Cleared b
53e0: 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  it on the first 
53f0: 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a  register of the.
5400: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
5410: 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73  ous value.  This
5420: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
5430: 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61  OP_Ne below to a
5440: 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a  lways.        **
5450: 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72   fail on the fir
5460: 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
5470: 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66  the loop even if
5480: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
5490: 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c     ** row is all
54a0: 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20   NULLs..        
54b0: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
54c0: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
54d0: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
54e0: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
54f0: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
5500: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44  3VdbeGetOp(v, pD
5510: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
5520: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  t);.        pOp-
5530: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c  >opcode = OP_Nul
5540: 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  l;.        pOp->
5550: 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  p1 = 1;.        
5560: 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65  pOp->p2 = regPre
5570: 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d  v;..        iJum
5580: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
5590: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
55a0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20  nResultCol;.    
55b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
55c0: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
55d0: 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  .          CollS
55e0: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
55f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
5600: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
5610: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
5620: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73        if( i<nRes
5630: 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ultCol-1 ){.    
5640: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5650: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5660: 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c  Ne, regResult+i,
5670: 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b   iJump, regPrev+
5680: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  i);.          }e
5690: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
56a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
56b0: 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67  p3(v, OP_Eq, reg
56c0: 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69  Result+i, iConti
56d0: 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b  nue, regPrev+i);
56e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
56f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5700: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
5710: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
5720: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
5730: 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
5740: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5750: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
5760: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EQ);.        }. 
5770: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
5780: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
5790: 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20  tAddr(v)==iJump 
57a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
57b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
57c0: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75  OP_Copy, regResu
57d0: 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65  lt, regPrev, nRe
57e0: 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  sultCol-1);.    
57f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5800: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
5810: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
5820: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
5830: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5840: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
5850: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
5860: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
5870: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
5880: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
5890: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
58a0: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
58b0: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
58c0: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
58d0: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
58e0: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
58f0: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
5900: 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43  ntinue, nResultC
5910: 6f 6c 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  ol, regResult);.
5920: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5930: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5940: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
5950: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
5960: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
5970: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
5980: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
5990: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
59a0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
59b0: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
59c0: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
59d0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
59e0: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
59f0: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
5a00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5a10: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 23 69 66  POUND_SELECT.#if
5a20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5a30: 5f 43 54 45 0a 20 20 20 20 63 61 73 65 20 53 52  _CTE.    case SR
5a40: 54 5f 51 75 65 75 65 3a 20 7b 0a 20 20 20 20 20  T_Queue: {.     
5a50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5a60: 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63  p2(v, OP_Sequenc
5a70: 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65 73  e, iParm, regRes
5a80: 75 6c 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  ult+nResultCol);
5a90: 0a 20 20 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  .      nResultCo
5aa0: 6c 2b 2b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  l++;.      /* Fa
5ab0: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
5ac0: 53 52 54 5f 55 6e 69 6f 6e 20 2a 2f 0a 20 20 20  SRT_Union */.   
5ad0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f   }.    case SRT_
5ae0: 44 69 73 74 51 75 65 75 65 3a 0a 23 65 6e 64 69  DistQueue:.#endi
5af0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5b00: 5f 43 54 45 20 2a 2f 0a 20 20 20 20 63 61 73 65  _CTE */.    case
5b10: 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20   SRT_Union: {.  
5b20: 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
5b30: 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
5b40: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
5b50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
5b60: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
5b70: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
5b80: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
5b90: 6c 2c 20 72 31 29 3b 0a 23 69 66 6e 64 65 66 20  l, r1);.#ifndef 
5ba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
5bb0: 20 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d        if( eDest=
5bc0: 3d 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29  =SRT_DistQueue )
5bd0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
5be0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  the destination 
5bf0: 69 73 20 44 69 73 74 51 75 65 75 65 2c 20 74 68  is DistQueue, th
5c00: 65 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d  en cursor (iParm
5c10: 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20  +1) is open.    
5c20: 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73 65 63 6f      ** on a seco
5c30: 6e 64 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  nd ephemeral ind
5c40: 65 78 20 74 68 61 74 20 68 6f 6c 64 73 20 61 6c  ex that holds al
5c50: 6c 20 76 61 6c 75 65 73 20 65 76 65 72 79 20 70  l values every p
5c60: 72 65 76 69 6f 75 73 6c 79 0a 20 20 20 20 20 20  reviously.      
5c70: 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 74 68    ** added to th
5c80: 65 20 71 75 65 75 65 2e 20 20 4f 6e 6c 79 20 61  e queue.  Only a
5c90: 64 64 20 74 68 69 73 20 6e 65 77 20 76 61 6c 75  dd this new valu
5ca0: 65 20 69 66 20 69 74 20 68 61 73 20 6e 65 76 65  e if it has neve
5cb0: 72 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 20  r before.       
5cc0: 20 2a 2a 20 62 65 65 6e 20 61 64 64 65 64 20 2a   ** been added *
5cd0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  /.        int ad
5ce0: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
5cf0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
5d00: 20 33 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   3;.        sqli
5d10: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
5d20: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
5d30: 61 72 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c  arm+1, addr, r1,
5d40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
5d50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
5d60: 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
5d70: 69 50 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20  iParm+1, r1);.  
5d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
5d90: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
5da0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
5db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a  QLITE_OMIT_CTE *
5dc0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
5dd0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
5de0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
5df0: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
5e00: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
5e10: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
5e20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5e30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 73 74   }..    /* Const
5e40: 72 75 63 74 20 61 20 72 65 63 6f 72 64 20 66 72  ruct a record fr
5e50: 6f 6d 20 74 68 65 20 71 75 65 72 79 20 72 65 73  om the query res
5e60: 75 6c 74 2c 20 62 75 74 20 69 6e 73 74 65 61 64  ult, but instead
5e70: 20 6f 66 0a 20 20 20 20 2a 2a 20 73 61 76 69 6e   of.    ** savin
5e80: 67 20 74 68 61 74 20 72 65 63 6f 72 64 2c 20 75  g that record, u
5e90: 73 65 20 69 74 20 61 73 20 61 20 6b 65 79 20 74  se it as a key t
5ea0: 6f 20 64 65 6c 65 74 65 20 65 6c 65 6d 65 6e 74  o delete element
5eb0: 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  s from.    ** th
5ec0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
5ed0: 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a  e iParm..    */.
5ee0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 63      case SRT_Exc
5ef0: 65 70 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ept: {.      sql
5f00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5f10: 2c 20 4f 50 5f 49 64 78 44 65 6c 65 74 65 2c 20  , OP_IdxDelete, 
5f20: 69 50 61 72 6d 2c 20 72 65 67 52 65 73 75 6c 74  iParm, regResult
5f30: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20  , nResultCol);. 
5f40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5f50: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
5f60: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
5f70: 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 20 20 20 20  _SELECT */..    
5f80: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  /* Store the res
5f90: 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69 6e  ult as data usin
5fa0: 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a  g a unique key..
5fb0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5fc0: 53 52 54 5f 44 69 73 74 54 61 62 6c 65 3a 0a 20  SRT_DistTable:. 
5fd0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
5fe0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
5ff0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
6000: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
6010: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6020: 72 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  rse);.      test
6030: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
6040: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
6050: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
6060: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
6070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6080: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
6090: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
60a0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
60b0: 2c 20 72 31 29 3b 0a 23 69 66 6e 64 65 66 20 53  , r1);.#ifndef S
60c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
60d0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
60e0: 53 52 54 5f 44 69 73 74 54 61 62 6c 65 20 29 7b  SRT_DistTable ){
60f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
6100: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
6110: 73 20 44 69 73 74 54 61 62 6c 65 2c 20 74 68 65  s DistTable, the
6120: 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b  n cursor (iParm+
6130: 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20  1) is open.     
6140: 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65     ** on an ephe
6150: 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20  meral index. If 
6160: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
6170: 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
6180: 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  nt.        ** in
6190: 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e   the index, do n
61a0: 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74  ot write it to t
61b0: 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f  he output. If no
61c0: 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20  t, add the.     
61d0: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f     ** current ro
61e0: 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61  w to the index a
61f0: 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  nd proceed with 
6200: 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68  writing it to th
6210: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
6220: 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c  put table as wel
6230: 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  l.  */.        i
6240: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
6250: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
6260: 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20  (v) + 4;.       
6270: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6280: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
6290: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72  d, iParm+1, addr
62a0: 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , r1, 0);.      
62b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
62c0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
62d0: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
62e0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
62f0: 74 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t( pOrderBy==0 )
6300: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
6310: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
6320: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
6330: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
6340: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
6350: 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  p, r1);.      }e
6360: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
6370: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
6380: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6390: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
63a0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
63b0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
63c0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
63d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
63e0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
63f0: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
6400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6410: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6420: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
6430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6440: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6450: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
6460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
6470: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6480: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
6490: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
64a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
64b0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
64c0: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
64d0: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
64e0: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
64f0: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
6500: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
6510: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
6520: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
6530: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
6540: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
6550: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
6560: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
6570: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
6580: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
6590: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
65a0: 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29   nResultCol==1 )
65b0: 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61  ;.      pDest->a
65c0: 66 66 53 64 73 74 20 3d 0a 20 20 20 20 20 20 20  ffSdst =.       
65d0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
65e0: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
65f0: 79 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  y(pEList->a[0].p
6600: 45 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66  Expr, pDest->aff
6610: 53 64 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Sdst);.      if(
6620: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
6630: 20 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74       /* At first
6640: 20 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c   glance you woul
6650: 64 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64  d think we could
6660: 20 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68   optimize out th
6670: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44  e.        ** ORD
6680: 45 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61  ER BY in this ca
6690: 73 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64  se since the ord
66a0: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
66b0: 20 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20   the set.       
66c0: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74   ** does not mat
66d0: 74 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20  ter.  But there 
66e0: 6d 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54  might be a LIMIT
66f0: 20 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63   clause, in whic
6700: 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73  h.        ** cas
6710: 65 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73  e the order does
6720: 20 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20   matter */.     
6730: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
6740: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
6750: 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74  By, p, regResult
6760: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6770: 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d          int r1 =
6780: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6790: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
67a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
67b0: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
67c0: 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c  Record, regResul
67d0: 74 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e  t,1,r1, &pDest->
67e0: 61 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20  affSdst, 1);.   
67f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6800: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
6810: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
6820: 65 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20  esult, 1);.     
6830: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6840: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
6850: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29  sert, iParm, r1)
6860: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6870: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
6880: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
6890: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
68a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
68b0: 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
68c0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
68d0: 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
68e0: 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
68f0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
6900: 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
6910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6920: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
6930: 67 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a  ger, 1, iParm);.
6940: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
6950: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
6960: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
6970: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
6980: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6990: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
69a0: 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
69b0: 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
69c0: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
69d0: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
69e0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
69f0: 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
6a00: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
6a10: 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
6a20: 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
6a30: 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
6a40: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
6a50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 52        assert( nR
6a60: 65 73 75 6c 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20  esultCol==1 );. 
6a70: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
6a80: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
6a90: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
6aa0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
6ab0: 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20   regResult);.   
6ac0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6ad0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
6ae0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
6af0: 67 52 65 73 75 6c 74 2c 20 69 50 61 72 6d 2c 20  gResult, iParm, 
6b00: 31 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  1);.        /* T
6b10: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
6b20: 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
6b30: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
6b40: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
6b50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
6b60: 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
6b70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
6b80: 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a  QUERY */..    /*
6b90: 20 53 65 6e 64 20 74 68 65 20 64 61 74 61 20 74   Send the data t
6ba0: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 66  o the callback f
6bb0: 75 6e 63 74 69 6f 6e 20 6f 72 20 74 6f 20 61 20  unction or to a 
6bc0: 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 49 6e 20  subroutine.  In 
6bd0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 73 65 20  the.    ** case 
6be0: 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 2c  of a subroutine,
6bf0: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
6c00: 69 74 73 65 6c 66 20 69 73 20 72 65 73 70 6f 6e  itself is respon
6c10: 73 69 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  sible for.    **
6c20: 20 70 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74   popping the dat
6c30: 61 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  a from the stack
6c40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
6c50: 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a  e SRT_Coroutine:
6c60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75  .    case SRT_Ou
6c70: 74 70 75 74 3a 20 7b 0a 20 20 20 20 20 20 74 65  tput: {.      te
6c80: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6c90: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
6ca0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6cb0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
6cc0: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
6cd0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
6ce0: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
6cf0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6d00: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
6d10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6d20: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6d30: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
6d40: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20  esultCol, r1);. 
6d50: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
6d60: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
6d70: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
6d80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6d90: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6da0: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
6db0: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6dc0: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6dd0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6de0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6df0: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
6e00: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
6e10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6e20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6e30: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
6e40: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  w, regResult, nR
6e50: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
6e60: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
6e70: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
6e80: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
6e90: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
6ea0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6eb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
6ec0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
6ed0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a  E_OMIT_TRIGGER).
6ee0: 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74      /* Discard t
6ef0: 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69  he results.  Thi
6f00: 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45  s is used for SE
6f10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
6f20: 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68  inside.    ** th
6f30: 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47  e body of a TRIG
6f40: 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73  GER.  The purpos
6f50: 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74  e of such select
6f60: 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20  s is to call.   
6f70: 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64   ** user-defined
6f80: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
6f90: 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74  have side effect
6fa0: 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61  s.  We do not ca
6fb0: 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20  re.    ** about 
6fc0: 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c  the actual resul
6fd0: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
6fe0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
6ff0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
7000: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
7010: 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20  _Discard );.    
7020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
7030: 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
7040: 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
7050: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
7060: 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
7070: 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66  hed.  Except, if
7080: 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
7090: 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63   sorter, in whic
70a0: 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65  h case the sorte
70b0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69  r has already li
70c0: 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f  mited.  ** the o
70d0: 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20  utput for us..  
70e0: 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
70f0: 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69  y==0 && p->iLimi
7100: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
7110: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7120: 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
7130: 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b  it, iBreak, -1);
7140: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
7150: 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  locate a KeyInfo
7160: 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69 65   object sufficie
7170: 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20  nt for an index 
7180: 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  of N key columns
7190: 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20   and.** X extra 
71a0: 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49  columns..*/.KeyI
71b0: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
71c0: 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33  nfoAlloc(sqlite3
71d0: 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74   *db, int N, int
71e0: 20 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a   X){.  KeyInfo *
71f0: 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
7200: 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20 20  locZero(0, .    
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
7220: 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b  izeof(KeyInfo) +
7230: 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43   (N+X)*(sizeof(C
7240: 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20  ollSeq*)+1));.  
7250: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e  if( p ){.    p->
7260: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
7270: 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d  *)&p->aColl[N+X]
7280: 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20  ;.    p->nField 
7290: 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d  = (u16)N;.    p-
72a0: 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29  >nXField = (u16)
72b0: 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20  X;.    p->enc = 
72c0: 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e  ENC(db);.    p->
72d0: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e  db = db;.    p->
72e0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nRef = 1;.  }els
72f0: 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  e{.    db->mallo
7300: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
7310: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
7320: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
7330: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
7340: 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
7350: 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65  3KeyInfoUnref(Ke
7360: 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28  yInfo *p){.  if(
7370: 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
7380: 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ( p->nRef>0 );. 
7390: 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20     p->nRef--;.  
73a0: 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
73b0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
73c0: 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  (0, p);.  }.}../
73d0: 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20  *.** Make a new 
73e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79  pointer to a Key
73f0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b  Info object.*/.K
7400: 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b  eyInfo *sqlite3K
7410: 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66  eyInfoRef(KeyInf
7420: 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  o *p){.  if( p )
7430: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
7440: 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70  >nRef>0 );.    p
7450: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
7460: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66  return p;.}..#if
7470: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
7480: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
7490: 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20  UE if a KeyInfo 
74a0: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68  object can be ch
74b0: 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e  ange.  The KeyIn
74c0: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e  fo object.** can
74d0: 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64   only be changed
74e0: 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73 74   if this is just
74f0: 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65   a single refere
7500: 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63  nce to the objec
7510: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  t..**.** This ro
7520: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
7530: 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ly inside of ass
7540: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
7550: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7560: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
7570: 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20  le(KeyInfo *p){ 
7580: 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d  return p->nRef==
7590: 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1; }.#endif /* S
75a0: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
75b0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65  /*.** Given an e
75c0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
75d0: 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e  generate a KeyIn
75e0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
75f0: 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65  t records.** the
7600: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
7610: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70  nce for each exp
7620: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20  ression in that 
7630: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
7640: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78  .**.** If the Ex
7650: 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44  prList is an ORD
7660: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
7670: 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68  Y clause then th
7680: 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b  e resulting.** K
7690: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
76a0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
76b0: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
76c0: 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
76d0: 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74   to.** implement
76e0: 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49   that clause.  I
76f0: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
7700: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
7710: 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20   of a SELECT.** 
7720: 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f  then the KeyInfo
7730: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70   structure is ap
7740: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e  propriate for in
7750: 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72  itializing a vir
7760: 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  tual.** index to
7770: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53   implement a DIS
7780: 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a  TINCT test..**.*
7790: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
77a0: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
77b0: 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20  cture is obtain 
77c0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68  from malloc.  Th
77d0: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
77e0: 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73  ction is respons
77f0: 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20  ible for seeing 
7800: 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74  that this struct
7810: 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c  ure is eventuall
7820: 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73  y.** freed..*/.s
7830: 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b  tatic KeyInfo *k
7840: 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
7850: 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  st(Parse *pParse
7860: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
7870: 74 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b  t){.  int nExpr;
7880: 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66  .  KeyInfo *pInf
7890: 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  o;.  struct Expr
78a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
78b0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
78c0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
78d0: 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20  int i;..  nExpr 
78e0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
78f0: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
7900: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
7910: 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 69  , nExpr, 1);.  i
7920: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
7930: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
7940: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
7950: 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  e(pInfo) );.    
7960: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
7970: 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72  List->a; i<nExpr
7980: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
7990: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
79a0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
79b0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
79c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
79d0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
79e0: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
79f0: 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
7a00: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  fltColl;.      p
7a10: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
7a20: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49   pColl;.      pI
7a30: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
7a40: 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74  i] = pItem->sort
7a50: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
7a60: 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b  .  return pInfo;
7a70: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
7a80: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
7a90: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61  _SELECT./*.** Na
7aa0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
7ab0: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
7ac0: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
7ad0: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
7ae0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
7af0: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
7b00: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
7b10: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
7b20: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
7b30: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
7b40: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
7b50: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
7b60: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
7b70: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
7b80: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
7b90: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
7ba0: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
7bb0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
7bc0: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
7bd0: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
7be0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
7bf0: 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
7c00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
7c10: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
7c20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7c30: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
7c40: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
7c50: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
7c60: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
7c70: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
7c80: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
7c90: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
7ca0: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
7cb0: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
7cc0: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
7cd0: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
7ce0: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
7cf0: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
7d00: 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54     "USE TEMP B-T
7d10: 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a  REE FOR xxx".**.
7d20: 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20  ** where xxx is 
7d30: 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54  one of "DISTINCT
7d40: 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72  ", "ORDER BY" or
7d50: 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61   "GROUP BY". Exa
7d60: 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73  ctly which.** is
7d70: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
7d80: 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65  he zUsage argume
7d90: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
7da0: 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  id explainTempTa
7db0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
7dc0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
7dd0: 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  Usage){.  if( pP
7de0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
7df0: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
7e00: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
7e10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
7e20: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
7e30: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53  (pParse->db, "US
7e40: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
7e50: 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a  R %s", zUsage);.
7e60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e70: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
7e80: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
7e90: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
7ea0: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
7eb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  .  }.}../*.** As
7ec0: 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  sign expression 
7ed0: 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41  b to lvalue a. A
7ee0: 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20   second, no-op, 
7ef0: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20  version of this 
7f00: 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76  macro.** is prov
7f10: 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  ided when SQLITE
7f20: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
7f30: 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61   defined. This a
7f40: 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a  llows the code.*
7f50: 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  * in sqlite3Sele
7f60: 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76  ct() to assign v
7f70: 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75  alues to structu
7f80: 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  re member variab
7f90: 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79  les that.** only
7fa0: 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45   exist if SQLITE
7fb0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
7fc0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74   not defined wit
7fd0: 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74  hout polluting t
7fe0: 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20  he.** code with 
7ff0: 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76  #ifndef directiv
8000: 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20  es..*/.# define 
8010: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
8020: 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23  r(a, b) a = b..#
8030: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
8040: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
8050: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
8060: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
8070: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
8080: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c  lainTempTable(y,
8090: 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  z).# define expl
80a0: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c  ainSetInteger(y,
80b0: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  z).#endif..#if !
80c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
80d0: 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20  MIT_EXPLAIN) && 
80e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
80f0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
8100: 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  LECT)./*.** Unle
8110: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
8120: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
8130: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
8140: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
8150: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
8160: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
8170: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
8180: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
8190: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
81a0: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
81b0: 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20  ption is of one 
81c0: 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73  of the two forms
81d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  :.**.**   "COMPO
81e0: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
81f0: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
8200: 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50  (op)".**   "COMP
8210: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
8220: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
8230: 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52   USING TEMP B-TR
8240: 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77  EE (op)".**.** w
8250: 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69  here iSub1 and i
8260: 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74  Sub2 are the int
8270: 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20  egers passed as 
8280: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8290: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61  g.** function pa
82a0: 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70  rameters, and op
82b0: 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70   is the text rep
82c0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
82d0: 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  he parameter.** 
82e0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
82f0: 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
8300: 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65  "op" must be one
8310: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
8320: 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49  _EXCEPT,.** TK_I
8330: 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41  NTERSECT or TK_A
8340: 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f  LL. The first fo
8350: 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72  rm is used if ar
8360: 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69  gument bUseTmp i
8370: 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20  s .** false, or 
8380: 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  the second form 
8390: 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a  if it is true..*
83a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
83b0: 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a  plainComposite(.
83c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
83d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83e0: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
83f0: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
8420: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
8430: 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20  XCEPT etc. */.  
8440: 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20  int iSub1,      
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31  /* Subquery id 1
8470: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c   */.  int iSub2,
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8490: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
84a0: 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20  y id 2 */.  int 
84b0: 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20  bUseTmp         
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
84d0: 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61  rue if a temp ta
84e0: 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a  ble was used */.
84f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ){.  assert( op=
8500: 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d  =TK_UNION || op=
8510: 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
8520: 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c  ==TK_INTERSECT |
8530: 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a  | op==TK_ALL );.
8540: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
8550: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
8560: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
8570: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61  ->pVdbe;.    cha
8580: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
8590: 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  3MPrintf(.      
85a0: 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43    pParse->db, "C
85b0: 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49  OMPOUND SUBQUERI
85c0: 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28  ES %d AND %d %s(
85d0: 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75  %s)", iSub1, iSu
85e0: 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65  b2,.        bUse
85f0: 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20  Tmp?"USING TEMP 
8600: 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c  B-TREE ":"", sel
8610: 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20  ectOpName(op).  
8620: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
8630: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
8640: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
8650: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
8660: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
8670: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  MIC);.  }.}.#els
8680: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
8690: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
86a0: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
86b0: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
86c0: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
86d0: 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78  nComposite(v,w,x
86e0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y,z).#endif../*
86f0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72  .** If the inner
8700: 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61   loop was genera
8710: 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d  ted using a non-
8720: 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72  null pOrderBy ar
8730: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  gument,.** then 
8740: 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65  the results were
8750: 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72   placed in a sor
8760: 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ter.  After the 
8770: 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74  loop is terminat
8780: 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  ed.** we need to
8790: 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20   run the sorter 
87a0: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72  and output the r
87b0: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c  esults.  The fol
87c0: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
87d0: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
87e0: 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64  code needed to d
87f0: 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  o that..*/.stati
8800: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53  c void generateS
8810: 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65  ortTail(.  Parse
8820: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
8830: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8840: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
8850: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
8860: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
8870: 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  /.  Vdbe *v,    
8880: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
8890: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
88a0: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
88b0: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20  Column,      /* 
88c0: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
88d0: 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53  s of data */.  S
88e0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
88f0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
8900: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
8910: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  e */.){.  int ad
8920: 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  drBreak = sqlite
8930: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
8940: 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  );     /* Jump h
8950: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
8960: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
8970: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
8980: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
8990: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
89a0: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
89b0: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  /.  int addr;.  
89c0: 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20  int iTab;.  int 
89d0: 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20  pseudoTab = 0;. 
89e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
89f0: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
8a00: 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20  y;..  int eDest 
8a10: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
8a20: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
8a30: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 0a 20  est->iSDParm;.. 
8a40: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
8a50: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20  nt regRowid;..  
8a60: 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d  iTab = pOrderBy-
8a70: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65 67  >iECursor;.  reg
8a80: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Row = sqlite3Get
8a90: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
8aa0: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
8ab0: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
8ac0: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
8ad0: 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61   ){.    pseudoTa
8ae0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
8af0: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
8b00: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8b10: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75  OpenPseudo, pseu
8b20: 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 6e  doTab, regRow, n
8b30: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65 67  Column);.    reg
8b40: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c  Rowid = 0;.  }el
8b50: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
8b60: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
8b70: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
8b80: 7d 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  }.  if( p->selFl
8b90: 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74  ags & SF_UseSort
8ba0: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  er ){.    int re
8bb0: 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61  gSortOut = ++pPa
8bc0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
8bd0: 6e 74 20 70 74 61 62 32 20 3d 20 70 50 61 72 73  nt ptab2 = pPars
8be0: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
8bf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8c00: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
8c10: 6f 2c 20 70 74 61 62 32 2c 20 72 65 67 53 6f 72  o, ptab2, regSor
8c20: 74 4f 75 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  tOut, pOrderBy->
8c30: 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 61 64  nExpr+2);.    ad
8c40: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
8c50: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
8c60: 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61  _SorterSort, iTa
8c70: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
8c80: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
8c90: 20 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65   p, addrContinue
8ca0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
8cb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
8cc0: 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c  orterData, iTab,
8cd0: 20 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20 20   regSortOut);.  
8ce0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8cf0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
8d00: 2c 20 70 74 61 62 32 2c 20 70 4f 72 64 65 72 42  , ptab2, pOrderB
8d10: 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 52  y->nExpr+1, regR
8d20: 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ow);.    sqlite3
8d30: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
8d40: 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48  OPFLAG_CLEARCACH
8d50: 45 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  E);.  }else{.   
8d60: 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69   addr = 1 + sqli
8d70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8d80: 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20   OP_Sort, iTab, 
8d90: 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20  addrBreak);.    
8da0: 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c  codeOffset(v, p,
8db0: 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a   addrContinue);.
8dc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8dd0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
8de0: 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72  mn, iTab, pOrder
8df0: 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67  By->nExpr+1, reg
8e00: 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74  Row);.  }.  swit
8e10: 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20  ch( eDest ){.   
8e20: 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a   case SRT_Table:
8e30: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70  .    case SRT_Ep
8e40: 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20  hemTab: {.      
8e50: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8e60: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
8e70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
8e80: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
8e90: 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
8ea0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8eb0: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
8ec0: 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  rm, regRowid);. 
8ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8ee0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
8ef0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52  ert, iParm, regR
8f00: 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20  ow, regRowid);. 
8f10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8f20: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8f30: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
8f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
8f50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8f60: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
8f70: 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
8f80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
8f90: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
8fa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8fb0: 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
8fc0: 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c  cord, regRow, 1,
8fd0: 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20   regRowid,.     
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64     &pDest->affSd
9000: 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  st, 1);.      sq
9010: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
9020: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
9030: 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b  rse, regRow, 1);
9040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9050: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
9060: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
9070: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
9080: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9090: 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
90a0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
90b0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
90c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
90d0: 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
90e0: 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20   regRow, iParm, 
90f0: 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
9100: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
9110: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
9120: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
9130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9140: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65   }.#endif.    de
9150: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
9160: 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65  nt i;.      asse
9170: 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  rt( eDest==SRT_O
9180: 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d  utput || eDest==
9190: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
91a0: 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65   .      testcase
91b0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
91c0: 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73  put );.      tes
91d0: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
91e0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
91f0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
9200: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
9210: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72         assert( r
9220: 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 53  egRow!=pDest->iS
9230: 64 73 74 2b 69 20 29 3b 0a 20 20 20 20 20 20 20  dst+i );.       
9240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9250: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
9260: 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70   pseudoTab, i, p
9270: 44 65 73 74 2d 3e 69 53 64 73 74 2b 69 29 3b 0a  Dest->iSdst+i);.
9280: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30          if( i==0
9290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
92a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
92b0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41  5(v, OPFLAG_CLEA
92c0: 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20  RCACHE);.       
92d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
92e0: 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f   if( eDest==SRT_
92f0: 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20  Output ){.      
9300: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9310: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74  Op2(v, OP_Result
9320: 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73  Row, pDest->iSds
9330: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
9340: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9350: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
9360: 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73  nge(pParse, pDes
9370: 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d  t->iSdst, nColum
9380: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
9390: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
93a0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
93b0: 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
93c0: 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d  SDParm);.      }
93d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
93e0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
93f0: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
9400: 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b  pParse, regRow);
9410: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
9420: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
9430: 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f   regRowid);..  /
9440: 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  * The bottom of 
9450: 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  the loop.  */.  
9460: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
9470: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43  veLabel(v, addrC
9480: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
9490: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
94a0: 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20  _UseSorter ){.  
94b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
94c0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
94d0: 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
94e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
94f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9500: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
9510: 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20  ab, addr);.  }. 
9520: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
9530: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
9540: 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65 44  Break);.  if( eD
9550: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
9560: 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  || eDest==SRT_Co
9570: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73  routine ){.    s
9580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9590: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73  (v, OP_Close, ps
95a0: 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d  eudoTab, 0);.  }
95b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
95c0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
95d0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
95e0: 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69  g the 'declarati
95f0: 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a  on type' of the.
9600: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  ** expression pE
9610: 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  xpr. The string 
9620: 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61  may be treated a
9630: 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20  s static by the 
9640: 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c  caller..**.** Al
9650: 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61  so try to estima
9660: 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
9670: 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75  he returned valu
9680: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61  e and return tha
9690: 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a  t.** result in *
96a0: 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a  pEstWidth..**.**
96b0: 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   The declaration
96c0: 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61   type is the exa
96d0: 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69  ct datatype defi
96e0: 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64  nition extracted
96f0: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69   from the.** ori
9700: 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42  ginal CREATE TAB
9710: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  LE statement if 
9720: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9730: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a  s a column. The.
9740: 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  ** declaration t
9750: 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20  ype for a ROWID 
9760: 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52  field is INTEGER
9770: 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61  . Exactly when a
9780: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  n expression.** 
9790: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  is considered a 
97a0: 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f  column can be co
97b0: 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65  mplex in the pre
97c0: 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72  sence of subquer
97d0: 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75  ies. The.** resu
97e0: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
97f0: 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  n in all of the 
9800: 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54  following SELECT
9810: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a   statements is .
9820: 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20  ** considered a 
9830: 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66  column by this f
9840: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  unction..**.**  
9850: 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d   SELECT col FROM
9860: 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43   tbl;.**   SELEC
9870: 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52  T (SELECT col FR
9880: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
9890: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
98a0: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20  FROM tbl);.**   
98b0: 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20  SELECT abc FROM 
98c0: 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61  (SELECT col AS a
98d0: 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  bc FROM tbl);.**
98e0: 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61   .** The declara
98f0: 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e  tion type for an
9900: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68  y expression oth
9910: 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e  er than a column
9920: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
9930: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
9940: 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70   either 3 or 6 p
9950: 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64  arameters depend
9960: 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
9970: 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c  r not.** the SQL
9980: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
9990: 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69  N_METADATA compi
99a0: 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
99b0: 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65  s used..*/.#ifde
99c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
99d0: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
99e0: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
99f0: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29  ype(A,B,C,D,E,F)
9a00: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
9a10: 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74 61  A,B,C,D,E,F).sta
9a20: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
9a30: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a  columnTypeImpl(.
9a40: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
9a50: 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  NC, .  Expr *pEx
9a60: 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pr,.  const char
9a70: 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63   **pzOrigDb,.  c
9a80: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72  onst char **pzOr
9a90: 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  igTab,.  const c
9aa0: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c  har **pzOrigCol,
9ab0: 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68  .  u8 *pEstWidth
9ac0: 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  .){.  char const
9ad0: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
9ae0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72   char const *zOr
9af0: 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61  igTab = 0;.  cha
9b00: 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f  r const *zOrigCo
9b10: 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a 20  l = 0;.#else /* 
9b20: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9b30: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
9b40: 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20  _METADATA) */.# 
9b50: 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70  define columnTyp
9b60: 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63  e(A,B,C,D,E,F) c
9b70: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c  olumnTypeImpl(A,
9b80: 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73  B,F).static cons
9b90: 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79  t char *columnTy
9ba0: 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f  peImpl(.  NameCo
9bb0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45  ntext *pNC, .  E
9bc0: 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75 38  xpr *pExpr,.  u8
9bd0: 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 23   *pEstWidth.){.#
9be0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
9bf0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
9c00: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29  COLUMN_METADATA)
9c10: 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   */.  char const
9c20: 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69   *zType = 0;.  i
9c30: 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69  nt j;.  u8 estWi
9c40: 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  dth = 1;..  if( 
9c50: 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20  NEVER(pExpr==0) 
9c60: 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  || pNC->pSrcList
9c70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
9c80: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9c90: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9ca0: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
9cb0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
9cc0: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
9cd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9ce0: 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65  a column. Locate
9cf0: 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   the table the c
9d00: 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20  olumn is being. 
9d10: 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65       ** extracte
9d20: 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f  d from in NameCo
9d30: 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20  ntext.pSrcList. 
9d40: 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62  This table may b
9d50: 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20  e real.      ** 
9d60: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
9d70: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20  r a subquery..  
9d80: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
9d90: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
9da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
9db0: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75  e structure colu
9dc0: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
9dd0: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65  from */.      Se
9de0: 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20  lect *pS = 0;   
9df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
9e00: 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ect the column i
9e10: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
9e20: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43   */.      int iC
9e30: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
9e40: 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f  umn;  /* Index o
9e50: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62  f column in pTab
9e60: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
9e70: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9e80: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
9e90: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9ea0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
9eb0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68  LUMN );.      wh
9ec0: 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61  ile( pNC && !pTa
9ed0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63  b ){.        Src
9ee0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
9ef0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
9f00: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
9f10: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
9f20: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
9f30: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70  j].iCursor!=pExp
9f40: 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a  r->iTable;j++);.
9f50: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54          if( j<pT
9f60: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a  abList->nSrc ){.
9f70: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d            pTab =
9f80: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
9f90: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
9fa0: 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  pS = pTabList->a
9fb0: 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [j].pSelect;.   
9fc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9fd0: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
9fe0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
9ff0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
a000: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
a010: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e          /* At on
a020: 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63  e time, code suc
a030: 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77  h as "SELECT new
a040: 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69  .x" within a tri
a050: 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20  gger would.     
a060: 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73     ** cause this
a070: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75   condition to ru
a080: 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20  n.  Since then, 
a090: 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74  we have restruct
a0a0: 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20  ured how.       
a0b0: 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65   ** trigger code
a0c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   is generated an
a0d0: 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74  d so this condit
a0e0: 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ion is no longer
a0f0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73   .        ** pos
a100: 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20  sible. However, 
a110: 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  it can still be 
a120: 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65  true for stateme
a130: 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20  nts like.       
a140: 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
a150: 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g:.        **.  
a160: 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
a170: 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49  E TABLE t1(col I
a180: 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20  NTEGER);.       
a190: 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45   **   SELECT (SE
a1a0: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f  LECT t1.col) FRO
a1b0: 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  M FROM t1;.     
a1c0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
a1d0: 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   when columnType
a1e0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
a1f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  the expression "
a200: 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a  t1.col" in the .
a210: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73          ** sub-s
a220: 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63  elect. In this c
a230: 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c  ase, set the col
a240: 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c  umn type to NULL
a250: 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a  , even.        *
a260: 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75  * though it shou
a270: 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e  ld really be "IN
a280: 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20  TEGER"..        
a290: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
a2a0: 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  is is not a prob
a2b0: 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75  lem, as the colu
a2c0: 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63  mn type of "t1.c
a2d0: 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20  ol" is never.   
a2e0: 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68       ** used. Wh
a2f0: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
a300: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
a310: 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20   expression .   
a320: 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54       ** "(SELECT
a330: 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63   t1.col)", the c
a340: 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72  orrect type is r
a350: 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65  eturned (see the
a360: 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20   TK_SELECT.     
a370: 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c     ** branch bel
a380: 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ow.  */.        
a390: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
a3a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
a3b0: 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61  ab && pExpr->pTa
a3c0: 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  b==pTab );.     
a3d0: 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20   if( pS ){.     
a3e0: 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65     /* The "table
a3f0: 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  " is actually a 
a400: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20  sub-select or a 
a410: 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d  view in the FROM
a420: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
a430: 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ** of the SELECT
a440: 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75   statement. Retu
a450: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
a460: 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67  on type and orig
a470: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  in.        ** da
a480: 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ta for the resul
a490: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  t-set column of 
a4a0: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a  the sub-select..
a4b0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
a4c0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
a4d0: 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53  & ALWAYS(iCol<pS
a4e0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
a4f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
a500: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
a510: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
a520: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a530: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
a540: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
a550: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
a560: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
a570: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
a580: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
a590: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
a5a0: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
a5b0: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
a5c0: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
a5d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a5e0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
a5f0: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
a600: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
a610: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
a620: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
a630: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
a640: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
a650: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
a660: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
a670: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
a680: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
a690: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
a6a0: 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44  (&sNC, p,&zOrigD
a6b0: 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72  b,&zOrigTab,&zOr
a6c0: 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68  igCol, &estWidth
a6d0: 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ); .        }.  
a6e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
a6f0: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
a700: 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61 6c         /* A real
a710: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
a720: 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29 3b    assert( !pS );
a730: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
a740: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
a750: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
a760: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
a770: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
a780: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
a790: 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  l) );.#ifdef SQL
a7a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
a7b0: 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20 20  N_METADATA.     
a7c0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
a7d0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
a7e0: 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20   = "INTEGER";.  
a7f0: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c          zOrigCol
a800: 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20 20   = "rowid";.    
a810: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a820: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
a830: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
a840: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ype;.          z
a850: 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  OrigCol = pTab->
a860: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
a870: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
a880: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
a890: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
a8a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a8b0: 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61 62   zOrigTab = pTab
a8c0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
a8d0: 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73 65   if( pNC->pParse
a8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
a8f0: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
a900: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43  chemaToIndex(pNC
a910: 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  ->pParse->db, pT
a920: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
a930: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62 20          zOrigDb 
a940: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64  = pNC->pParse->d
a950: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
a960: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c  e;.        }.#el
a970: 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  se.        if( i
a980: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
a990: 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45     zType = "INTE
a9a0: 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d 65  GER";.        }e
a9b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  lse{.          z
a9c0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
a9d0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
a9e0: 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64 74           estWidt
a9f0: 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  h = pTab->aCol[i
aa00: 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20  Col].szEst;.    
aa10: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
aa20: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
aa30: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
aa40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
aa50: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
aa60: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
aa70: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
aa80: 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c 65  on is a sub-sele
aa90: 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  ct. Return the d
aaa0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20  eclaration type 
aab0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69  and.      ** ori
aac0: 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68 65  gin info for the
aad0: 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69   single column i
aae0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
aaf0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
ab00: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
ab10: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
ab20: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
ab30: 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  C;.      Select 
ab40: 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  *pS = pExpr->x.p
ab50: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45 78  Select;.      Ex
ab60: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
ab70: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
ab80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45 78        assert( Ex
ab90: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
aba0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
abb0: 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  t) );.      sNC.
abc0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
abd0: 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70  Src;.      sNC.p
abe0: 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20  Next = pNC;.    
abf0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
ac00: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
ac10: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
ac20: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
ac30: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
ac40: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65  b, &zOrigCol, &e
ac50: 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20 20  stWidth); .     
ac60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
ac70: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ndif.  }..#ifdef
ac80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
ac90: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20  OLUMN_METADATA  
aca0: 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62 20  .  if( pzOrigDb 
acb0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
acc0: 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f 72  zOrigTab && pzOr
acd0: 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a  igCol );.    *pz
ace0: 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44 62  OrigDb = zOrigDb
acf0: 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61 62  ;.    *pzOrigTab
ad00: 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20   = zOrigTab;.   
ad10: 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f   *pzOrigCol = zO
ad20: 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64  rigCol;.  }.#end
ad30: 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69 64  if.  if( pEstWid
ad40: 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68 20  th ) *pEstWidth 
ad50: 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72 65  = estWidth;.  re
ad60: 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f  turn zType;.}../
ad70: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
ad80: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c  de that will tel
ad90: 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20 64  l the VDBE the d
ada0: 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 73  eclaration types
adb0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
adc0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
add0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ade0: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
adf0: 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ypes(.  Parse *p
ae00: 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50  Parse,      /* P
ae10: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
ae20: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
ae30: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
ae40: 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78  f tables */.  Ex
ae50: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
ae60: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
ae70: 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65   defining the re
ae80: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23  sult set */.){.#
ae90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
aea0: 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56 64  IT_DECLTYPE.  Vd
aeb0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
aec0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
aed0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
aee0: 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  C;.  sNC.pSrcLis
aef0: 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
af00: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
af10: 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  rse;.  for(i=0; 
af20: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
af30: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
af40: 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  *p = pEList->a[i
af50: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e  ].pExpr;.    con
af60: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a  st char *zType;.
af70: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
af80: 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
af90: 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20 63  DATA.    const c
afa0: 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  har *zOrigDb = 0
afb0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
afc0: 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a   *zOrigTab = 0;.
afd0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
afe0: 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20  zOrigCol = 0;.  
aff0: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
b000: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a  Type(&sNC, p, &z
b010: 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54 61  OrigDb, &zOrigTa
b020: 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29  b, &zOrigCol, 0)
b030: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76 64  ;..    /* The vd
b040: 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74 73  be must make its
b050: 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68 65   own copy of the
b060: 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64   column-type and
b070: 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63   other .    ** c
b080: 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20 73  olumn specific s
b090: 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65 20  trings, in case 
b0a0: 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72 65  the schema is re
b0b0: 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73 0a  set before this.
b0c0: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d      ** virtual m
b0d0: 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74 65  achine is delete
b0e0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  d..    */.    sq
b0f0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
b100: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
b110: 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72 69  E_DATABASE, zOri
b120: 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  gDb, SQLITE_TRAN
b130: 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
b140: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
b150: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
b160: 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c  TABLE, zOrigTab,
b170: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
b180: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
b190: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
b1a0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55   i, COLNAME_COLU
b1b0: 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51  MN, zOrigCol, SQ
b1c0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
b1d0: 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70 65  .#else.    zType
b1e0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
b1f0: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20  NC, p, 0, 0, 0, 
b200: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
b210: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
b220: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
b230: 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79  ME_DECLTYPE, zTy
b240: 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  pe, SQLITE_TRANS
b250: 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  IENT);.  }.#endi
b260: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
b270: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
b280: 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  PE) */.}../*.** 
b290: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
b2a0: 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65  at will tell the
b2b0: 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73 20   VDBE the names 
b2c0: 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e  of columns.** in
b2d0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
b2e0: 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
b2f0: 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  on is used to pr
b300: 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43  ovide the.** azC
b310: 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20 74  ol[] values in t
b320: 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  he callback..*/.
b330: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
b340: 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  rateColumnNames(
b350: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b360: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72  ,      /* Parser
b370: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
b380: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c  cList *pTabList,
b390: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
b3a0: 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  les */.  ExprLis
b3b0: 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a 20  t *pEList    /* 
b3c0: 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66 69  Expressions defi
b3d0: 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ning the result 
b3e0: 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  set */.){.  Vdbe
b3f0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
b400: 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  dbe;.  int i, j;
b410: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b420: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b430: 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68  nt fullNames, sh
b440: 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64  ortNames;..#ifnd
b450: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
b460: 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74  XPLAIN.  /* If t
b470: 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
b480: 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74 65  N, skip this ste
b490: 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73  p */.  if( pPars
b4a0: 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20  e->explain ){.  
b4b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65    return;.  }.#e
b4c0: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61 72  ndif..  if( pPar
b4d0: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
b4e0: 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c  || NEVER(v==0) |
b4f0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
b500: 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  ed ) return;.  p
b510: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
b520: 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61  et = 1;.  fullNa
b530: 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  mes = (db->flags
b540: 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
b550: 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68  lNames)!=0;.  sh
b560: 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e  ortNames = (db->
b570: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
b580: 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30  hortColNames)!=0
b590: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  ;.  sqlite3VdbeS
b5a0: 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c  etNumCols(v, pEL
b5b0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66  ist->nExpr);.  f
b5c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
b5d0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
b5e0: 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
b5f0: 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  p = pEList->a[i]
b600: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
b610: 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63 6f  NEVER(p==0) ) co
b620: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
b630: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
b640: 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  me ){.      char
b650: 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74   *zName = pEList
b660: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
b670: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
b680: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
b690: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e  COLNAME_NAME, zN
b6a0: 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ame, SQLITE_TRAN
b6b0: 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73  SIENT);.    }els
b6c0: 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b  e if( (p->op==TK
b6d0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70  _COLUMN || p->op
b6e0: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  ==TK_AGG_COLUMN)
b6f0: 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b 0a   && pTabList ){.
b700: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
b710: 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  b;.      char *z
b720: 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Col;.      int i
b730: 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  Col = p->iColumn
b740: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
b750: 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c 69   ALWAYS(j<pTabLi
b760: 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b  st->nSrc); j++){
b770: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61  .        if( pTa
b780: 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72  bList->a[j].iCur
b790: 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29  sor==p->iTable )
b7a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b7b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
b7c0: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
b7d0: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
b7e0: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54  TabList->a[j].pT
b7f0: 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  ab;.      if( iC
b800: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
b810: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
b820: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d   assert( iCol==-
b830: 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26  1 || (iCol>=0 &&
b840: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
b850: 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ) );.      if( i
b860: 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Col<0 ){.       
b870: 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b   zCol = "rowid";
b880: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b890: 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61        zCol = pTa
b8a0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
b8b0: 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
b8c0: 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61 6d     if( !shortNam
b8d0: 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73  es && !fullNames
b8e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b8f0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
b900: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
b910: 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20 20  NAME, .         
b920: 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72 44     sqlite3DbStrD
b930: 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61  up(db, pEList->a
b940: 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49  [i].zSpan), SQLI
b950: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
b960: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75 6c     }else if( ful
b970: 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20  lNames ){.      
b980: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
b990: 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  0;.        zName
b9a0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
b9b0: 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70  f(db, "%s.%s", p
b9c0: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
b9d0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
b9e0: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
b9f0: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
ba00: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
ba10: 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  TE_DYNAMIC);.   
ba20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ba30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ba40: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
ba50: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c  LNAME_NAME, zCol
ba60: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
ba70: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NT);.      }.   
ba80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
ba90: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 45  nst char *z = pE
baa0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
bab0: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30  ;.      z = z==0
bac0: 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   ? sqlite3MPrint
bad0: 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22  f(db, "column%d"
bae0: 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65 33  , i+1) : sqlite3
baf0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29 3b  DbStrDup(db, z);
bb00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bb10: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
bb20: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
bb30: 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   z, SQLITE_DYNAM
bb40: 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  IC);.    }.  }. 
bb50: 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54   generateColumnT
bb60: 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ypes(pParse, pTa
bb70: 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a  bList, pEList);.
bb80: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
bb90: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
bba0: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65  ist (which is re
bbb0: 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66  ally the list of
bbc0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
bbd0: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65  that form the re
bbe0: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
bbf0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20  LECT statement) 
bc00: 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69  compute appropri
bc10: 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61  ate.** column na
bc20: 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20  mes for a table 
bc30: 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20  that would hold 
bc40: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
bc50: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  ist..**.** All c
bc60: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c  olumn names will
bc70: 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a   be unique..**.*
bc80: 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  * Only the colum
bc90: 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70  n names are comp
bca0: 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54  uted.  Column.zT
bcb0: 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c  ype, Column.zCol
bcc0: 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20  l,.** and other 
bcd0: 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e  fields of Column
bce0: 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a   are zeroed..**.
bcf0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
bd00: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
bd10: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
bd20: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63  ocation error oc
bd30: 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e  curs,.** store N
bd40: 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e  ULL in *paCol an
bd50: 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e  d 0 in *pnCol an
bd60: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
bd70: 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63  NOMEM..*/.static
bd80: 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d   int selectColum
bd90: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a  nsFromExprList(.
bda0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
bdb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
bdc0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
bdd0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
bde0: 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70  st,       /* Exp
bdf0: 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63  r list from whic
be00: 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75  h to derive colu
be10: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31  mn names */.  i1
be20: 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20  6 *pnCol,       
be30: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
be40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
be50: 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43  umns here */.  C
be60: 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20  olumn **paCol   
be70: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
be80: 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c  the new column l
be90: 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ist here */.){. 
bea0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
beb0: 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20  Parse->db;   /* 
bec0: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
bed0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ion */.  int i, 
bee0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
bef0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
bf00: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
bf10: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
bf20: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
bf30: 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  added to make th
bf40: 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f  e name unique */
bf50: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c  .  Column *aCol,
bf60: 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f   *pCol;        /
bf70: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
bf80: 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  er result column
bf90: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  s */.  int nCol;
bfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bfc0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
bfd0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45  esult set */.  E
bfe0: 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20  xpr *p;         
bff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
c000: 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73  pression for a s
c010: 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c  ingle result col
c020: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  umn */.  char *z
c030: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
c040: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
c050: 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ame */.  int nNa
c060: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
c070: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
c080: 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20  name in zName[] 
c090: 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74  */..  if( pEList
c0a0: 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70   ){.    nCol = p
c0b0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
c0c0: 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33    aCol = sqlite3
c0d0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c0e0: 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29   sizeof(aCol[0])
c0f0: 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74  *nCol);.    test
c100: 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b  case( aCol==0 );
c110: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
c120: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c  ol = 0;.    aCol
c130: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43   = 0;.  }.  *pnC
c140: 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61  ol = nCol;.  *pa
c150: 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66  Col = aCol;..  f
c160: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
c170: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
c180: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  pCol++){.    /* 
c190: 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  Get an appropria
c1a0: 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  te name for the 
c1b0: 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20  column.    */.  
c1c0: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
c1d0: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c  rSkipCollate(pEL
c1e0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
c1f0: 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65  ;.    if( (zName
c200: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
c210: 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
c220: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
c230: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20  umn contains an 
c240: 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61  "AS <name>" phra
c250: 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61  se, use <name> a
c260: 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  s the name */.  
c270: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
c280: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
c290: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
c2a0: 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  e{.      Expr *p
c2b0: 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a  ColExpr = p;  /*
c2c0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
c2d0: 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75  that is the resu
c2e0: 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  lt column name *
c2f0: 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  /.      Table *p
c300: 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab;         /* 
c310: 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  Table associated
c320: 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65   with this expre
c330: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77  ssion */.      w
c340: 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e  hile( pColExpr->
c350: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20  op==TK_DOT ){.  
c360: 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d        pColExpr =
c370: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68   pColExpr->pRigh
c380: 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
c390: 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29  t( pColExpr!=0 )
c3a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c3b0: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
c3c0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41  ==TK_COLUMN && A
c3d0: 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e  LWAYS(pColExpr->
c3e0: 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20  pTab!=0) ){.    
c3f0: 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d      /* For colum
c400: 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d  ns use the colum
c410: 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20  n name name */. 
c420: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
c430: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c  = pColExpr->iCol
c440: 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  umn;.        pTa
c450: 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54  b = pColExpr->pT
c460: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ab;.        if( 
c470: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
c480: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
c490: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
c4a0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
c4b0: 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  "%s",.          
c4c0: 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f         iCol>=0 ?
c4d0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
c4e0: 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64  ].zName : "rowid
c4f0: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ");.      }else 
c500: 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70  if( pColExpr->op
c510: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
c520: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
c530: 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c  HasProperty(pCol
c540: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
c550: 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e  e) );.        zN
c560: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
c570: 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70  intf(db, "%s", p
c580: 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  ColExpr->u.zToke
c590: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
c5a0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  .        /* Use 
c5b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78  the original tex
c5c0: 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t of the column 
c5d0: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74  expression as it
c5e0: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  s name */.      
c5f0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
c600: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
c610: 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ", pEList->a[i].
c620: 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  zSpan);.      }.
c630: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
c640: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c650: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
c660: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
c670: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c680: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
c690: 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d  e sure the colum
c6a0: 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65  n name is unique
c6b0: 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69  .  If the name i
c6c0: 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20  s not unique,.  
c6d0: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e    ** append a in
c6e0: 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d  teger to the nam
c6f0: 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63  e so that it bec
c700: 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20  omes unique..   
c710: 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20   */.    nName = 
c720: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c730: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
c740: 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  j=cnt=0; j<i; j+
c750: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
c760: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f  lite3StrICmp(aCo
c770: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  l[j].zName, zNam
c780: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
c790: 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b   char *zNewName;
c7a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  .        int k;.
c7b0: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e 4e          for(k=nN
c7c0: 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73 71  ame-1; k>1 && sq
c7d0: 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61  lite3Isdigit(zNa
c7e0: 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20  me[k]); k--){}. 
c7f0: 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65         if( zName
c800: 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65  [k]==':' ) nName
c810: 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = k;.        zN
c820: 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a  ame[nName] = 0;.
c830: 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65          zNewName
c840: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
c850: 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a  f(db, "%s:%d", z
c860: 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20  Name, ++cnt);.  
c870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
c880: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
c890: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
c8a0: 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20  zNewName;.      
c8b0: 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    j = -1;.      
c8c0: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
c8d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
c8e0: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e      }.    pCol->
c8f0: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
c900: 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c   }.  if( db->mal
c910: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c920: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a   for(j=0; j<i; j
c930: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
c940: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f  e3DbFree(db, aCo
c950: 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  l[j].zName);.   
c960: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
c970: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a  Free(db, aCol);.
c980: 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a      *paCol = 0;.
c990: 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a      *pnCol = 0;.
c9a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c9b0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
c9c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c9d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79  .}../*.** Add ty
c9e0: 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  pe and collation
c9f0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
ca00: 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61  a column list ba
ca10: 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45  sed on.** a SELE
ca20: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
ca30: 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20   .** The column 
ca40: 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20  list presumably 
ca50: 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74  came from select
ca60: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45  ColumnNamesFromE
ca70: 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68  xprList()..** Th
ca80: 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61  e column list ha
ca90: 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f  s only names, no
caa0: 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61  t types or colla
cab0: 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20  tions.  This.** 
cac0: 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72  routine goes thr
cad0: 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68  ough and adds th
cae0: 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c  e types and coll
caf0: 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ations..**.** Th
cb00: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69  is routine requi
cb10: 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65  res that all ide
cb20: 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20  ntifiers in the 
cb30: 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d  SELECT.** statem
cb40: 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e  ent be resolved.
cb50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cb60: 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54  selectAddColumnT
cb70: 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28  ypeAndCollation(
cb80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cb90: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
cba0: 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ing contexts */.
cbb0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
cbc0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63          /* Add c
cbd0: 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72  olumn type infor
cbe0: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74  mation to this t
cbf0: 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
cc00: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20   *pSelect       
cc10: 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74  /* SELECT used t
cc20: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65  o determine type
cc30: 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  s and collations
cc40: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
cc50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
cc60: 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  b;.  NameContext
cc70: 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   sNC;.  Column *
cc80: 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  pCol;.  CollSeq 
cc90: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b  *pColl;.  int i;
cca0: 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74  .  Expr *p;.  st
ccb0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ccc0: 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41  em *a;.  u64 szA
ccd0: 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ll = 0;..  asser
cce0: 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b  t( pSelect!=0 );
ccf0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c  .  assert( (pSel
cd00: 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
cd10: 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20  SF_Resolved)!=0 
cd20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  );.  assert( pTa
cd30: 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74  b->nCol==pSelect
cd40: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
cd50: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
cd60: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  led );.  if( db-
cd70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
cd80: 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74  return;.  memset
cd90: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
cda0: 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53  (sNC));.  sNC.pS
cdb0: 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  rcList = pSelect
cdc0: 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53  ->pSrc;.  a = pS
cdd0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
cde0: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f  ;.  for(i=0, pCo
cdf0: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c  l=pTab->aCol; i<
ce00: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c  pTab->nCol; i++,
ce10: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20   pCol++){.    p 
ce20: 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  = a[i].pExpr;.  
ce30: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
ce40: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
ce50: 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  db, columnType(&
ce60: 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70  sNC, p,0,0,0, &p
ce70: 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20  Col->szEst));.  
ce80: 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d    szAll += pCol-
ce90: 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c  >szEst;.    pCol
cea0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
ceb0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
cec0: 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  (p);.    if( pCo
ced0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29  l->affinity==0 )
cee0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
cef0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
cf00: 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  E;.    pColl = s
cf10: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
cf20: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
cf30: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
cf40: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c       pCol->zColl
cf50: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
cf60: 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  up(db, pColl->zN
cf70: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
cf80: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
cf90: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
cfa0: 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a  (szAll*4);.}../*
cfb0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45  .** Given a SELE
cfc0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65  CT statement, ge
cfd0: 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73  nerate a Table s
cfe0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
cff0: 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72  scribes.** the r
d000: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61  esult set of tha
d010: 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62  t SELECT..*/.Tab
d020: 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c  le *sqlite3Resul
d030: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72  tSetOfSelect(Par
d040: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
d050: 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
d060: 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73  Table *pTab;.  s
d070: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d080: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73  rse->db;.  int s
d090: 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61  avedFlags;..  sa
d0a0: 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66  vedFlags = db->f
d0b0: 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  lags;.  db->flag
d0c0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c  s &= ~SQLITE_Ful
d0d0: 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d  lColNames;.  db-
d0e0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
d0f0: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a  _ShortColNames;.
d100: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
d110: 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c  rep(pParse, pSel
d120: 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ect, 0);.  if( p
d130: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
d140: 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28  turn 0;.  while(
d150: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
d160: 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65   ) pSelect = pSe
d170: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
d180: 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65  db->flags = save
d190: 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d  dFlags;.  pTab =
d1a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
d1b0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
d1c0: 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20  Table) );.  if( 
d1d0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pTab==0 ){.    r
d1e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f  eturn 0;.  }.  /
d1f0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73  * The sqlite3Res
d200: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
d210: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20   is only used n 
d220: 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c  contexts where l
d230: 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73  ookaside.  ** is
d240: 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
d250: 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61  ssert( db->looka
d260: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30  side.bEnabled==0
d270: 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66   );.  pTab->nRef
d280: 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e   = 1;.  pTab->zN
d290: 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d  ame = 0;.  pTab-
d2a0: 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35  >nRowEst = 10485
d2b0: 37 36 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75  76;.  selectColu
d2c0: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
d2d0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
d2e0: 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e  >pEList, &pTab->
d2f0: 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f  nCol, &pTab->aCo
d300: 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43  l);.  selectAddC
d310: 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
d320: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
d330: 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  ab, pSelect);.  
d340: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
d350: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
d360: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
d370: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
d380: 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  le(db, pTab);.  
d390: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d3a0: 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d    return pTab;.}
d3b0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44  ../*.** Get a VD
d3c0: 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  BE for the given
d3d0: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e   parser context.
d3e0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
d3f0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
d400: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
d410: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
d420: 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20  ULL and leave a 
d430: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
d440: 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69  e..*/.Vdbe *sqli
d450: 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65  te3GetVdbe(Parse
d460: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62   *pParse){.  Vdb
d470: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
d480: 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30  Vdbe;.  if( v==0
d490: 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72   ){.    v = pPar
d4a0: 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69  se->pVdbe = sqli
d4b0: 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50  te3VdbeCreate(pP
d4c0: 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  arse);.#ifndef S
d4d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
d4e0: 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20  .    if( v ){.  
d4f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d500: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63  ddOp0(v, OP_Trac
d510: 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
d520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b  .  }.  return v;
d530: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  .}.../*.** Compu
d540: 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e  te the iLimit an
d550: 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73  d iOffset fields
d560: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62   of the SELECT b
d570: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70  ased on the.** p
d580: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
d590: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  t expressions.  
d5a0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
d5b0: 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72  et hold the expr
d5c0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20  essions.** that 
d5d0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72  appear in the or
d5e0: 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65  iginal SQL state
d5f0: 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c  ment after the L
d600: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a  IMIT and OFFSET.
d610: 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  ** keywords.  Or
d620: 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b   NULL if those k
d630: 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74  eywords are omit
d640: 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20  ted. iLimit and 
d650: 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20  iOffset .** are 
d660: 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f  the integer memo
d670: 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62  ry register numb
d680: 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73  ers for counters
d690: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
d6a0: 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61   .** the limit a
d6b0: 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74  nd offset.  If t
d6c0: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
d6d0: 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20   and/or offset, 
d6e0: 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20  then .** iLimit 
d6f0: 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20  and iOffset are 
d700: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
d710: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61  This routine cha
d720: 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20  nges the values 
d730: 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  of iLimit and iO
d740: 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a  ffset only if.**
d750: 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73   a limit or offs
d760: 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79  et is defined by
d770: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
d780: 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64  set.  iLimit and
d790: 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75  .** iOffset shou
d7a0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65  ld have been pre
d7b0: 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61  set to appropria
d7c0: 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  te default value
d7d0: 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75  s.** (usually bu
d7e0: 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29  t not always -1)
d7f0: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
d800: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
d810: 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69  ** Only if pLimi
d820: 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21  t!=0 or pOffset!
d830: 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20  =0 do the limit 
d840: 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a  registers get.**
d850: 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65   redefined.  The
d860: 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
d870: 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72  tor uses this pr
d880: 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a  operty to force.
d890: 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20  ** the reuse of 
d8a0: 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61  the same limit a
d8b0: 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74  nd offset regist
d8c0: 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69  ers across multi
d8d0: 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ple.** SELECT st
d8e0: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
d8f0: 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65  tic void compute
d900: 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50  LimitRegisters(P
d910: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
d920: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72  lect *p, int iBr
d930: 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  eak){.  Vdbe *v 
d940: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69  = 0;.  int iLimi
d950: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  t = 0;.  int iOf
d960: 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72  fset;.  int addr
d970: 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69  1, n;.  if( p->i
d980: 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a  Limit ) return;.
d990: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d  .  /* .  ** "LIM
d9a0: 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68  IT -1" always sh
d9b0: 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54  ows all rows.  T
d9c0: 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a  here is some.  *
d9d0: 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62  * controversy ab
d9e0: 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72  out what the cor
d9f0: 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68  rect behavior sh
da00: 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68  ould be..  ** Th
da10: 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
da20: 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72  entation interpr
da30: 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f  ets "LIMIT 0" to
da40: 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f   mean.  ** no ro
da50: 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ws..  */.  sqlit
da60: 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
da70: 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
da80: 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
da90: 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d  0 || p->pLimit!=
daa0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c  0 );.  if( p->pL
dab0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69  imit ){.    p->i
dac0: 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d  Limit = iLimit =
dad0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
dae0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
daf0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
db00: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76  .    if( NEVER(v
db10: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ==0) ) return;  
db20: 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64 20 68  /* VDBE should h
db30: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
db40: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
db50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
db60: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
db70: 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20  imit, &n) ){.   
db80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
db90: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
dba0: 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a  er, n, iLimit);.
dbb0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
dbc0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
dbd0: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69  nter"));.      i
dbe0: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
dbf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dc00: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
dc10: 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   0, iBreak);.   
dc20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d     }else if( n>=
dc30: 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
dc40: 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20  ow>(u64)n ){.   
dc50: 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
dc60: 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  ow = n;.      }.
dc70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dc80: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
dc90: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
dca0: 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  it, iLimit);.   
dcb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dcc0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
dcd0: 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  eInt, iLimit);. 
dce0: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
dcf0: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
dd00: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71  ter"));.      sq
dd10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
dd20: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c  v, OP_IfZero, iL
dd30: 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  imit, iBreak);. 
dd40: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
dd50: 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  pOffset ){.     
dd60: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f   p->iOffset = iO
dd70: 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65  ffset = ++pParse
dd80: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50  ->nMem;.      pP
dd90: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20  arse->nMem++;   
dda0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65  /* Allocate an e
ddb0: 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f  xtra register fo
ddc0: 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a  r limit+offset *
ddd0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
dde0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ddf0: 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66  p->pOffset, iOff
de00: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  set);.      sqli
de10: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
de20: 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69   OP_MustBeInt, i
de30: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56  Offset);.      V
de40: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
de50: 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29  OFFSET counter")
de60: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d  );.      addr1 =
de70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
de80: 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p1(v, OP_IfPos, 
de90: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
dea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
deb0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
dec0: 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20   0, iOffset);.  
ded0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
dee0: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31  umpHere(v, addr1
def0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
df00: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
df10: 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f  _Add, iLimit, iO
df20: 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31  ffset, iOffset+1
df30: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
df40: 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b  ment((v, "LIMIT+
df50: 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20  OFFSET"));.     
df60: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33   addr1 = sqlite3
df70: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
df80: 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b  _IfPos, iLimit);
df90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
dfa0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
dfb0: 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66  nteger, -1, iOff
dfc0: 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  set+1);.      sq
dfd0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
dfe0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
dff0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
e000: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
e010: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a  MPOUND_SELECT./*
e020: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
e030: 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61  ppropriate colla
e040: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
e050: 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  r the iCol-th co
e060: 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72  lumn of.** the r
e070: 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68  esult set for th
e080: 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  e compound-selec
e090: 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e  t statement "p".
e0a0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
e0b0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68  .** the column h
e0c0: 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f  as no default co
e0d0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
e0e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c  ..**.** The coll
e0f0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
e100: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  or the compound 
e110: 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20  select is taken 
e120: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74  from the.** left
e130: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
e140: 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61  e select that ha
e150: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  s a collating se
e160: 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  quence..*/.stati
e170: 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69  c CollSeq *multi
e180: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61  SelectCollSeq(Pa
e190: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
e1a0: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c  ect *p, int iCol
e1b0: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52  ){.  CollSeq *pR
e1c0: 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  et;.  if( p->pPr
e1d0: 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20  ior ){.    pRet 
e1e0: 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
e1f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e  lSeq(pParse, p->
e200: 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20  pPrior, iCol);. 
e210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74   }else{.    pRet
e220: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
e230: 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20  rt( iCol>=0 );. 
e240: 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20   if( pRet==0 && 
e250: 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e  iCol<p->pEList->
e260: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65  nExpr ){.    pRe
e270: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  t = sqlite3ExprC
e280: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
e290: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  ->pEList->a[iCol
e2a0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ].pExpr);.  }.  
e2b0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23  return pRet;.}.#
e2c0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e2d0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
e2e0: 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  LECT */..#ifndef
e2f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
e300: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
e310: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44  ine generates VD
e320: 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  BE code to compu
e330: 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  te the content o
e340: 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49  f a WITH RECURSI
e350: 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74  VE.** query of t
e360: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
e370: 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c   <recursive-tabl
e380: 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75  e> AS (<setup-qu
e390: 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  ery> UNION [ALL]
e3a0: 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72   <recursive-quer
e3b0: 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  y>).**          
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
e3d0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
e3e0: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
e3f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
e420: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
e430: 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a         p.**.**.*
e440: 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  * There is exact
e450: 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  ly one reference
e460: 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76   to the recursiv
e470: 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e-table in the F
e480: 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66  ROM clause.** of
e490: 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
e4a0: 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68  , marked with th
e4b0: 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 69  e SrcList->a[].i
e4c0: 73 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e  sRecursive flag.
e4d0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70  .**.** The setup
e4e0: 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65  -query runs once
e4f0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
e500: 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72  initial set of r
e510: 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69  ows that go.** i
e520: 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c  nto a Queue tabl
e530: 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74  e.  Rows are ext
e540: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
e550: 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20  Queue table one 
e560: 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68  by.** one.  Each
e570: 20 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66   row extracted f
e580: 72 6f 6d 20 69 51 75 65 75 65 20 69 73 20 6f 75  rom iQueue is ou
e590: 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20  tput to pDest.  
e5a0: 54 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a  Then the single.
e5b0: 2a 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f 77  ** extracted row
e5c0: 20 28 6e 6f 77 20 74 68 65 20 69 43 75 72 72 65   (now the iCurre
e5d0: 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f 6d 65  nt table) become
e5e0: 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  s the content of
e5f0: 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73 69 76   the.** recursiv
e600: 65 2d 74 61 62 6c 65 20 61 6e 64 20 72 65 63 75  e-table and recu
e610: 72 73 69 76 65 2d 71 75 65 72 79 20 69 73 20 72  rsive-query is r
e620: 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74 20  un.  The output 
e630: 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
e640: 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64 64  -query.** is add
e650: 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ed back into the
e660: 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
e670: 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77 20  hen another row 
e680: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
e690: 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20 74  m Queue.** and t
e6a0: 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f 6e  he iteration con
e6b0: 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68 65  tinues until the
e6c0: 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73 20   Queue table is 
e6d0: 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  empty..**.** If 
e6e0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  the compound que
e6f0: 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ry operator is U
e700: 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75 70  NION then no dup
e710: 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65 20  licate rows are 
e720: 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65 64  ever.** inserted
e730: 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20   into the Queue 
e740: 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69 73  table.  The iDis
e750: 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65 70  tinct table keep
e760: 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c 20  s a copy of all 
e770: 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  rows.** that hav
e780: 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73 65  e ever been inse
e790: 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65 20  rted into Queue 
e7a0: 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c 69  and causes dupli
e7b0: 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20 64  cates to be.** d
e7c0: 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74 68  iscarded.  If th
e7d0: 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  e operator is UN
e7e0: 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64 75  ION ALL, then du
e7f0: 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c 6c  plicates are all
e800: 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  owed..** .** If 
e810: 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61 6e  the query has an
e820: 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e 20   ORDER BY, then 
e830: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 51  entries in the Q
e840: 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20 6b  ueue table are k
e850: 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52 20  ept in.** ORDER 
e860: 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68 65  BY order and the
e870: 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73 20   first entry is 
e880: 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65 61  extracted for ea
e890: 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68 6f  ch cycle.  Witho
e8a0: 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20 42  ut.** an ORDER B
e8b0: 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61 62  Y, the Queue tab
e8c0: 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49 46  le is just a FIF
e8d0: 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c 49  O..**.** If a LI
e8e0: 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70 72  MIT clause is pr
e8f0: 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68 65  ovided, then the
e900: 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70 73   iteration stops
e910: 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f 77   after LIMIT row
e920: 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 6f  s.** have been o
e930: 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20  utput to pDest. 
e940: 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72 6f   A LIMIT of zero
e950: 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
e960: 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a 2a   no rows and a.*
e970: 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49 54  * negative LIMIT
e980: 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75 74   means to output
e990: 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20 74   all rows.  If t
e9a0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e 20  here is also an 
e9b0: 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a 2a  OFFSET clause.**
e9c0: 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76 65   with a positive
e9d0: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
e9e0: 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f 75   first OFFSET ou
e9f0: 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61 72  tputs are discar
ea00: 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74 68  ded rather.** th
ea10: 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74 6f  an being sent to
ea20: 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49 4d   pDest.  The LIM
ea30: 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e 6f  IT count does no
ea40: 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61 66  t begin until af
ea50: 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72 6f  ter OFFSET.** ro
ea60: 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ws have been ski
ea70: 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
ea80: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69 74  void generateWit
ea90: 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79 28  hRecursiveQuery(
eaa0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
eab0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
eac0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ead0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
eae0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
eaf0: 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20 74  cursive SELECT t
eb00: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
eb10: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
eb20: 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
eb30: 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
eb40: 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 53  esults */.){.  S
eb50: 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70  rcList *pSrc = p
eb60: 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a 20  ->pSrc;      /* 
eb70: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
eb80: 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76 65  of the recursive
eb90: 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
eba0: 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74  nCol = p->pEList
ebb0: 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75 6d  ->nExpr;  /* Num
ebc0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
ebd0: 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  n the recursive 
ebe0: 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65 20  table */.  Vdbe 
ebf0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
ec00: 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  be;      /* The 
ec10: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
ec20: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
ec30: 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ction */.  Selec
ec40: 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e 70  t *pSetup = p->p
ec50: 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20  Prior;   /* The 
ec60: 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a 20  setup query */. 
ec70: 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20   int addrTop;   
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ec90: 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
eca0: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
ecb0: 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b 20  ont, addrBreak; 
ecc0: 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55 45       /* CONTINUE
ecd0: 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72 65   and BREAK addre
ece0: 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sses */.  int iC
ecf0: 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20  urrent;         
ed00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 43          /* The C
ed10: 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f 0a  urrent table */.
ed20: 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e 74    int regCurrent
ed30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ed40: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
ed50: 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62 6c  ing Current tabl
ed60: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65 75  e */.  int iQueu
ed70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
ed80: 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65 75       /* The Queu
ed90: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
eda0: 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 20   iDistinct = 0; 
edb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
edc0: 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20 72   ensure unique r
edd0: 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e 20  esults if UNION 
ede0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
edf0: 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20 20   SRT_Table;     
ee00: 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72 69     /* How to wri
ee10: 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a 20  te to Queue */. 
ee20: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
ee30: 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20 2f  Queue;         /
ee40: 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61 72  * SelectDest tar
ee50: 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65 75  getting the Queu
ee60: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
ee70: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
ee80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
ee90: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
eea0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eec0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
eed0: 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75 74  .  /* Obtain aut
eee0: 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64 6f  horization to do
eef0: 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75 65   a recursive que
ef00: 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  ry */.  if( sqli
ef10: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
ef20: 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43 55  rse, SQLITE_RECU
ef30: 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29 20  RSIVE, 0, 0, 0) 
ef40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72  ) return;.  addr
ef50: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
ef60: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
ef70: 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71  .  addrCont = sq
ef80: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
ef90: 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 43 68  el(v);...  /* Ch
efa0: 65 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69  eck that there i
efb0: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72  s no ORDER BY or
efc0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 20 4e   LIMIT clause. N
efd0: 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20  either of these 
efe0: 0a 20 20 2a 2a 20 61 72 65 20 63 75 72 72 65 6e  .  ** are curren
eff0: 74 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e  tly supported on
f000: 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69   recursive queri
f010: 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  es..  */.  asser
f020: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
f030: 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 20 29 3b   || p->pLimit );
f040: 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
f050: 42 79 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 20  By || p->pLimit 
f060: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
f070: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
f080: 25 73 20 69 6e 20 61 20 72 65 63 75 72 73 69 76  %s in a recursiv
f090: 65 20 71 75 65 72 79 22 2c 0a 20 20 20 20 20 20  e query",.      
f0a0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3f 20    p->pOrderBy ? 
f0b0: 22 4f 52 44 45 52 20 42 59 22 20 3a 20 22 4c 49  "ORDER BY" : "LI
f0c0: 4d 49 54 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  MIT".    );.    
f0d0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
f0e0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72  * Locate the cur
f0f0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
f100: 65 20 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e Current table 
f110: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c  */.  for(i=0; AL
f120: 57 41 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72  WAYS(i<pSrc->nSr
f130: 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  c); i++){.    if
f140: 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52  ( pSrc->a[i].isR
f150: 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20  ecursive ){.    
f160: 20 20 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72    iCurrent = pSr
f170: 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b  c->a[i].iCursor;
f180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f190: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
f1a0: 6c 6f 63 61 74 65 20 63 75 72 73 6f 72 73 20 66  locate cursors f
f1b0: 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73  or Queue and Dis
f1c0: 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73  tinct.  The curs
f1d0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20  or number for.  
f1e0: 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20  ** the Distinct 
f1f0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78  table must be ex
f200: 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65  actly one greate
f210: 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20  r than Queue in 
f220: 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  order.  ** for t
f230: 68 65 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65  he SRT_DistTable
f240: 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 6f 20   destination to 
f250: 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75  work. */.  iQueu
f260: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
f270: 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d  ++;.  if( p->op=
f280: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
f290: 20 61 73 73 65 72 74 28 20 53 52 54 5f 54 61 62   assert( SRT_Tab
f2a0: 6c 65 2b 31 3d 3d 53 52 54 5f 44 69 73 74 54 61  le+1==SRT_DistTa
f2b0: 62 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ble );.    asser
f2c0: 74 28 20 53 52 54 5f 51 75 65 75 65 2b 31 3d 3d  t( SRT_Queue+1==
f2d0: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 29 3b  SRT_DistQueue );
f2e0: 0a 20 20 20 20 65 44 65 73 74 2b 2b 3b 0a 20 20  .    eDest++;.  
f2f0: 20 20 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50    iDistinct = pP
f300: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
f310: 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  }.  sqlite3Selec
f320: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51  tDestInit(&destQ
f330: 75 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75  ueue, eDest, iQu
f340: 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  eue);..  /* Allo
f350: 63 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72  cate cursors for
f360: 20 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c   Current, Queue,
f370: 20 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a   and Distinct. *
f380: 2f 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d  /.  regCurrent =
f390: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
f3a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
f3b0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
f3c0: 73 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c  seudo, iCurrent,
f3d0: 20 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f   regCurrent, nCo
f3e0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
f3f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
f400: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75  enEphemeral, iQu
f410: 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66  eue, nCol);.  if
f420: 28 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20  ( iDistinct ){. 
f430: 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
f440: 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56  hm[0] = sqlite3V
f450: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
f460: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69  OpenEphemeral, i
f470: 44 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20  Distinct, 0);.  
f480: 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
f490: 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
f4a0: 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 6f  l;.  }..  /* Sto
f4b0: 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  re the results o
f4c0: 66 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72  f the setup-quer
f4d0: 79 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20  y in Queue. */. 
f4e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
f4f0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74  ect(pParse, pSet
f500: 75 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b  up, &destQueue);
f510: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
f520: 72 6e 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74  rn;..  /* Find t
f530: 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74  he next row in t
f540: 68 65 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74  he Queue and out
f550: 70 75 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a  put that row */.
f560: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
f570: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f580: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65   OP_Rewind, iQue
f590: 75 65 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ue, addrBreak);.
f5a0: 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
f5b0: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
f5c0: 70 45 4c 69 73 74 2c 20 69 51 75 65 75 65 2c 0a  pEList, iQueue,.
f5d0: 20 20 20 20 20 20 30 2c 20 30 2c 20 70 44 65 73        0, 0, pDes
f5e0: 74 2c 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64  t, addrCont, add
f5f0: 72 42 72 65 61 6b 29 3b 0a 20 20 73 71 6c 69 74  rBreak);.  sqlit
f600: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
f610: 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b  el(v, addrCont);
f620: 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65 72 20  ..  /* Transfer 
f630: 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 20  the next row in 
f640: 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20 43 75  Queue over to Cu
f650: 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74  rrent */.  sqlit
f660: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
f670: 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72  OP_NullRow, iCur
f680: 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73  rent); /* To res
f690: 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20  et column cache 
f6a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
f6b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
f6c0: 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20 72 65  Data, iQueue, re
f6d0: 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 73 71 6c  gCurrent);.  sql
f6e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
f6f0: 2c 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75  , OP_Delete, iQu
f700: 65 75 65 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63  eue);..  /* Exec
f710: 75 74 65 20 74 68 65 20 72 65 63 75 72 73 69 76  ute the recursiv
f720: 65 20 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20  e SELECT taking 
f730: 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69  the single row i
f740: 6e 20 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a  n Current as.  *
f750: 2a 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * the value for 
f760: 74 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61  the recursive-ta
f770: 62 6c 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72  ble. Store the r
f780: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75  esults in the Qu
f790: 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  eue..  */.  p->p
f7a0: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c  Prior = 0;.  sql
f7b0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
f7c0: 65 2c 20 70 2c 20 26 64 65 73 74 51 75 65 75 65  e, p, &destQueue
f7d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
f7e0: 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 70  pPrior==0 );.  p
f7f0: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75  ->pPrior = pSetu
f800: 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75  p;..  /* Keep ru
f810: 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75  nning the loop u
f820: 6e 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 69  ntil the Queue i
f830: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c  s empty */.  sql
f840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f850: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64  , OP_Goto, 0, ad
f860: 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
f870: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
f880: 6c 28 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  l(v, addrBreak);
f890: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f  .}.#endif../* Fo
f8a0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
f8b0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d   */.static int m
f8c0: 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
f8d0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
f8e0: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
f8f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
f900: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
f910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f920: 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45  right-most of SE
f930: 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65  LECTs to be code
f940: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
f950: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
f960: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
f970: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
f980: 0a 29 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  .);...#ifndef SQ
f990: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
f9a0: 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20  ND_SELECT./*.** 
f9b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
f9c0: 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
f9d0: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
f9e0: 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
f9f0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
fa00: 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
fa10: 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
fa20: 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
fa30: 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
fa40: 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
fa50: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
fa60: 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
fa70: 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
fa80: 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
fa90: 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
faa0: 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
fab0: 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
fac0: 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
fad0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
fae0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
faf0: 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
fb00: 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
fb10: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
fb20: 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
fb30: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
fb40: 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
fb50: 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
fb60: 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
fb70: 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
fb80: 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
fb90: 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
fba0: 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
fbb0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
fbc0: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
fbd0: 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
fbe0: 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
fbf0: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
fc00: 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
fc10: 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
fc20: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
fc30: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
fc40: 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
fc50: 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
fc60: 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
fc70: 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
fc80: 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
fc90: 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
fca0: 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
fcb0: 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
fcc0: 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
fcd0: 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
fce0: 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
fcf0: 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
fd00: 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
fd10: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
fd20: 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
fd30: 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
fd40: 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
fd50: 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
fd60: 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
fd70: 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
fd80: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
fd90: 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
fda0: 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
fdb0: 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
fdc0: 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
fdd0: 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
fde0: 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
fdf0: 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
fe00: 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
fe10: 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
fe20: 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
fe30: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
fe40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
fe50: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
fe60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
fe70: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
fe80: 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
fe90: 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
fea0: 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
feb0: 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
fec0: 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
fed0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
fee0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
fef0: 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
ff00: 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
ff10: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
ff20: 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
ff30: 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
ff40: 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
ff50: 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
ff60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ff70: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ff80: 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
ff90: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
ffa0: 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
ffb0: 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
ffc0: 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
ffd0: 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
ffe0: 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
fff0: 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
10000 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
10010 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
10020 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
10030 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
10040 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10050 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
10060 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20 20  Sub1;           
10070 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
10080 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
10090 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20  .  int iSub2;   
100a0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
100b0 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
100c0 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
100d0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
100e0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
100f0 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
10100 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
10110 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
10120 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
10130 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
10140 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
10150 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
10160 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
10170 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
10180 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
10190 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
101a0 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
101b0 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
101c0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
101d0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
101e0 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
101f0 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
10200 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
10210 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
10220 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
10230 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ior;.  assert( p
10240 50 72 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73  Prior->pRightmos
10250 74 21 3d 70 50 72 69 6f 72 20 29 3b 0a 20 20 61  t!=pPrior );.  a
10260 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70  ssert( pPrior->p
10270 52 69 67 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52  Rightmost==p->pR
10280 69 67 68 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65  ightmost );.  de
10290 73 74 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69  st = *pDest;.  i
102a0 66 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  f( pPrior->pOrde
102b0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
102c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
102d0 65 2c 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75  e,"ORDER BY clau
102e0 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
102f0 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
10300 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
10310 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
10320 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
10330 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
10340 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  ct_end;.  }.  if
10350 28 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74  ( pPrior->pLimit
10360 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10370 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
10380 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f  LIMIT clause sho
10390 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25  uld come after %
103a0 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20  s not before",. 
103b0 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d       selectOpNam
103c0 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72  e(p->op));.    r
103d0 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
103e0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
103f0 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c  ;.  }..  v = sql
10400 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
10410 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76  se);.  assert( v
10420 21 3d 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56  !=0 );  /* The V
10430 44 42 45 20 61 6c 72 65 61 64 79 20 63 72 65 61  DBE already crea
10440 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66  ted by calling f
10450 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  unction */..  /*
10460 20 43 72 65 61 74 65 20 74 68 65 20 64 65 73 74   Create the dest
10470 69 6e 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72  ination temporar
10480 79 20 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73  y table if neces
10490 73 61 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sary.  */.  if( 
104a0 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f  dest.eDest==SRT_
104b0 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20  EphemTab ){.    
104c0 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
104d0 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t );.    sqlite3
104e0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
104f0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
10500 64 65 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d  dest.iSDParm, p-
10510 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b  >pEList->nExpr);
10520 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
10530 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
10540 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
10550 20 20 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53    dest.eDest = S
10560 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20  RT_Table;.  }.. 
10570 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c   /* Make sure al
10580 6c 20 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65  l SELECTs in the
10590 20 73 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20   statement have 
105a0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20  the same number 
105b0 6f 66 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a  of elements.  **
105c0 20 69 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74   in their result
105d0 20 73 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73   sets..  */.  as
105e0 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
105f0 26 26 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  && pPrior->pELis
10600 74 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45  t );.  if( p->pE
10610 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72  List->nExpr!=pPr
10620 69 6f 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ior->pEList->nEx
10630 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  pr ){.    if( p-
10640 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56  >selFlags & SF_V
10650 61 6c 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73  alues ){.      s
10660 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10670 50 61 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55  Parse, "all VALU
10680 45 53 20 6d 75 73 74 20 68 61 76 65 20 74 68 65  ES must have the
10690 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
106a0 74 65 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c  terms");.    }el
106b0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
106c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
106d0 2c 20 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68  , "SELECTs to th
106e0 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
106f0 20 6f 66 20 25 73 22 0a 20 20 20 20 20 20 20 20   of %s".        
10700 22 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68  " do not have th
10710 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
10720 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22   result columns"
10730 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
10740 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20  ->op));.    }.  
10750 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
10760 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
10770 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  end;.  }..#ifnde
10780 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
10790 45 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  E.  if( p->selFl
107a0 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69  ags & SF_Recursi
107b0 76 65 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ve ){.    genera
107c0 74 65 57 69 74 68 52 65 63 75 72 73 69 76 65 51  teWithRecursiveQ
107d0 75 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20  uery(pParse, p, 
107e0 26 64 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  &dest);.  }else.
107f0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
10800 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
10810 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
10820 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
10830 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
10840 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
10850 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
10860 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
10870 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
10880 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
10890 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65  }else..  /* Gene
108a0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
108b0 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
108c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
108d0 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
108e0 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
108f0 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
10900 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
10910 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  0;.      int nLi
10920 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  mit;.      asser
10930 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
10940 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  it );.      pPri
10950 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->iLimit = p->
10960 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  iLimit;.      pP
10970 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20  rior->iOffset = 
10980 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->iOffset;.    
10990 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74    pPrior->pLimit
109a0 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
109b0 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
109c0 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
109d0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
109e0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
109f0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
10a00 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
10a10 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
10a20 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
10a30 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
10a40 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
10a50 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
10a60 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
10a70 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
10a80 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
10a90 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
10aa0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
10ab0 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
10ac0 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69   = pPrior->iLimi
10ad0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  t;.      p->iOff
10ae0 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
10af0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
10b00 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
10b10 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
10b20 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10b30 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
10b40 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  iLimit);.       
10b50 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
10b60 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20   "Jump ahead if 
10b70 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29  LIMIT reached"))
10b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10b90 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
10ba0 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
10bb0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
10bc0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
10bd0 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
10be0 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
10bf0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
10c00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
10c10 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
10c20 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
10c30 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
10c40 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  r;.      p->nSel
10c50 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
10c60 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
10c70 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
10c80 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26  pLimit.       &&
10c90 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
10ca0 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
10cb0 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20  imit, &nLimit). 
10cc0 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e        && nLimit>
10cd0 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
10ce0 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74  ow > (u64)nLimit
10cf0 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
10d00 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
10d10 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = nLimit;.     
10d20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
10d30 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
10d40 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
10d50 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
10d60 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10d70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
10d80 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
10d90 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
10da0 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
10db0 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
10dc0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
10dd0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
10de0 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
10df0 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
10e00 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
10e10 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
10e20 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
10e30 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
10e40 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
10e50 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
10e60 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
10e70 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
10e80 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
10e90 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
10ea0 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
10eb0 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
10ec0 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
10ed0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
10ee0 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
10ef0 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
10f00 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
10f10 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
10f20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10f30 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
10f40 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
10f50 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
10f60 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
10f70 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
10f80 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69  ALWAYS(!p->pLimi
10f90 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74 29  t &&!p->pOffset)
10fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
10fb0 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
10fc0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
10fd0 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
10fe0 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
10ff0 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
11000 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11010 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
11020 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20  tmost!=p );  /* 
11030 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  Can only happen 
11040 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c 65  for leftward ele
11050 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20  ments.          
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66             ** of
11080 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65   a 3-way or more
11090 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20   compound */.   
110a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
110b0 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
110c0 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
110d0 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
110e0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
110f0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
11100 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
11110 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
11120 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
11130 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
11140 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44  onTab = dest.iSD
11150 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
11160 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
11170 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
11180 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
11190 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
111a0 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
111b0 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
111c0 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
111d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
111e0 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
111f0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
11200 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
11210 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
11220 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
11230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11240 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
11250 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
11260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
11270 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
11280 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
11290 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
112a0 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
112b0 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
112c0 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  st->selFlags |= 
112d0 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
112e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
112f0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
11300 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
11310 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
11320 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
11330 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
11340 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
11350 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
11360 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
11370 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
11380 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f  &uniondest, prio
11390 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a  rOp, unionTab);.
113a0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
113b0 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
113c0 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
113d0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
113e0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
113f0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
11400 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
11410 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
11420 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
11430 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
11440 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
11450 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
11460 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
11470 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
11480 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  f( p->op==TK_EXC
11490 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EPT ){.        o
114a0 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a  p = SRT_Except;.
114b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
114c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
114d0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
114e0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
114f0 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a  _Union;.      }.
11500 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
11510 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
11520 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
11530 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
11540 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
11550 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
11560 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
11570 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f   = 0;.      unio
11580 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70  ndest.eDest = op
11590 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
115a0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
115b0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
115c0 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
115d0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
115e0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e  t(pParse, p, &un
115f0 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
11600 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
11610 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
11620 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
11630 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
11640 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
11650 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
11660 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
11670 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
11680 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
11690 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
116a0 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
116b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
116c0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
116d0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
116e0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
116f0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
11700 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
11710 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
11720 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
11730 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
11740 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  ION ) p->nSelect
11750 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
11760 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
11770 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
11780 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
11790 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
117a0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
117b0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
117c0 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
117d0 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
117e0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
117f0 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   0;..      /* Co
11800 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
11810 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
11820 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
11830 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
11840 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
11850 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
11860 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
11870 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d  ssert( unionTab=
11880 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c  =dest.iSDParm ||
11890 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
118a0 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66  orOp );.      if
118b0 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  ( dest.eDest!=pr
118c0 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
118d0 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
118e0 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
118f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11900 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
11910 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
11920 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
11930 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
11940 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
11950 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
11960 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
11970 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
11980 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
11990 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
119a0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
119b0 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
119c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
119d0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
119e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
119f0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
11a00 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
11a10 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
11a20 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
11a30 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
11a40 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
11a50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11a60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
11a70 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
11a80 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  b, iBreak);.    
11a90 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
11aa0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
11ab0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
11ac0 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
11ad0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
11ae0 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a  List, unionTab,.
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64          0, 0, &d
11b10 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65  est, iCont, iBre
11b20 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
11b30 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
11b40 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
11b50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11b60 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11b70 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  Next, unionTab, 
11b80 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  iStart);.       
11b90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
11ba0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65  lveLabel(v, iBre
11bb0 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ak);.        sql
11bc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11bd0 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f  , OP_Close, unio
11be0 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  nTab, 0);.      
11bf0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11c00 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
11c10 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d  : assert( p->op=
11c20 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b  =TK_INTERSECT );
11c30 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62   {.      int tab
11c40 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69  1, tab2;.      i
11c50 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
11c60 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
11c70 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70  Expr *pLimit, *p
11c80 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e  Offset;.      in
11c90 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65  t addr;.      Se
11ca0 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65  lectDest interse
11cb0 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e  ctdest;.      in
11cc0 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  t r1;..      /* 
11cd0 49 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66  INTERSECT is dif
11ce0 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20  ferent from the 
11cf0 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20  others since it 
11d00 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a  requires.      *
11d10 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20  * two temporary 
11d20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69  tables.  Hence i
11d30 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61  t has its own ca
11d40 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20  se.  Begin.     
11d50 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e   ** by allocatin
11d60 67 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20  g the tables we 
11d70 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20  will need..     
11d80 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d   */.      tab1 =
11d90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
11da0 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50  .      tab2 = pP
11db0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
11dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11dd0 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20  OrderBy==0 );.. 
11de0 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
11df0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11e00 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
11e10 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20  l, tab1, 0);.   
11e20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
11e30 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
11e40 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
11e50 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
11e60 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
11e70 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c  >pRightmost->sel
11e80 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
11e90 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
11ea0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
11eb0 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  st );..      /* 
11ec0 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73  Code the SELECTs
11ed0 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74   to our left int
11ee0 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
11ef0 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20  e "tab1"..      
11f00 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
11f10 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
11f20 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53  intersectdest, S
11f30 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b  RT_Union, tab1);
11f40 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
11f50 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
11f60 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
11f70 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
11f80 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
11f90 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
11fa0 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29   &intersectdest)
11fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
11fc0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  {.        goto m
11fd0 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
11fe0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11ff0 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72  /* Code the curr
12000 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20  ent SELECT into 
12010 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
12020 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a  "tab2".      */.
12030 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
12040 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12050 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
12060 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20  al, tab2, 0);.  
12070 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
12080 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
12090 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d  = -1 );.      p-
120a0 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
120b0 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70   = addr;.      p
120c0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
120d0 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
120e0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
120f0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
12100 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
12110 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
12120 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
12130 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65       intersectde
12140 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62  st.iSDParm = tab
12150 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  2;.      explain
12160 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
12170 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
12180 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
12190 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
121a0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69  ct(pParse, p, &i
121b0 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20  ntersectdest);. 
121c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
121d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
121e0 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20        pDelete = 
121f0 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  p->pPrior;.     
12200 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72   p->pPrior = pPr
12210 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ior;.      if( p
12220 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72  ->nSelectRow>pPr
12230 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
12240 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
12250 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
12260 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69  tRow;.      sqli
12270 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
12280 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
12290 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
122a0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
122b0 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
122c0 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  et;..      /* Ge
122d0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
122e0 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63  ake the intersec
122f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20  tion of the two 
12300 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20  temporary.      
12310 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20  ** tables..     
12320 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
12330 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
12340 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
12350 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
12360 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63  ){.        Selec
12370 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  t *pFirst = p;. 
12380 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
12390 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
123a0 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
123b0 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
123c0 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
123d0 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
123e0 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
123f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42        }.      iB
12400 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64  reak = sqlite3Vd
12410 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
12420 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71        iCont = sq
12430 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
12440 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d  el(v);.      com
12450 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
12460 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42  rs(pParse, p, iB
12470 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
12480 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12490 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62  , OP_Rewind, tab
124a0 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  1, iBreak);.    
124b0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
124c0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
124d0 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d  ;.      iStart =
124e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
124f0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  p2(v, OP_RowKey,
12500 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20   tab1, r1);.    
12510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12520 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74  Op4Int(v, OP_Not
12530 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f  Found, tab2, iCo
12540 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  nt, r1, 0);.    
12550 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12560 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12570 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  r1);.      selec
12580 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
12590 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
125a0 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20   tab1,.         
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
125c0 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
125d0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
125e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
125f0 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
12600 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12610 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12620 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
12630 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  art);.      sqli
12640 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
12650 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
12660 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12670 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
12680 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ose, tab2, 0);. 
12690 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
126a0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp2(v, OP_Clo
126b0 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20  se, tab1, 0);.  
126c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
126d0 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43  .  }..  explainC
126e0 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c  omposite(pParse,
126f0 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69   p->op, iSub1, i
12700 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f  Sub2, p->op!=TK_
12710 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ALL);..  /* Comp
12720 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  ute collating se
12730 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79 20  quences used by 
12740 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
12750 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74 6f  tables needed to
12760 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
12770 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
12780 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65 20    ** Attach the 
12790 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
127a0 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61  e to all tempora
127b0 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ry tables..  **.
127c0 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f    ** This sectio
127d0 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65 20  n is run by the 
127e0 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43  right-most SELEC
127f0 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79  T statement only
12800 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74  ..  ** SELECT st
12810 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  atements to the 
12820 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69 70  left always skip
12830 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68 65   this part.  The
12840 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a   right-most.  **
12850 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61 6c   SELECT might al
12860 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61 72  so skip this par
12870 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20 4f  t if it has no O
12880 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
12890 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20  nd.  ** no temp 
128a0 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75 69  tables are requi
128b0 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  red..  */.  if( 
128c0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
128d0 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20 29  _UsesEphemeral )
128e0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  {.    int i;    
128f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12900 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
12910 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e  ter */.    KeyIn
12920 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20  fo *pKeyInfo;   
12930 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
12940 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
12950 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
12960 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74 20  t */.    Select 
12970 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
12980 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
12990 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53 45  oping through SE
129a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
129b0 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
129c0 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20  *apColl;        
129d0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
129e0 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65 79  ing through pKey
129f0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f  Info->aColl[] */
12a00 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
12a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12a30 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
12a40 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73  t set */..    as
12a50 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d  sert( p->pRightm
12a60 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43  ost==p );.    nC
12a70 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  ol = p->pEList->
12a80 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79 49  nExpr;.    pKeyI
12a90 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
12aa0 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43  InfoAlloc(db, nC
12ab0 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20  ol, 1);.    if( 
12ac0 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20  !pKeyInfo ){.   
12ad0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
12ae0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
12af0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
12b00 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  d;.    }.    for
12b10 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65  (i=0, apColl=pKe
12b20 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c  yInfo->aColl; i<
12b30 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c  nCol; i++, apCol
12b40 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43  l++){.      *apC
12b50 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63  oll = multiSelec
12b60 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  tCollSeq(pParse,
12b70 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66   p, i);.      if
12b80 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a  ( 0==*apColl ){.
12b90 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20          *apColl 
12ba0 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  = db->pDfltColl;
12bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
12bc0 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b      for(pLoop=p;
12bd0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
12be0 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  oop->pPrior){.  
12bf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
12c00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12c10 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70  int addr = pLoop
12c20 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69  ->addrOpenEphm[i
12c30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ];.        if( a
12c40 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ddr<0 ){.       
12c50 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20     /* If [0] is 
12c60 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d 20  unused then [1] 
12c70 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20  is also unused. 
12c80 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20 20   So we can.     
12c90 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 73       ** always s
12ca0 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20 73  afely abort as s
12cb0 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73 74  oon as the first
12cc0 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73 20   unused slot is 
12cd0 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20  found */.       
12ce0 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f 70     assert( pLoop
12cf0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
12d00 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ]<0 );.         
12d10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
12d20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
12d30 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
12d40 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20   addr, nCol);.  
12d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12d60 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64 64  eChangeP4(v, add
12d70 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  r, (char*)sqlite
12d80 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
12d90 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a     P4_KEYINFO);.
12dc0 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
12dd0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d  ddrOpenEphm[i] =
12de0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
12df0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b 65   }.    sqlite3Ke
12e00 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 49  yInfoUnref(pKeyI
12e10 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69  nfo);.  }..multi
12e20 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70  _select_end:.  p
12e30 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64 65  Dest->iSdst = de
12e40 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65 73  st.iSdst;.  pDes
12e50 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74 2e  t->nSdst = dest.
12e60 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  nSdst;.  sqlite3
12e70 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
12e80 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65 74   pDelete);.  ret
12e90 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
12ea0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12eb0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
12ec0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  */../*.** Code a
12ed0 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  n output subrout
12ee0 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75 74  ine for a corout
12ef0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ine implementati
12f00 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43  on of a.** SELEC
12f10 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a  T statment..**.*
12f20 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62 65  * The data to be
12f30 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74 61   output is conta
12f40 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64  ined in pIn->iSd
12f50 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a 2a  st.  There are.*
12f60 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c  * pIn->nSdst col
12f70 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70 75  umns to be outpu
12f80 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68 65  t.  pDest is whe
12f90 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73 68  re the output sh
12fa0 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e  ould.** be sent.
12fb0 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e  .**.** regReturn
12fc0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
12fd0 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20 68  f the register h
12fe0 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72 6f  olding the subro
12ff0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20  utine.** return 
13000 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  address..**.** I
13010 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
13020 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73 74   it is the first
13030 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20 76   register in a v
13040 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65  ector that.** re
13050 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69 6f  cords the previo
13060 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b  us output.  mem[
13070 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66 6c  regPrev] is a fl
13080 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73 65  ag that is false
13090 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 73  .** if there has
130a0 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75   been no previou
130b0 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72 65  s output.  If re
130c0 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f 64  gPrev>0 then cod
130d0 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65  e is.** generate
130e0 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64 75  d to suppress du
130f0 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79 49  plicates.  pKeyI
13100 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72 20  nfo is used for 
13110 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79  comparing.** key
13120 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
13130 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20 70  LIMIT found in p
13140 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61 63  ->iLimit is reac
13150 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69  hed, jump immedi
13160 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65  ately to.** iBre
13170 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ak..*/.static in
13180 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74  t generateOutput
13190 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50 61  Subroutine(.  Pa
131a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
131b0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
131c0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
131d0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
131e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
131f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
13200 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
13210 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  In,        /* Co
13220 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69 6e  routine supplyin
13230 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65  g data */.  Sele
13240 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
13250 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
13260 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a 2f  send the data */
13270 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72 6e  .  int regReturn
13280 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
13290 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73 73  e return address
132a0 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
132b0 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20 20  nt regPrev,     
132c0 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
132d0 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73 74  us result regist
132e0 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65  er.  No uniquene
132f0 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79  ss if 0 */.  Key
13300 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
13310 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70       /* For comp
13320 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76 69  aring with previ
13330 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69  ous entry */.  i
13340 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20  nt iBreak       
13350 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
13360 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68  ere if we hit th
13370 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20  e LIMIT */.){.  
13380 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
13390 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
133a0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20  Continue;.  int 
133b0 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20  addr;..  addr = 
133c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
133d0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f  ntAddr(v);.  iCo
133e0 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
133f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
13400 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
13410 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20   duplicates for 
13420 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61  UNION, EXCEPT, a
13430 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20  nd INTERSECT .  
13440 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76  */.  if( regPrev
13450 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20   ){.    int j1, 
13460 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c  j2;.    j1 = sql
13470 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13480 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50  , OP_IfNot, regP
13490 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  rev);.    j2 = s
134a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
134b0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
134c0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50  pIn->iSdst, regP
134d0 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73  rev+1, pIn->nSds
134e0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b   (char*)sqlite3K
13510 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e  eyInfoRef(pKeyIn
13520 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  fo), P4_KEYINFO)
13530 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
13540 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
13550 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69  mp, j2+2, iConti
13560 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20  nue, j2+2);.    
13570 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
13580 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
13590 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
135a0 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49  3(v, OP_Copy, pI
135b0 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65  n->iSdst, regPre
135c0 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d  v+1, pIn->nSdst-
135d0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
135e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
135f0 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50  Integer, 1, regP
13600 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rev);.  }.  if( 
13610 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
13620 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
13630 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72  n 0;..  /* Suppr
13640 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f 46  ess the first OF
13650 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66 20  FSET entries if 
13660 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53  there is an OFFS
13670 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20  ET clause.  */. 
13680 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
13690 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20  , iContinue);.. 
136a0 20 73 77 69 74 63 68 28 20 70 44 65 73 74 2d 3e   switch( pDest->
136b0 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
136c0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
136d0 20 61 73 20 64 61 74 61 20 75 73 69 6e 67 20 61   as data using a
136e0 20 75 6e 69 71 75 65 20 6b 65 79 2e 0a 20 20 20   unique key..   
136f0 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
13700 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  _Table:.    case
13710 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b   SRT_EphemTab: {
13720 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20  .      int r1 = 
13730 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
13740 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
13750 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
13760 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
13770 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  se);.      testc
13780 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ase( pDest->eDes
13790 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t==SRT_Table );.
137a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
137b0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
137c0 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20  T_EphemTab );.  
137d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
137e0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
137f0 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64  Record, pIn->iSd
13800 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20  st, pIn->nSdst, 
13810 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
13820 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13830 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 70 44 65  OP_NewRowid, pDe
13840 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 32 29  st->iSDParm, r2)
13850 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13860 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13870 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
13880 53 44 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b  SDParm, r1, r2);
13890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
138a0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
138b0 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
138c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
138d0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
138e0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
138f0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
13900 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
13910 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13920 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
13930 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
13940 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
13950 65 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74  e creating a set
13960 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e   for an "expr IN
13970 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63   (SELECT ...)" c
13980 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a  onstruct,.    **
13990 20 74 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75   then there shou
139a0 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69  ld be a single i
139b0 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  tem on the stack
139c0 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a 20 20  .  Write this.  
139d0 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74    ** item into t
139e0 68 65 20 73 65 74 20 74 61 62 6c 65 20 77 69 74  he set table wit
139f0 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20  h bogus data..  
13a00 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
13a10 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 69  T_Set: {.      i
13a20 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 61 73 73  nt r1;.      ass
13a30 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d  ert( pIn->nSdst=
13a40 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65 73  =1 );.      pDes
13a50 74 2d 3e 61 66 66 53 64 73 74 20 3d 20 0a 20 20  t->affSdst = .  
13a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
13a70 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 2d  mpareAffinity(p-
13a80 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
13a90 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53  xpr, pDest->affS
13aa0 64 73 74 29 3b 0a 20 20 20 20 20 20 72 31 20 3d  dst);.      r1 =
13ab0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
13ac0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
13ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13ae0 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op4(v, OP_MakeRe
13af0 63 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74  cord, pIn->iSdst
13b00 2c 20 31 2c 20 72 31 2c 20 26 70 44 65 73 74 2d  , 1, r1, &pDest-
13b10 3e 61 66 66 53 64 73 74 2c 31 29 3b 0a 20 20 20  >affSdst,1);.   
13b20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
13b30 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
13b40 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
13b50 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
13b60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13b70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
13b80 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  t, pDest->iSDPar
13b90 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  m, r1);.      sq
13ba0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
13bb0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
13bc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13bd0 20 20 7d 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e    }..#if 0  /* N
13be0 65 76 65 72 20 6f 63 63 75 72 73 20 6f 6e 20 61  ever occurs on a
13bf0 6e 20 4f 52 44 45 52 20 42 59 20 71 75 65 72 79  n ORDER BY query
13c00 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   */.    /* If an
13c10 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
13c20 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
13c30 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
13c40 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
13c50 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
13c60 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
13c70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13c80 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
13c90 31 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  1, pDest->iSDPar
13ca0 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
13cb0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
13cc0 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
13cd0 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
13ce0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13cf0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
13d00 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
13d10 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
13d20 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
13d30 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
13d40 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
13d50 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
13d60 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
13d70 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
13d80 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
13d90 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
13da0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
13db0 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
13dc0 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
13dd0 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  dst==1 );.      
13de0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
13df0 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d  ove(pParse, pIn-
13e00 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69  >iSdst, pDest->i
13e10 53 44 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20  SDParm, 1);.    
13e20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
13e30 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20  lause will jump 
13e40 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
13e50 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
13e60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
13e70 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
13e80 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
13e90 45 52 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54  ERY */..    /* T
13ea0 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 73  he results are s
13eb0 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75 65  tored in a seque
13ec0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
13ed0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
13ee0 20 61 74 20 70 44 65 73 74 2d 3e 69 53 64 73 74   at pDest->iSdst
13ef0 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 2d 72  .  Then the co-r
13f00 6f 75 74 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20  outine yields.. 
13f10 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
13f20 52 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a  RT_Coroutine: {.
13f30 20 20 20 20 20 20 69 66 28 20 70 44 65 73 74 2d        if( pDest-
13f40 3e 69 53 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20  >iSdst==0 ){.   
13f50 20 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64 73       pDest->iSds
13f60 74 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  t = sqlite3GetTe
13f70 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
13f80 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
13f90 20 20 20 20 20 70 44 65 73 74 2d 3e 6e 53 64 73       pDest->nSds
13fa0 74 20 3d 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a  t = pIn->nSdst;.
13fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
13fc0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
13fd0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
13fe0 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 64  Sdst, pDest->iSd
13ff0 73 74 2c 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  st, pDest->nSdst
14000 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14010 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14020 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69  _Yield, pDest->i
14030 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 62  SDParm);.      b
14040 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
14050 20 2f 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74   /* If none of t
14060 68 65 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 74  he above, then t
14070 68 65 20 72 65 73 75 6c 74 20 64 65 73 74 69 6e  he result destin
14080 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20  ation must be.  
14090 20 20 2a 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e    ** SRT_Output.
140a0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
140b0 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  s never called w
140c0 69 74 68 20 61 6e 79 20 6f 74 68 65 72 0a 20 20  ith any other.  
140d0 20 20 2a 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e    ** destination
140e0 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
140f0 6f 6e 65 73 20 68 61 6e 64 6c 65 64 20 61 62 6f  ones handled abo
14100 76 65 20 6f 72 20 53 52 54 5f 4f 75 74 70 75 74  ve or SRT_Output
14110 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
14120 46 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2c 20  For SRT_Output, 
14130 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
14140 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
14150 20 6f 66 20 72 65 67 69 73 74 65 72 73 2e 20 20   of registers.  
14160 0a 20 20 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  .    ** Then the
14170 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70   OP_ResultRow op
14180 63 6f 64 65 20 69 73 20 75 73 65 64 20 74 6f 20  code is used to 
14190 63 61 75 73 65 20 73 71 6c 69 74 65 33 5f 73 74  cause sqlite3_st
141a0 65 70 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72  ep() to.    ** r
141b0 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 72  eturn the next r
141c0 6f 77 20 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20  ow of result..  
141d0 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74    */.    default
141e0 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
141f0 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
14200 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20  SRT_Output );.  
14210 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14220 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
14230 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73  ltRow, pIn->iSds
14240 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
14250 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14260 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
14270 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
14280 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
14290 64 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dst);.      brea
142a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
142b0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
142c0 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
142d0 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
142e0 65 61 63 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  eached..  */.  i
142f0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  f( p->iLimit ){.
14300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14310 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65  ddOp3(v, OP_IfZe
14320 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69  ro, p->iLimit, i
14330 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a  Break, -1);.  }.
14340 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
14350 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65  he subroutine re
14360 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
14370 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
14380 62 65 6c 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65  bel(v, iContinue
14390 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
143a0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
143b0 75 72 6e 2c 20 72 65 67 52 65 74 75 72 6e 29 3b  urn, regReturn);
143c0 0a 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ..  return addr;
143d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e  .}../*.** Altern
143e0 61 74 69 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73  ative compound s
143f0 65 6c 65 63 74 20 63 6f 64 65 20 67 65 6e 65 72  elect code gener
14400 61 74 6f 72 20 66 6f 72 20 63 61 73 65 73 20 77  ator for cases w
14410 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  hen there.** is 
14420 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
14430 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73  se..**.** We ass
14440 75 6d 65 20 61 20 71 75 65 72 79 20 6f 66 20 74  ume a query of t
14450 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
14460 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73  m:.**.**      <s
14470 65 6c 65 63 74 41 3e 20 20 3c 6f 70 65 72 61 74  electA>  <operat
14480 6f 72 3e 20 20 3c 73 65 6c 65 63 74 42 3e 20 20  or>  <selectB>  
14490 4f 52 44 45 52 20 42 59 20 3c 6f 72 64 65 72 62  ORDER BY <orderb
144a0 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70  ylist>.**.** <op
144b0 65 72 61 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f  erator> is one o
144c0 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49  f UNION ALL, UNI
144d0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
144e0 4e 54 45 52 53 45 43 54 2e 20 20 54 68 65 20 69  NTERSECT.  The i
144f0 64 65 61 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64  dea.** is to cod
14500 65 20 62 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e  e both <selectA>
14510 20 61 6e 64 20 3c 73 65 6c 65 63 74 42 3e 20 77   and <selectB> w
14520 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
14530 20 63 6c 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f   clause as.** co
14540 2d 72 6f 75 74 69 6e 65 73 2e 20 20 54 68 65 6e  -routines.  Then
14550 20 72 75 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74   run the co-rout
14560 69 6e 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c  ines in parallel
14570 20 61 6e 64 20 6d 65 72 67 65 20 74 68 65 20 72   and merge the r
14580 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74  esults.** into t
14590 68 65 20 6f 75 74 70 75 74 2e 20 20 49 6e 20 61  he output.  In a
145a0 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
145b0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 28 63  wo coroutines (c
145c0 61 6c 6c 65 64 20 73 65 6c 65 63 74 41 20 61 6e  alled selectA an
145d0 64 0a 2a 2a 20 73 65 6c 65 63 74 42 29 20 74 68  d.** selectB) th
145e0 65 72 65 20 61 72 65 20 37 20 73 75 62 72 6f 75  ere are 7 subrou
145f0 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tines:.**.**    
14600 6f 75 74 41 3a 20 20 20 20 4d 6f 76 65 20 74 68  outA:    Move th
14610 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20  e output of the 
14620 73 65 6c 65 63 74 41 20 63 6f 72 6f 75 74 69 6e  selectA coroutin
14630 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  e into the outpu
14640 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
14650 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
14660 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20   query..**.**   
14670 20 6f 75 74 42 3a 20 20 20 20 4d 6f 76 65 20 74   outB:    Move t
14680 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
14690 20 73 65 6c 65 63 74 42 20 63 6f 72 6f 75 74 69   selectB corouti
146a0 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  ne into the outp
146b0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ut.**           
146c0 20 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e    of the compoun
146d0 64 20 71 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20  d query.  (Only 
146e0 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 55 4e  generated for UN
146f0 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ION and.**      
14700 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c         UNION ALL
14710 2e 20 20 45 58 43 45 50 54 20 61 6e 64 20 49 4e  .  EXCEPT and IN
14720 53 45 52 54 53 45 43 54 20 6e 65 76 65 72 20 6f  SERTSECT never o
14730 75 74 70 75 74 20 61 20 72 6f 77 20 74 68 61 74  utput a row that
14740 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14750 61 70 70 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20  appears only in 
14760 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74  B.).**.**    Alt
14770 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65  B:    Called whe
14780 6e 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20  n there is data 
14790 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74  from both corout
147a0 69 6e 65 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a  ines and A<B..**
147b0 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 20 20 20  .**    AeqB:    
147c0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
147d0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
147e0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
147f0 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20  nd A==B..**.**  
14800 20 20 41 67 74 42 3a 20 20 20 20 43 61 6c 6c 65    AgtB:    Calle
14810 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
14820 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
14830 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3e  oroutines and A>
14840 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41  B..**.**    EofA
14850 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
14860 20 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74   data is exhaust
14870 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e  ed from selectA.
14880 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20  .**.**    EofB: 
14890 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64     Called when d
148a0 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64  ata is exhausted
148b0 20 66 72 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a   from selectB..*
148c0 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
148d0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c  ntation of the l
148e0 61 74 74 65 72 20 66 69 76 65 20 73 75 62 72 6f  atter five subro
148f0 75 74 69 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e  utines depend on
14900 20 77 68 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72   which .** <oper
14910 61 74 6f 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a  ator> is used:.*
14920 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  *.**.**         
14930 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20      UNION ALL   
14940 20 20 20 20 20 20 55 4e 49 4f 4e 20 20 20 20 20        UNION     
14950 20 20 20 20 20 20 20 45 58 43 45 50 54 20 20 20         EXCEPT   
14960 20 20 20 20 20 20 20 49 4e 54 45 52 53 45 43 54         INTERSECT
14970 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2d 2d 2d  .**          ---
14980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
14990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
149a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d  -------------  -
149b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149c0 0a 2a 2a 20 20 20 41 6c 74 42 3a 20 20 20 6f 75  .**   AltB:   ou
149d0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
149e0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
149f0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
14a00 20 20 20 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a       nextA.**.**
14a10 20 20 20 41 65 71 42 3a 20 20 20 6f 75 74 41 2c     AeqB:   outA,
14a20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
14a30 65 78 74 41 20 20 20 20 20 20 20 20 20 20 20 20  extA            
14a40 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6f   nextA         o
14a50 75 74 41 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a  utA, nextA.**.**
14a60 20 20 20 41 67 74 42 3a 20 20 20 6f 75 74 42 2c     AgtB:   outB,
14a70 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74 42   nextB      outB
14a80 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20  , nextB         
14a90 20 6e 65 78 74 42 20 20 20 20 20 20 20 20 20 20   nextB          
14aa0 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20    nextB.**.**   
14ab0 45 6f 66 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65  EofA:   outB, ne
14ac0 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
14ad0 65 78 74 42 20 20 20 20 20 20 20 20 20 20 68 61  extB          ha
14ae0 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 68  lt             h
14af0 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42  alt.**.**   EofB
14b00 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20  :   outA, nextA 
14b10 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
14b20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
14b30 74 41 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a  tA         halt.
14b40 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74  **.** In the Alt
14b50 42 2c 20 41 65 71 42 2c 20 61 6e 64 20 41 67 74  B, AeqB, and Agt
14b60 42 20 73 75 62 72 6f 75 74 69 6e 65 73 2c 20 61  B subroutines, a
14b70 6e 20 45 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f  n EOF on A follo
14b80 77 69 6e 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61  wing nextA.** ca
14b90 75 73 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  uses an immediat
14ba0 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 41 20 61  e jump to EofA a
14bb0 6e 64 20 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66  nd an EOF on B f
14bc0 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 42 20 63  ollowing nextB c
14bd0 61 75 73 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65  auses.** an imme
14be0 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
14bf0 66 42 2e 20 20 57 69 74 68 69 6e 20 45 6f 66 41  fB.  Within EofA
14c00 20 61 6e 64 20 45 6f 66 42 2c 20 61 6e 64 20 45   and EofB, and E
14c10 4f 46 20 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a  OF on entry or.*
14c20 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74  * following next
14c30 58 20 63 61 75 73 65 73 20 61 20 6a 75 6d 70 20  X causes a jump 
14c40 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
14c50 65 20 73 65 6c 65 63 74 20 70 72 6f 63 65 73 73  e select process
14c60 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69  ing..**.** Dupli
14c70 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20  cate removal in 
14c80 74 68 65 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  the UNION, EXCEP
14c90 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
14ca0 20 63 61 73 65 73 20 69 73 20 68 61 6e 64 6c 65   cases is handle
14cb0 64 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  d.** within the 
14cc0 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
14cd0 65 2e 20 20 54 68 65 20 72 65 67 50 72 65 76 20  e.  The regPrev 
14ce0 72 65 67 69 73 74 65 72 20 73 65 74 20 68 6f 6c  register set hol
14cf0 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ds the previousl
14d00 79 0a 2a 2a 20 6f 75 74 70 75 74 20 76 61 6c 75  y.** output valu
14d10 65 2e 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e  e.  A comparison
14d20 20 69 73 20 6d 61 64 65 20 61 67 61 69 6e 73 74   is made against
14d30 20 74 68 69 73 20 76 61 6c 75 65 20 61 6e 64 20   this value and 
14d40 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73  the output.** is
14d50 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
14d60 6e 65 78 74 20 72 65 73 75 6c 74 73 20 77 6f 75  next results wou
14d70 6c 64 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ld be the same a
14d80 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 2e 0a  s the previous..
14d90 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  **.** The implem
14da0 65 6e 74 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73  entation plan is
14db0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
14dc0 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73  e two coroutines
14dd0 20 61 6e 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75   and seven.** su
14de0 62 72 6f 75 74 69 6e 65 73 20 66 69 72 73 74 2c  broutines first,
14df0 20 74 68 65 6e 20 70 75 74 20 74 68 65 20 63 6f   then put the co
14e00 6e 74 72 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74  ntrol logic at t
14e10 68 65 20 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65  he bottom.  Like
14e20 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
14e30 20 20 20 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a        goto Init.
14e40 2a 2a 20 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f  **     coA: coro
14e50 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 71  utine for left q
14e60 75 65 72 79 20 28 41 29 0a 2a 2a 20 20 20 20 20  uery (A).**     
14e70 63 6f 42 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66  coB: coroutine f
14e80 6f 72 20 72 69 67 68 74 20 71 75 65 72 79 20 28  or right query (
14e90 42 29 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f  B).**    outA: o
14ea0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
14eb0 20 41 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f   A.**    outB: o
14ec0 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66  utput one row of
14ed0 20 42 20 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e   B (UNION and UN
14ee0 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a  ION ALL only).**
14ef0 20 20 20 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a      EofA: ....**
14f00 20 20 20 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a      EofB: ....**
14f10 20 20 20 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a      AltB: ....**
14f20 20 20 20 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a      AeqB: ....**
14f30 20 20 20 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a      AgtB: ....**
14f40 20 20 20 20 49 6e 69 74 3a 20 69 6e 69 74 69 61      Init: initia
14f50 6c 69 7a 65 20 63 6f 72 6f 75 74 69 6e 65 20 72  lize coroutine r
14f60 65 67 69 73 74 65 72 73 0a 2a 2a 20 20 20 20 20  egisters.**     
14f70 20 20 20 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a       yield coA.*
14f80 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
14f90 66 28 41 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a  f(A) goto EofA.*
14fa0 2a 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64  *          yield
14fb0 20 63 6f 42 0a 2a 2a 20 20 20 20 20 20 20 20 20   coB.**         
14fc0 20 69 66 20 65 6f 66 28 42 29 20 67 6f 74 6f 20   if eof(B) goto 
14fd0 45 6f 66 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a  EofB.**    Cmpr:
14fe0 20 43 6f 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a   Compare A, B.**
14ff0 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 41            Jump A
15000 6c 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 0a  ltB, AeqB, AgtB.
15010 2a 2a 20 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a  **     End: ....
15020 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c  **.** We call Al
15030 74 42 2c 20 41 65 71 42 2c 20 41 67 74 42 2c 20  tB, AeqB, AgtB, 
15040 45 6f 66 41 2c 20 61 6e 64 20 45 6f 66 42 20 22  EofA, and EofB "
15050 73 75 62 72 6f 75 74 69 6e 65 73 22 20 62 75 74  subroutines" but
15060 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a   they are not.**
15070 20 61 63 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64   actually called
15080 20 75 73 69 6e 67 20 47 6f 73 75 62 20 61 6e 64   using Gosub and
15090 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 52 65 74   they do not Ret
150a0 75 72 6e 2e 20 20 45 6f 66 41 20 61 6e 64 20 45  urn.  EofA and E
150b0 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69  ofB loop.** unti
150c0 6c 20 61 6c 6c 20 64 61 74 61 20 69 73 20 65 78  l all data is ex
150d0 68 61 75 73 74 65 64 20 74 68 65 6e 20 6a 75 6d  hausted then jum
150e0 70 20 74 6f 20 74 68 65 20 22 65 6e 64 22 20 6c  p to the "end" l
150f0 61 62 65 2e 20 20 41 6c 74 42 2c 20 41 65 71 42  abe.  AltB, AeqB
15100 2c 0a 2a 2a 20 61 6e 64 20 41 67 74 42 20 6a 75  ,.** and AgtB ju
15110 6d 70 20 74 6f 20 65 69 74 68 65 72 20 4c 32 20  mp to either L2 
15120 6f 72 20 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66  or to one of Eof
15130 41 20 6f 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69  A or EofB..*/.#i
15140 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15150 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
15160 54 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  T.static int mul
15170 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
15180 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15190 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
151a0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
151b0 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
151c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
151d0 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
151e0 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
151f0 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
15200 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
15210 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
15220 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
15230 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
15240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15250 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
15260 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
15270 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
15280 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
15290 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
152a0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
152b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
152c0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
152d0 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
152e0 6c 65 63 74 44 65 73 74 20 64 65 73 74 41 3b 20  lectDest destA; 
152f0 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69      /* Destinati
15300 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65  on for coroutine
15310 20 41 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65   A */.  SelectDe
15320 73 74 20 64 65 73 74 42 3b 20 20 20 20 20 2f 2a  st destB;     /*
15330 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
15340 20 63 6f 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a   coroutine B */.
15350 20 20 69 6e 74 20 72 65 67 41 64 64 72 41 3b 20    int regAddrA; 
15360 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
15370 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
15380 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
15390 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45  ne */.  int regE
153a0 6f 66 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ofA;          /*
153b0 20 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74   Flag to indicat
153c0 65 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 41 20  e when select-A 
153d0 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
153e0 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20   int regAddrB;  
153f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
15400 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  s register for s
15410 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e  elect-B coroutin
15420 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f  e */.  int regEo
15430 66 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fB;          /* 
15440 46 6c 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65  Flag to indicate
15450 20 77 68 65 6e 20 73 65 6c 65 63 74 2d 42 20 69   when select-B i
15460 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
15470 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 41 3b  int addrSelectA;
15480 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15490 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
154a0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
154b0 69 6e 74 20 61 64 64 72 53 65 6c 65 63 74 42 3b  int addrSelectB;
154c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
154d0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
154e0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
154f0 69 6e 74 20 72 65 67 4f 75 74 41 3b 20 20 20 20  int regOutA;    
15500 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
15510 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68   register for th
15520 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
15530 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
15540 65 67 4f 75 74 42 3b 20 20 20 20 20 20 20 20 20  egOutB;         
15550 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69   /* Address regi
15560 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f 75 74  ster for the out
15570 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  put-B subroutine
15580 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75   */.  int addrOu
15590 74 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tA;         /* A
155a0 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75  ddress of the ou
155b0 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69 6e  tput-A subroutin
155c0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f  e */.  int addrO
155d0 75 74 42 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  utB = 0;     /* 
155e0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6f  Address of the o
155f0 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74 69  utput-B subrouti
15600 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
15610 45 6f 66 41 3b 20 20 20 20 20 20 20 20 20 2f 2a  EofA;         /*
15620 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
15630 73 65 6c 65 63 74 2d 41 2d 65 78 68 61 75 73 74  select-A-exhaust
15640 65 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  ed subroutine */
15650 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b  .  int addrEofB;
15660 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
15670 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
15680 74 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75  t-B-exhausted su
15690 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
156a0 74 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20  t addrAltB;     
156b0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
156c0 66 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75  f the A<B subrou
156d0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
156e0 64 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20  drAeqB;         
156f0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
15700 65 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e  e A==B subroutin
15710 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
15720 67 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  gtB;         /* 
15730 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
15740 3e 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  >B subroutine */
15750 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41  .  int regLimitA
15760 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69  ;        /* Limi
15770 74 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73  t register for s
15780 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74  elect-A */.  int
15790 20 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20   regLimitB;     
157a0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
157b0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
157c0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72  A */.  int regPr
157d0 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ev;          /* 
157e0 41 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73  A range of regis
157f0 74 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65  ters to hold pre
15800 76 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a  vious output */.
15810 20 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74    int savedLimit
15820 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
15830 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69   value of p->iLi
15840 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76  mit */.  int sav
15850 65 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f  edOffset;      /
15860 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
15870 20 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20   p->iOffset */. 
15880 20 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20   int labelCmpr; 
15890 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20         /* Label 
158a0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
158b0 20 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72   the merge algor
158c0 69 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  ithm */.  int la
158d0 62 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20  belEnd;         
158e0 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65  /* Label for the
158f0 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   end of the over
15900 61 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20  all SELECT stmt 
15910 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20  */.  int j1;    
15920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
15930 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  mp instructions 
15940 74 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65  that get retarge
15950 74 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  tted */.  int op
15960 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15970 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c  /* One of TK_ALL
15980 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  , TK_UNION, TK_E
15990 58 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53  XCEPT, TK_INTERS
159a0 45 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ECT */.  KeyInfo
159b0 20 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f   *pKeyDup = 0; /
159c0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66  * Comparison inf
159d0 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70  ormation for dup
159e0 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a  licate removal *
159f0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
15a00 79 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d  yMerge;   /* Com
15a10 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74  parison informat
15a20 69 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20  ion for merging 
15a30 72 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rows */.  sqlite
15a40 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
15a50 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
15a60 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
15a70 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
15a80 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
15a90 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
15aa0 74 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20  t nOrderBy;     
15ab0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15ac0 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52   terms in the OR
15ad0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
15ae0 0a 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65  .  int *aPermute
15af0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70  ;        /* Mapp
15b00 69 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42  ing from ORDER B
15b10 59 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c  Y terms to resul
15b20 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  t set columns */
15b30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15b40 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
15b50 6e 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20  nt iSub1;       
15b60 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
15b70 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72  f left-hand quer
15b80 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  y */.  int iSub2
15b90 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15ba0 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d  EQP id of right-
15bb0 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65  hand query */.#e
15bc0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
15bd0 70 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29  p->pOrderBy!=0 )
15be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
15bf0 44 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61  Dup==0 ); /* "Ma
15c00 6e 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64  naged" code need
15c10 73 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20  s this.  Ticket 
15c20 23 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d  #3382. */.  db =
15c30 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76   pParse->db;.  v
15c40 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
15c50 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
15c60 20 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72   );       /* Alr
15c70 65 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20  eady thrown the 
15c80 65 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c  error if VDBE al
15c90 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  loc failed */.  
15ca0 6c 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74  labelEnd = sqlit
15cb0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
15cc0 76 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20  v);.  labelCmpr 
15cd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
15ce0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f  eLabel(v);...  /
15cf0 2a 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f  * Patch up the O
15d00 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
15d10 20 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70   */.  op = p->op
15d20 3b 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  ;  .  pPrior = p
15d30 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65  ->pPrior;.  asse
15d40 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  rt( pPrior->pOrd
15d50 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72  erBy==0 );.  pOr
15d60 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
15d70 72 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rBy;.  assert( p
15d80 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72  OrderBy );.  nOr
15d90 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
15da0 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46  ->nExpr;..  /* F
15db0 6f 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68  or operators oth
15dc0 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
15dd0 4c 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b  L we have to mak
15de0 65 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a  e sure that.  **
15df0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
15e00 61 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72  ause covers ever
15e10 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65  y term of the re
15e20 73 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20  sult set.  Add. 
15e30 20 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65   ** terms to the
15e40 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
15e50 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   as necessary.. 
15e60 20 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b   */.  if( op!=TK
15e70 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28  _ALL ){.    for(
15e80 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  i=1; db->mallocF
15e90 61 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70  ailed==0 && i<=p
15ea0 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
15eb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
15ec0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
15ed0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
15ee0 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70  for(j=0, pItem=p
15ef0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f  OrderBy->a; j<nO
15f00 72 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74  rderBy; j++, pIt
15f10 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  em++){.        a
15f20 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
15f30 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20  x.iOrderByCol>0 
15f40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
15f50 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
15f60 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
15f70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15f80 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
15f90 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
15fa0 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
15fb0 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
15fc0 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
15fd0 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
15fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
15ff0 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
16000 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
16010 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
16020 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
16030 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
16040 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
16050 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
16060 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
16070 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
16080 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
16090 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
160a0 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  ++].u.x.iOrderBy
160b0 43 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  Col = (u16)i;.  
160c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
160d0 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  /* Compute th
160e0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72  e comparison per
160f0 6d 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79  mutation and key
16100 69 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65  info that is use
16110 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
16120 70 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64  permutation used
16130 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
16140 20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72   the next.  ** r
16150 6f 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f  ow of results co
16160 6d 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41  mes from selectA
16170 20 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c   or selectB.  Al
16180 73 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a  so add explicit.
16190 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20    ** collations 
161a0 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  to the ORDER BY 
161b0 63 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20  clause terms so 
161c0 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75  that when the su
161d0 62 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f  bqueries.  ** to
161e0 20 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74   the right and t
161f0 68 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c  he left are eval
16200 75 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20  uated, they use 
16210 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a  the correct.  **
16220 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f   collation..  */
16230 0a 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71  .  aPermute = sq
16240 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
16250 28 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29  (db, sizeof(int)
16260 2a 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66  *nOrderBy);.  if
16270 28 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20  ( aPermute ){.  
16280 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
16290 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
162a0 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
162b0 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
162c0 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20  <nOrderBy; i++, 
162d0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
162e0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75  assert( pItem->u
162f0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30  .x.iOrderByCol>0
16300 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49  .          && pI
16310 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
16320 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d  yCol<=p->pEList-
16330 3e 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >nExpr );.      
16340 61 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49  aPermute[i] = pI
16350 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
16360 79 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a  yCol - 1;.    }.
16370 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
16380 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
16390 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42 79  loc(db, nOrderBy
163a0 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  , 1);.    if( pK
163b0 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  eyMerge ){.     
163c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
163d0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
163e0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
163f0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  ll;.        Expr
16400 20 2a 70 54 65 72 6d 20 3d 20 70 4f 72 64 65 72   *pTerm = pOrder
16410 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
16420 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
16430 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  m->flags & EP_Co
16440 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  llate ){.       
16450 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
16460 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
16470 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
16480 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16490 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d         pColl = m
164a0 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65  ultiSelectCollSe
164b0 71 28 70 50 61 72 73 65 2c 20 70 2c 20 61 50 65  q(pParse, p, aPe
164c0 72 6d 75 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20  rmute[i]);.     
164d0 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d       if( pColl==
164e0 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  0 ) pColl = db->
164f0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
16500 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61       pOrderBy->a
16510 5b 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20  [i].pExpr =.    
16520 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16530 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
16540 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 54 65  ring(pParse, pTe
16550 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  rm, pColl->zName
16560 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16570 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
16580 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
16590 74 65 61 62 6c 65 28 70 4b 65 79 4d 65 72 67 65  teable(pKeyMerge
165a0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65  ) );.        pKe
165b0 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d  yMerge->aColl[i]
165c0 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20   = pColl;.      
165d0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
165e0 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
165f0 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
16600 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20  Order;.      }. 
16610 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
16620 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b    pKeyMerge = 0;
16630 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74  .  }..  /* Reatt
16640 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ach the ORDER BY
16650 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71   clause to the q
16660 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  uery..  */.  p->
16670 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  pOrderBy = pOrde
16680 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70  rBy;.  pPrior->p
16690 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
166a0 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50 61  3ExprListDup(pPa
166b0 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42  rse->db, pOrderB
166c0 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  y, 0);..  /* All
166d0 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66  ocate a range of
166e0 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73   temporary regis
166f0 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79  ters and the Key
16700 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a  Info needed.  **
16710 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74   for the logic t
16720 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c  hat removes dupl
16730 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77  icate result row
16740 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  s when the.  ** 
16750 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f  operator is UNIO
16760 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e  N, EXCEPT, or IN
16770 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74  TERSECT (but not
16780 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a   UNION ALL)..  *
16790 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
167a0 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65  LL ){.    regPre
167b0 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
167c0 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
167d0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
167e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f  ;.    assert( nO
167f0 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c  rderBy>=nExpr ||
16800 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
16810 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76  d );.    regPrev
16820 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
16830 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  1;.    pParse->n
16840 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a  Mem += nExpr+1;.
16850 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16860 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
16870 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29  ger, 0, regPrev)
16880 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20  ;.    pKeyDup = 
16890 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
168a0 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31  loc(db, nExpr, 1
168b0 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44  );.    if( pKeyD
168c0 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  up ){.      asse
168d0 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  rt( sqlite3KeyIn
168e0 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b  foIsWriteable(pK
168f0 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20  eyDup) );.      
16900 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
16910 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16920 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69  pKeyDup->aColl[i
16930 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43  ] = multiSelectC
16940 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
16950 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  , i);.        pK
16960 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65  eyDup->aSortOrde
16970 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
16980 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20  }.    }.  }. .  
16990 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65 20  /* Separate the 
169a0 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69 67  left and the rig
169b0 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e  ht query from on
169c0 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20  e another.  */. 
169d0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
169e0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
169f0 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
16a00 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  rse, p, p->pOrde
16a10 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
16a20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 50 72   if( pPrior->pPr
16a30 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ior==0 ){.    sq
16a40 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
16a50 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
16a60 20 70 50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d   pPrior, pPrior-
16a70 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
16a80 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  R");.  }..  /* C
16a90 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 6d 69 74  ompute the limit
16aa0 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20   registers */.  
16ab0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
16ac0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
16ad0 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66   labelEnd);.  if
16ae0 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f  ( p->iLimit && o
16af0 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20  p==TK_ALL ){.   
16b00 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70   regLimitA = ++p
16b10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
16b20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70   regLimitB = ++p
16b30 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
16b40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16b50 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p2(v, OP_Copy, p
16b60 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69  ->iOffset ? p->i
16b70 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c  Offset+1 : p->iL
16b80 69 6d 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20  imit,.          
16b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ba0 20 20 20 20 20 20 20 20 72 65 67 4c 69 6d 69 74          regLimit
16bb0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
16bc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16bd0 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c  Copy, regLimitA,
16be0 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d   regLimitB);.  }
16bf0 65 6c 73 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d  else{.    regLim
16c00 69 74 41 20 3d 20 72 65 67 4c 69 6d 69 74 42 20  itA = regLimitB 
16c10 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
16c20 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
16c30 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70   p->pLimit);.  p
16c40 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
16c50 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
16c60 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74  e(db, p->pOffset
16c70 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20  );.  p->pOffset 
16c80 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64 64 72 41  = 0;..  regAddrA
16c90 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
16ca0 6d 3b 0a 20 20 72 65 67 45 6f 66 41 20 3d 20 2b  m;.  regEofA = +
16cb0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
16cc0 20 72 65 67 41 64 64 72 42 20 3d 20 2b 2b 70 50   regAddrB = ++pP
16cd0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
16ce0 67 45 6f 66 42 20 3d 20 2b 2b 70 50 61 72 73 65  gEofB = ++pParse
16cf0 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
16d00 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
16d10 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
16d20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
16d30 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
16d40 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
16d50 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
16d60 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
16d70 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
16d80 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
16d90 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
16da0 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70  B);..  /* Jump p
16db0 61 73 74 20 74 68 65 20 76 61 72 69 6f 75 73 20  ast the various 
16dc0 73 75 62 72 6f 75 74 69 6e 65 73 20 61 6e 64 20  subroutines and 
16dd0 63 6f 72 6f 75 74 69 6e 65 73 20 74 6f 20 74 68  coroutines to th
16de0 65 20 6d 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67  e main.  ** merg
16df0 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31  e loop.  */.  j1
16e00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
16e10 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29  dOp0(v, OP_Goto)
16e20 3b 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20  ;.  addrSelectA 
16e30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
16e40 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20  rentAddr(v);... 
16e50 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 63   /* Generate a c
16e60 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61 6c  oroutine to eval
16e70 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54 20  uate the SELECT 
16e80 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65  statement to the
16e90 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68  .  ** left of th
16ea0 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61  e compound opera
16eb0 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73 65  tor - the "A" se
16ec0 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
16ed0 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
16ee0 20 22 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e   "Begin coroutin
16ef0 65 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43  e for left SELEC
16f00 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  T"));.  pPrior->
16f10 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
16f20 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  tA;.  explainSet
16f30 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
16f40 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
16f50 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
16f60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
16f70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a  Prior, &destA);.
16f80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16f90 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
16fa0 72 2c 20 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a  r, 1, regEofA);.
16fb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16fc0 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
16fd0 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20 56 64   regAddrA);.  Vd
16fe0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
16ff0 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65  , "End coroutine
17000 20 66 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54   for left SELECT
17010 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  "));..  /* Gener
17020 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
17030 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
17040 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
17050 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
17060 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
17070 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
17080 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
17090 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
170a0 28 76 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43  (v);.  VdbeNoopC
170b0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
170c0 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
170d0 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
170e0 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20 3d 20  .  savedLimit = 
170f0 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76  p->iLimit;.  sav
17100 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f  edOffset = p->iO
17110 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d  ffset;.  p->iLim
17120 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a  it = regLimitB;.
17130 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
17140 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53 65 74  ;  .  explainSet
17150 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
17160 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
17170 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ctId);.  sqlite3
17180 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
17190 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e  , &destB);.  p->
171a0 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64 4c 69  iLimit = savedLi
171b0 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  mit;.  p->iOffse
171c0 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65 74 3b  t = savedOffset;
171d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
171e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
171f0 65 72 2c 20 31 2c 20 72 65 67 45 6f 66 42 29 3b  er, 1, regEofB);
17200 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17210 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
17220 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20 56  , regAddrB);.  V
17230 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
17240 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e  v, "End coroutin
17250 65 20 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45  e for right SELE
17260 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  CT"));..  /* Gen
17270 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
17280 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
17290 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
172a0 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65  of the A.  ** se
172b0 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
172c0 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
172d0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
172e0 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  ct..  */.  VdbeN
172f0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
17300 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
17310 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f  or A"));.  addrO
17320 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75  utA = generateOu
17330 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70  tputSubroutine(p
17340 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
17350 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74          p, &dest
17360 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74  A, pDest, regOut
17370 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  A,.             
17380 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65      regPrev, pKe
17390 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  yDup, labelEnd);
173a0 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  .  .  /* Generat
173b0 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
173c0 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20  hat outputs the 
173d0 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74  current row of t
173e0 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74  he B.  ** select
173f0 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74   as the next out
17400 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63  put row of the c
17410 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a  ompound select..
17420 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
17430 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_ALL || op==TK_
17440 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62  UNION ){.    Vdb
17450 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
17460 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
17470 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61   for B"));.    a
17480 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61  ddrOutB = genera
17490 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
174a0 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
174b0 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
174c0 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65  destB, pDest, re
174d0 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20  gOutB,.         
174e0 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
174f0 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
17500 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nd);.  }.  sqlit
17510 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
17520 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47  KeyDup);..  /* G
17530 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
17540 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e  tine to run when
17550 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f   the results fro
17560 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20  m select A.  ** 
17570 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e  are exhausted an
17580 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73  d only data in s
17590 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e  elect B remains.
175a0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
175b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
175c0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -A subroutine"))
175d0 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45  ;.  if( op==TK_E
175e0 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
175f0 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20  INTERSECT ){.   
17600 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c 69   addrEofA = sqli
17610 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17620 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
17630 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b  elEnd);.  }else{
17640 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20    .    addrEofA 
17650 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
17660 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op2(v, OP_If, re
17670 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29  gEofB, labelEnd)
17680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17690 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
176a0 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64  sub, regOutB, ad
176b0 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71 6c  drOutB);.    sql
176c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
176d0 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
176e0 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69 74  ddrB);.    sqlit
176f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17700 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
17710 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53  EofA);.    p->nS
17720 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69  electRow += pPri
17730 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a  or->nSelectRow;.
17740 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
17750 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
17760 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65 20  to run when the 
17770 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c  results from sel
17780 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20 65  ect B.  ** are e
17790 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c  xhausted and onl
177a0 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63 74  y data in select
177b0 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f   A remains..  */
177c0 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
177d0 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61  TERSECT ){.    a
177e0 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45 6f  ddrEofB = addrEo
177f0 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  fA;.    if( p->n
17800 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72 69  SelectRow > pPri
17810 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
17820 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
17830 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
17840 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  Row;.  }else{  .
17850 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d      VdbeNoopComm
17860 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20 73  ent((v, "eof-B s
17870 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
17880 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71 6c    addrEofB = sql
17890 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
178a0 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41  , OP_If, regEofA
178b0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
178c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
178d0 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
178e0 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
178f0 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  A);.    sqlite3V
17900 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17910 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
17920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17930 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
17940 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29  to, 0, addrEofB)
17950 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65  ;.  }..  /* Gene
17960 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e  rate code to han
17970 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66 20  dle the case of 
17980 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e  A<B.  */.  VdbeN
17990 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
179a0 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-lt-B subroutin
179b0 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42  e"));.  addrAltB
179c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
179d0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
179e0 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f  , regOutA, addrO
179f0 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  utA);.  sqlite3V
17a00 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17a10 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
17a20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17a30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
17a40 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66  regEofA, addrEof
17a50 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
17a60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
17a70 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
17a80 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
17a90 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
17aa0 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d 3d   the case of A==
17ab0 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  B.  */.  if( op=
17ac0 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61  =TK_ALL ){.    a
17ad0 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c  ddrAeqB = addrAl
17ae0 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  tB;.  }else if( 
17af0 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
17b00 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71 42   ){.    addrAeqB
17b10 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20 20   = addrAltB;.   
17b20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d   addrAltB++;.  }
17b30 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f  else{.    VdbeNo
17b40 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41  opComment((v, "A
17b50 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e 65  -eq-B subroutine
17b60 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65 71  "));.    addrAeq
17b70 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B =.    sqlite3V
17b80 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17b90 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29  Yield, regAddrA)
17ba0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17bb0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
17bc0 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45  , regEofA, addrE
17bd0 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ofA);.    sqlite
17be0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17bf0 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
17c00 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Cmpr);.  }..  /*
17c10 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17c20 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73  o handle the cas
17c30 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20  e of A>B.  */.  
17c40 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
17c50 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62 72  (v, "A-gt-B subr
17c60 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64  outine"));.  add
17c70 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33 56  rAgtB = sqlite3V
17c80 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
17c90 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
17ca0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
17cb0 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ION ){.    sqlit
17cc0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
17cd0 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74  OP_Gosub, regOut
17ce0 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20  B, addrOutB);.  
17cf0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
17d00 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
17d10 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20 20  d, regAddrB);.  
17d20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17d30 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
17d40 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
17d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17d60 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
17d70 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
17d80 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72    /* This code r
17d90 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74  uns once to init
17da0 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e  ialize everythin
17db0 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  g..  */.  sqlite
17dc0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
17dd0 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   j1);.  sqlite3V
17de0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17df0 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
17e00 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofA);.  sqlite3V
17e10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17e20 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 45  Integer, 0, regE
17e30 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ofB);.  sqlite3V
17e40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17e50 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41 2c  Gosub, regAddrA,
17e60 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a 20   addrSelectA);. 
17e70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17e80 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
17e90 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53 65  regAddrB, addrSe
17ea0 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74 65  lectB);.  sqlite
17eb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
17ec0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
17ed0 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
17ee0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17ef0 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c   OP_If, regEofB,
17f00 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f   addrEofB);..  /
17f10 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  * Implement the 
17f20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a  main merge loop.
17f30 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
17f40 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
17f50 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
17f60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17f70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74  4(v, OP_Permutat
17f80 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63  ion, 0, 0, 0, (c
17f90 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50  har*)aPermute, P
17fa0 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73  4_INTARRAY);.  s
17fb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
17fc0 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
17fd0 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73  destA.iSdst, des
17fe0 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72  tB.iSdst, nOrder
17ff0 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  By,.            
18000 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
18010 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50  ar*)pKeyMerge, P
18020 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
18030 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
18040 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d  5(v, OPFLAG_PERM
18050 55 54 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  UTE);.  sqlite3V
18060 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
18070 4a 75 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20  Jump, addrAltB, 
18080 61 64 64 72 41 65 71 42 2c 20 61 64 64 72 41 67  addrAeqB, addrAg
18090 74 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  tB);..  /* Jump 
180a0 74 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e  to the this poin
180b0 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65  t in order to te
180c0 72 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72  rminate the quer
180d0 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  y..  */.  sqlite
180e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
180f0 6c 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  l(v, labelEnd);.
18100 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75  .  /* Set the nu
18110 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63  mber of output c
18120 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66  olumns.  */.  if
18130 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
18140 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
18150 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
18160 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77   = pPrior;.    w
18170 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50  hile( pFirst->pP
18180 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20  rior ) pFirst = 
18190 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a  pFirst->pPrior;.
181a0 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
181b0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
181c0 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73  0, pFirst->pELis
181d0 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  t);.  }..  /* Re
181e0 61 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d  assembly the com
181f0 70 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74  pound query so t
18200 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66  hat it will be f
18210 72 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20  reed correctly. 
18220 20 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69   ** by the calli
18230 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ng function */. 
18240 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
18250 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
18260 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  ectDelete(db, p-
18270 3e 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20  >pPrior);.  }.  
18280 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
18290 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a  or;..  /*** TBD:
182a0 20 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74    Insert subrout
182b0 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f  ine calls to clo
182c0 73 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e  se cursors on in
182d0 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20  complete.  **** 
182e0 73 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f  subqueries ****/
182f0 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  .  explainCompos
18300 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f  ite(pParse, p->o
18310 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c  p, iSub1, iSub2,
18320 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   0);.  return SQ
18330 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
18340 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
18350 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
18360 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65  UERY) || !define
18370 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
18380 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44  EW)./* Forward D
18390 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  eclarations */.s
183a0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
183b0 45 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33  ExprList(sqlite3
183c0 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e  *, ExprList*, in
183d0 74 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73  t, ExprList*);.s
183e0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
183f0 53 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c  Select(sqlite3*,
18400 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20   Select *, int, 
18410 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a  ExprList *);../*
18420 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68  .** Scan through
18430 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
18440 70 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20  pExpr.  Replace 
18450 65 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20  every reference 
18460 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69  to.** a column i
18470 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69  n table number i
18480 54 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70  Table with a cop
18490 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e  y of the iColumn
184a0 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  -th.** entry in 
184b0 70 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65  pEList.  (But le
184c0 61 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ave references t
184d0 6f 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75  o the ROWID colu
184e0 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  mn .** unchanged
184f0 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .).**.** This ro
18500 75 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66  utine is part of
18510 20 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20   the flattening 
18520 70 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75  procedure.  A su
18530 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20  bquery.** whose 
18540 72 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65  result set is de
18550 66 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20  fined by pEList 
18560 61 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79  appears as entry
18570 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20   in the.** FROM 
18580 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
18590 43 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65  CT such that the
185a0 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73   VDBE cursor ass
185b0 69 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a  igned to that.**
185c0 20 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74   FORM clause ent
185d0 72 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54  ry is iTable.  T
185e0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
185f0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a   the necessary .
18600 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45  ** changes to pE
18610 78 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72  xpr so that it r
18620 65 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74  efers directly t
18630 6f 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62  o the source tab
18640 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62  le.** of the sub
18650 71 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65  query rather the
18660 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
18670 68 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a  he subquery..*/.
18680 73 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62  static Expr *sub
18690 73 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65  stExpr(.  sqlite
186a0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a  3 *db,        /*
186b0 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65   Report malloc e
186c0 72 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f  rrors to this co
186d0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  nnection */.  Ex
186e0 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
186f0 20 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69    /* Expr in whi
18700 63 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20  ch substitution 
18710 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20  occurs */.  int 
18720 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
18730 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73  /* Table to be s
18740 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20  ubstituted */.  
18750 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
18760 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
18770 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  e expressions */
18780 0a 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  .){.  if( pExpr=
18790 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
187a0 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
187b0 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78  TK_COLUMN && pEx
187c0 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  pr->iTable==iTab
187d0 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  le ){.    if( pE
187e0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
187f0 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  {.      pExpr->o
18800 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
18810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78   }else{.      Ex
18820 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20  pr *pNew;.      
18830 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
18840 30 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c  0 && pExpr->iCol
18850 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  umn<pEList->nExp
18860 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
18870 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  t( pExpr->pLeft=
18880 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
18890 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght==0 );.      
188a0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
188b0 70 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  prDup(db, pEList
188c0 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ->a[pExpr->iColu
188d0 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20  mn].pExpr, 0);. 
188e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
188f0 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
18900 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d  );.      pExpr =
18910 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d   pNew;.    }.  }
18920 65 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d  else{.    pExpr-
18930 3e 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78  >pLeft = substEx
18940 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c  pr(db, pExpr->pL
18950 65 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  eft, iTable, pEL
18960 69 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  ist);.    pExpr-
18970 3e 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45  >pRight = substE
18980 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  xpr(db, pExpr->p
18990 52 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70  Right, iTable, p
189a0 45 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20  EList);.    if( 
189b0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
189c0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
189d0 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75  ect) ){.      su
189e0 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45  bstSelect(db, pE
189f0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20  xpr->x.pSelect, 
18a00 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
18a10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18a20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28    substExprList(
18a30 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  db, pExpr->x.pLi
18a40 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  st, iTable, pELi
18a50 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  st);.    }.  }. 
18a60 20 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d   return pExpr;.}
18a70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62  .static void sub
18a80 73 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71  stExprList(.  sq
18a90 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
18aa0 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c     /* Report mal
18ab0 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20  loc errors here 
18ac0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
18ad0 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73  List,     /* Lis
18ae0 74 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e  t to scan and in
18af0 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73   which to make s
18b00 75 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20  ubstitutes */.  
18b10 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
18b20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
18b30 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20   be substituted 
18b40 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
18b50 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62  EList     /* Sub
18b60 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a  stitute values *
18b70 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
18b80 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
18b90 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
18ba0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
18bb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73  ; i++){.    pLis
18bc0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20  t->a[i].pExpr = 
18bd0 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c  substExpr(db, pL
18be0 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
18bf0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
18c00 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
18c10 6f 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28  oid substSelect(
18c20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
18c30 20 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72          /* Repor
18c40 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  t malloc errors 
18c50 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  here */.  Select
18c60 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
18c70 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
18c80 6e 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d  nt in which to m
18c90 61 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ake substitution
18ca0 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  s */.  int iTabl
18cb0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
18cc0 61 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61  able to be repla
18cd0 63 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ced */.  ExprLis
18ce0 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a  t *pEList     /*
18cf0 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75   Substitute valu
18d00 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  es */.){.  SrcLi
18d10 73 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75  st *pSrc;.  stru
18d20 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
18d30 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
18d40 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
18d50 72 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  rn;.  substExprL
18d60 69 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73  ist(db, p->pELis
18d70 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
18d80 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
18d90 69 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75  ist(db, p->pGrou
18da0 70 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  pBy, iTable, pEL
18db0 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70  ist);.  substExp
18dc0 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72  rList(db, p->pOr
18dd0 64 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70  derBy, iTable, p
18de0 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61  EList);.  p->pHa
18df0 76 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72  ving = substExpr
18e00 28 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c  (db, p->pHaving,
18e10 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
18e20 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20  ;.  p->pWhere = 
18e30 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d  substExpr(db, p-
18e40 3e 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c  >pWhere, iTable,
18e50 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
18e60 74 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70  tSelect(db, p->p
18e70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70  Prior, iTable, p
18e80 45 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d  EList);.  pSrc =
18e90 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
18ea0 72 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20  rt( pSrc );  /* 
18eb0 45 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54  Even for (SELECT
18ec0 20 31 29 20 77 65 20 68 61 76 65 3a 20 70 53 72   1) we have: pSr
18ed0 63 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e  c!=0 but pSrc->n
18ee0 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20  Src==0 */.  if( 
18ef0 41 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a  ALWAYS(pSrc) ){.
18f00 20 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e      for(i=pSrc->
18f10 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63  nSrc, pItem=pSrc
18f20 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
18f30 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73  Item++){.      s
18f40 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
18f50 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69  Item->pSelect, i
18f60 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
18f70 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
18f80 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
18f90 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
18fa0 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
18fb0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
18fc0 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  W) */..#if !defi
18fd0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
18fe0 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
18ff0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
19000 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68  T_VIEW)./*.** Th
19010 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
19020 70 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73  pts to flatten s
19030 75 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70  ubqueries as a p
19040 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d  erformance optim
19050 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ization..** This
19060 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
19070 20 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63   1 if it makes c
19080 68 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20  hanges and 0 if 
19090 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63  no flattening oc
190a0 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75  curs..**.** To u
190b0 6e 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f  nderstand the co
190c0 6e 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e  ncept of flatten
190d0 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  ing, consider th
190e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71  e following.** q
190f0 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
19100 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53  SELECT a FROM (S
19110 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46  ELECT x+y AS a F
19120 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31  ROM t1 WHERE z<1
19130 30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a  00) WHERE a>5.**
19140 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
19150 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74  way of implement
19160 69 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69  ing this query i
19170 73 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  s to execute the
19180 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72  .** subquery fir
19190 73 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  st and store the
191a0 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65   results in a te
191b0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74  mporary table, t
191c0 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f  hen.** run the o
191d0 75 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68  uter query on th
191e0 61 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  at temporary tab
191f0 6c 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72  le.  This requir
19200 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73  es two.** passes
19210 20 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20   over the data. 
19220 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65   Furthermore, be
19230 63 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72  cause the tempor
19240 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73  ary table.** has
19250 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65   no indices, the
19260 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e   WHERE clause on
19270 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19280 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70   cannot be.** op
19290 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  timized..**.** T
192a0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65  his routine atte
192b0 6d 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20  mpts to rewrite 
192c0 71 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20  queries such as 
192d0 74 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a  the above into.*
192e0 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20  * a single flat 
192f0 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69  select, like thi
19300 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  s:.**.**     SEL
19310 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
19320 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
19330 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54   AND a>5.**.** T
19340 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  he code generate
19350 64 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69  d for this simpi
19360 66 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74  fication gives t
19370 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a  he same result.*
19380 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74  * but only has t
19390 6f 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20  o scan the data 
193a0 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75  once.  And becau
193b0 73 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74  se indices might
193c0 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68   .** exist on th
193d0 65 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f  e table t1, a co
193e0 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74  mplete scan of t
193f0 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65  he data might be
19400 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a  .** avoided..**.
19410 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73  ** Flattening is
19420 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20   only attempted 
19430 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
19440 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
19450 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54  :.**.**   (1)  T
19460 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
19470 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
19480 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20  do not both use 
19490 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
194a0 2a 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62  *   (2)  The sub
194b0 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
194c0 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
194d0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
194e0 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
194f0 2a 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62  *   (3)  The sub
19500 71 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65  query is not the
19510 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
19520 66 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a  f a left outer j
19530 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f  oin.**        (O
19540 72 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74  riginally ticket
19550 20 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68   #306.  Strength
19560 65 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  ened by ticket #
19570 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34  3300).**.**   (4
19580 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
19590 69 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e  is not DISTINCT.
195a0 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74  .**.**  (**)  At
195b0 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72   one point restr
195c0 69 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20  ictions (4) and 
195d0 28 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75  (5) defined a su
195e0 62 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54  bset of DISTINCT
195f0 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71  .**        sub-q
19600 75 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65  ueries that were
19610 20 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74   excluded from t
19620 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
19630 2e 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a  . Restriction .*
19640 2a 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73  *        (4) has
19650 20 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61   since been expa
19660 6e 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20  nded to exclude 
19670 61 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62  all DISTINCT sub
19680 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  queries..**.**  
19690 20 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65   (6)  The subque
196a0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
196b0 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
196c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
196d0 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44   not.**        D
196e0 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20  ISTINCT..**.**  
196f0 20 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65   (7)  The subque
19700 72 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c  ry has a FROM cl
19710 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f  ause.  TODO:  Fo
19720 72 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74  r subqueries wit
19730 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41  hout.**        A
19740 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f   FROM clause, co
19750 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20  nsider adding a 
19760 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20  FROM close with 
19770 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20  the special.**  
19780 20 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69        table sqli
19790 74 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e  te_once that con
197a0 73 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c  sists of a singl
197b0 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67  e row containing
197c0 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e   a.**        sin
197d0 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  gle NULL..**.** 
197e0 20 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75    (8)  The subqu
197f0 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
19800 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75   LIMIT or the ou
19810 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
19820 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
19830 20 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65   (9)  The subque
19840 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
19850 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
19860 65 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  er query does no
19870 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
19880 61 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a  aggregates..**.*
19890 2a 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62  *  (10)  The sub
198a0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
198b0 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
198c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
198d0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
198e0 20 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a      use LIMIT..*
198f0 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20  *.**  (11)  The 
19900 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
19910 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
19920 6e 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52  not both have OR
19930 44 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a  DER BY clauses..
19940 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74  **.**  (**)  Not
19950 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53   implemented.  S
19960 75 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73  ubsumed into res
19970 74 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57  triction (3).  W
19980 61 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a  as previously.**
19990 20 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61          a separa
199a0 74 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64  te restriction d
199b0 65 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63  eriving from tic
199c0 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20  ket #350..**.** 
199d0 20 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75   (13)  The subqu
199e0 65 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75  ery and outer qu
199f0 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
19a00 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a  use LIMIT..**.**
19a10 20 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71    (14)  The subq
19a20 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
19a30 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20  e OFFSET..**.** 
19a40 20 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72   (15)  The outer
19a50 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61   query is not pa
19a60 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
19a70 20 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a   select or the.*
19a80 2a 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72  *        subquer
19a90 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
19aa0 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a  a LIMIT clause..
19ab0 2a 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74  **        (See t
19ac0 69 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20  icket #2339 and 
19ad0 74 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64  ticket [02a8e81d
19ae0 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36  44])..**.**  (16
19af0 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65  )  The outer que
19b00 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
19b10 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75  regate or the su
19b20 62 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20  bquery does.**  
19b30 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69        not contai
19b40 6e 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69  n ORDER BY.  (Ti
19b50 63 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69  cket #2942)  Thi
19b60 73 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61  s used to not ma
19b70 74 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75  tter.**        u
19b80 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63  ntil we introduc
19b90 65 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e  ed the group_con
19ba0 63 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20  cat() function. 
19bb0 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54   .**.**  (17)  T
19bc0 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  he sub-query is 
19bd0 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73  not a compound s
19be0 65 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20  elect, or it is 
19bf0 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20  a UNION ALL .** 
19c00 20 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20         compound 
19c10 63 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65  clause made up e
19c20 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61  ntirely of non-a
19c30 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
19c40 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20  , and .**       
19c50 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
19c60 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  y:.**.**        
19c70 20 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c    * is not itsel
19c80 66 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  f part of a comp
19c90 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20  ound select,.** 
19ca0 20 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f           * is no
19cb0 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f  t an aggregate o
19cc0 72 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79  r DISTINCT query
19cd0 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20  , and.**        
19ce0 20 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69    * is not a joi
19cf0 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54  n.**.**        T
19d00 68 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75  he parent and su
19d10 62 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74  b-query may cont
19d20 61 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65  ain WHERE clause
19d30 73 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a  s. Subject to.**
19d40 20 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31          rules (1
19d50 31 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34  1), (13) and (14
19d60 29 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f  ), they may also
19d70 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42   contain ORDER B
19d80 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d  Y,.**        LIM
19d90 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
19da0 61 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71  auses.  The subq
19db0 75 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20  uery cannot use 
19dc0 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
19dd0 20 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20         operator 
19de0 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e  other than UNION
19df0 20 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c   ALL because all
19e00 20 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f   the other compo
19e10 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70  und.**        op
19e20 65 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20  erators have an 
19e30 69 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54  implied DISTINCT
19e40 20 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c   which is disall
19e50 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20  owed by.**      
19e60 20 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34    restriction (4
19e70 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  )..**.**        
19e80 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f  Also, each compo
19e90 6e 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d  nent of the sub-
19ea0 71 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72  query must retur
19eb0 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  n the same numbe
19ec0 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72  r.**        of r
19ed0 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54  esult columns. T
19ee0 68 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20  his is actually 
19ef0 61 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f  a requirement fo
19f00 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a  r any compound.*
19f10 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  *        SELECT 
19f20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61  statement, but a
19f30 6c 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  ll the code here
19f40 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75   does is make su
19f50 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20  re that no.**   
19f60 20 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67       such (illeg
19f70 61 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73  al) sub-query is
19f80 20 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20   flattened. The 
19f90 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65  caller will dete
19fa0 63 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  ct the.**       
19fb0 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e   syntax error an
19fc0 64 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69  d return a detai
19fd0 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a  led message..**.
19fe0 2a 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65  **  (18)  If the
19ff0 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
1a000 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
1a010 20 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20   then all terms 
1a020 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  of the.**       
1a030 20 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65   ORDER by clause
1a040 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d   of the parent m
1a050 75 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65  ust be simple re
1a060 66 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20  ferences to .** 
1a070 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f         columns o
1a080 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e  f the sub-query.
1a090 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68  .**.**  (19)  Th
1a0a0 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
1a0b0 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
1a0c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1a0d0 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20   does not.**    
1a0e0 20 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45      have a WHERE
1a0f0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20   clause..**.**  
1a100 28 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62  (20)  If the sub
1a110 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70  -query is a comp
1a120 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65  ound select, the
1a130 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73  n it must not us
1a140 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f  e.**        an O
1a150 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
1a160 20 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20   Ticket #3773.  
1a170 57 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74  We could relax t
1a180 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  his constraint.*
1a190 2a 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61  *        somewha
1a1a0 74 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74  t by saying that
1a1b0 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68   the terms of th
1a1c0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1a1d0 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20  e must.**       
1a1e0 20 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64   appear as unmod
1a1f0 69 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c  ified result col
1a200 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65  umns in the oute
1a210 72 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65  r query.  But we
1a220 0a 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20  .**        have 
1a230 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  other optimizati
1a240 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64  ons in mind to d
1a250 65 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61  eal with that ca
1a260 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20  se..**.**  (21) 
1a270 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1a280 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1a290 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1a2a0 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20  ery is not.**   
1a2b0 20 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20       DISTINCT.  
1a2c0 28 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32  (See ticket [752
1a2d0 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a  e1646fc])..**.**
1a2e0 20 20 28 32 32 29 20 20 54 68 65 20 73 75 62 71    (22)  The subq
1a2f0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65  uery is not a re
1a300 63 75 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a  cursive CTE..**.
1a310 2a 2a 20 20 28 32 33 29 20 20 54 68 65 20 70 61  **  (23)  The pa
1a320 72 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65  rent is not a re
1a330 63 75 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20  cursive CTE, or 
1a340 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1a350 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20   not a.**       
1a360 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
1a370 20 54 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   This restrictio
1a380 6e 20 69 73 20 62 65 63 61 75 73 65 20 74 72 61  n is because tra
1a390 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a  nsforming the.**
1a3a0 20 20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74          parent t
1a3b0 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  o a compound que
1a3c0 72 79 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20  ry confuses the 
1a3d0 63 6f 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65  code that handle
1a3e0 73 0a 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75  s.**        recu
1a3f0 72 73 69 76 65 20 71 75 65 72 69 65 73 20 69 6e  rsive queries in
1a400 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a   multiSelect()..
1a410 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  **.**.** In this
1a420 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70   routine, the "p
1a430 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
1a440 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1a450 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20  outer query..** 
1a460 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
1a470 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d  p->pSrc->a[iFrom
1a480 5d 2e 20 20 69 73 41 67 67 20 69 73 20 74 72 75  ].  isAgg is tru
1a490 65 20 69 66 20 74 68 65 20 6f 75 74 65 72 20 71  e if the outer q
1a4a0 75 65 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67  uery.** uses agg
1a4b0 72 65 67 61 74 65 73 20 61 6e 64 20 73 75 62 71  regates and subq
1a4c0 75 65 72 79 49 73 41 67 67 20 69 73 20 74 72 75  ueryIsAgg is tru
1a4d0 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
1a4e0 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
1a4f0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74  s..**.** If flat
1a500 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74  tening is not at
1a510 74 65 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f  tempted, this ro
1a520 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1a530 20 61 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a   and returns 0..
1a540 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67  ** If flattening
1a550 20 69 73 20 61 74 74 65 6d 70 74 65 64 20 74 68   is attempted th
1a560 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1a570 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ns 1..**.** All 
1a580 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1a590 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20  n analysis must 
1a5a0 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68  occur on both th
1a5b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e  e outer query an
1a5c0 64 0a 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72  d.** the subquer
1a5d0 79 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f  y before this ro
1a5e0 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73  utine runs..*/.s
1a5f0 74 61 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65  tatic int flatte
1a600 6e 53 75 62 71 75 65 72 79 28 0a 20 20 50 61 72  nSubquery(.  Par
1a610 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1a620 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
1a630 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
1a640 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f   *p,           /
1a650 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20  * The parent or 
1a660 6f 75 74 65 72 20 53 45 4c 45 43 54 20 73 74 61  outer SELECT sta
1a670 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  tement */.  int 
1a680 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  iFrom,          
1a690 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e   /* Index in p->
1a6a0 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65  pSrc->a[] of the
1a6b0 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20   inner subquery 
1a6c0 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20  */.  int isAgg, 
1a6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1a6e0 65 20 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43  e if outer SELEC
1a6f0 54 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  T uses aggregate
1a700 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20   functions */.  
1a710 69 6e 74 20 73 75 62 71 75 65 72 79 49 73 41 67  int subqueryIsAg
1a720 67 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  g    /* True if 
1a730 74 68 65 20 73 75 62 71 75 65 72 79 20 75 73 65  the subquery use
1a740 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
1a750 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  tions */.){.  co
1a760 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
1a770 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50  AuthContext = pP
1a780 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1a790 78 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50  xt;.  Select *pP
1a7a0 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20  arent;.  Select 
1a7b0 2a 70 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20  *pSub;       /* 
1a7c0 54 68 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20  The inner query 
1a7d0 6f 72 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f  or "subquery" */
1a7e0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31  .  Select *pSub1
1a7f0 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ;      /* Pointe
1a800 72 20 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f  r to the rightmo
1a810 73 74 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62  st select in sub
1a820 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c  -query */.  SrcL
1a830 69 73 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20  ist *pSrc;      
1a840 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
1a850 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  se of the outer 
1a860 71 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69  query */.  SrcLi
1a870 73 74 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f  st *pSubSrc;   /
1a880 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
1a890 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  e of the subquer
1a8a0 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
1a8b0 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68  *pList;    /* Th
1a8c0 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
1a8d0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1a8e0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
1a8f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45  ;        /* VDBE
1a900 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
1a910 66 20 74 68 65 20 70 53 75 62 20 72 65 73 75 6c  f the pSub resul
1a920 74 20 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65  t set temp table
1a930 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1a940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1a950 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45  p counter */.  E
1a960 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20  xpr *pWhere;    
1a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a980 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1a990 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1a9a0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1a9b0 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65  ubitem;   /* The
1a9c0 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
1a9d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1a9e0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43  rse->db;..  /* C
1a9f0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66  heck to see if f
1aa00 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72  lattening is per
1aa10 6d 69 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20  mitted.  Return 
1aa20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20  0 if not..  */. 
1aa30 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
1aa40 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
1aa50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55  rior==0 );  /* U
1aa60 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e  nable to flatten
1aa70 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65   compound querie
1aa80 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d  s */.  if( Optim
1aa90 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1aaa0 64 62 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79  db, SQLITE_Query
1aab0 46 6c 61 74 74 65 6e 65 72 29 20 29 20 72 65 74  Flattener) ) ret
1aac0 75 72 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20  urn 0;.  pSrc = 
1aad0 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
1aae0 74 28 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d  t( pSrc && iFrom
1aaf0 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72  >=0 && iFrom<pSr
1ab00 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75  c->nSrc );.  pSu
1ab10 62 69 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  bitem = &pSrc->a
1ab20 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65  [iFrom];.  iPare
1ab30 6e 74 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69  nt = pSubitem->i
1ab40 43 75 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d  Cursor;.  pSub =
1ab50 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1ab60 63 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ct;.  assert( pS
1ab70 75 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  ub!=0 );.  if( i
1ab80 73 41 67 67 20 26 26 20 73 75 62 71 75 65 72 79  sAgg && subquery
1ab90 49 73 41 67 67 20 29 20 72 65 74 75 72 6e 20 30  IsAgg ) return 0
1aba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1abb0 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1abc0 20 28 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73   (1)  */.  if( s
1abd0 75 62 71 75 65 72 79 49 73 41 67 67 20 26 26 20  ubqueryIsAgg && 
1abe0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72  pSrc->nSrc>1 ) r
1abf0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1ac00 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1ac10 20 28 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53   (2)  */.  pSubS
1ac20 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b  rc = pSub->pSrc;
1ac30 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62 53  .  assert( pSubS
1ac40 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72  rc );.  /* Prior
1ac50 20 74 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e   to version 3.1.
1ac60 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  2, when LIMIT an
1ac70 64 20 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20  d OFFSET had to 
1ac80 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61  be simple consta
1ac90 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72  nts,.  ** not ar
1aca0 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 73  bitrary expresss
1acb0 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64  ions, we allowed
1acc0 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20   some combining 
1acd0 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  of LIMIT and OFF
1ace0 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65  SET.  ** because
1acf0 20 74 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63   they could be c
1ad00 6f 6d 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69  omputed at compi
1ad10 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68  le-time.  But wh
1ad20 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  en LIMIT and OFF
1ad30 53 45 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20  SET.  ** became 
1ad40 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65 73  arbitrary expres
1ad50 73 69 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66  sions, we were f
1ad60 6f 72 63 65 64 20 74 6f 20 61 64 64 20 72 65 73  orced to add res
1ad70 74 72 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20  trictions (13). 
1ad80 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f   ** and (14). */
1ad90 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
1ada0 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74  mit && p->pLimit
1adb0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
1adc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1add0 74 72 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f  triction (13) */
1ade0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66  .  if( pSub->pOf
1adf0 66 73 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b  fset ) return 0;
1ae00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ae20 74 72 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f  triction (14) */
1ae30 0a 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74  .  if( p->pRight
1ae40 6d 6f 73 74 20 26 26 20 70 53 75 62 2d 3e 70 4c  most && pSub->pL
1ae50 69 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75  imit ){.    retu
1ae60 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae90 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1aea0 28 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (15) */.  }.  if
1aeb0 28 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d  ( pSubSrc->nSrc=
1aec0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1aef0 69 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66  ion (7)  */.  if
1af00 28 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73  ( pSub->selFlags
1af10 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
1af20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1af30 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1af40 69 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66  ion (5)  */.  if
1af50 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1af60 26 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  & (pSrc->nSrc>1 
1af70 7c 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20  || isAgg) ){.   
1af80 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1af90 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1afa0 6f 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20  ons (8)(9) */.  
1afb0 7d 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  }.  if( (p->selF
1afc0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1afd0 63 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65  ct)!=0 && subque
1afe0 72 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20  ryIsAgg ){.     
1aff0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1b000 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
1b010 20 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69   (6)  */.  }.  i
1b020 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26  f( p->pOrderBy &
1b030 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
1b040 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1b050 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b080 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29  Restriction (11)
1b090 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73   */.  }.  if( is
1b0a0 41 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  Agg && pSub->pOr
1b0b0 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
1b0c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b0d0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1b0e0 28 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (16) */.  if( pS
1b0f0 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
1b100 3e 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e  >pWhere ) return
1b110 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1b120 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1b130 28 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (19) */.  if( pS
1b140 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70  ub->pLimit && (p
1b150 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1b160 44 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a  Distinct)!=0 ){.
1b170 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1b180 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
1b190 63 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20  ction (21) */.  
1b1a0 7d 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65  }.  if( pSub->se
1b1b0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
1b1c0 72 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30  rsive ) return 0
1b1d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
1b1e0 73 74 72 69 63 74 69 6f 6e 20 28 32 32 29 20 20  striction (22)  
1b1f0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
1b200 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1b210 73 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70  sive) && pSub->p
1b220 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30  Prior ) return 0
1b230 3b 20 20 20 20 20 20 20 2f 2a 20 28 32 33 29 20  ;       /* (23) 
1b240 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45   */..  /* OBSOLE
1b250 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20  TE COMMENT 1:.  
1b260 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33  ** Restriction 3
1b270 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1b280 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61  ry is a join, ma
1b290 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1b2a0 75 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f  uery is .  ** no
1b2b0 74 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69  t used as the ri
1b2c0 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
1b2d0 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45  n outer join.  E
1b2e0 78 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74  xamples of why t
1b2f0 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  his.  ** is not 
1b300 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20  allowed:.  **.  
1b310 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45  **         t1 LE
1b320 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74  FT OUTER JOIN (t
1b330 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a  2 JOIN t3).  **.
1b340 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74    ** If we flatt
1b350 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65  en the above, we
1b360 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a   would get.  **.
1b370 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31    **         (t1
1b380 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1b390 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a   t2) JOIN t3.  *
1b3a0 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20  *.  ** which is 
1b3b0 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73  not at all the s
1b3c0 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a  ame thing..  **.
1b3d0 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f    ** OBSOLETE CO
1b3e0 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65  MMENT 2:.  ** Re
1b3f0 73 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49  striction 12:  I
1b400 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
1b410 73 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  s the right oper
1b420 61 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75  and of a left ou
1b430 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d  ter.  ** join, m
1b440 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62  ake sure the sub
1b450 71 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45  query has no WHE
1b460 52 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20  RE clause..  ** 
1b470 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77  An examples of w
1b480 68 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  hy this is not a
1b490 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1b4a0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1b4b0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45  T OUTER JOIN (SE
1b4c0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57  LECT * FROM t2 W
1b4d0 48 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a  HERE t2.x>0).  *
1b4e0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61  *.  ** If we fla
1b4f0 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  tten the above, 
1b500 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a  we would get.  *
1b510 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28  *.  **         (
1b520 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
1b530 49 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e  IN t2) WHERE t2.
1b540 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75  x>0.  **.  ** Bu
1b550 74 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73  t the t2.x>0 tes
1b560 74 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  t will always fa
1b570 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77  il on a NULL row
1b580 20 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20   of t2, which.  
1b590 2a 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63  ** effectively c
1b5a0 6f 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45  onverts the OUTE
1b5b0 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49  R JOIN into an I
1b5c0 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a  NNER JOIN..  **.
1b5d0 20 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49    ** THIS OVERRI
1b5e0 44 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d  DES OBSOLETE COM
1b5f0 4d 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42  MENTS 1 AND 2 AB
1b600 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74  OVE:.  ** Ticket
1b610 20 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61   #3300 shows tha
1b620 74 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65  t flattening the
1b630 20 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61   right term of a
1b640 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20   LEFT JOIN.  ** 
1b650 69 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20  is fraught with 
1b660 64 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f  danger.  Best to
1b670 20 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65   avoid the whole
1b680 20 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a   thing.  If the.
1b690 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73    ** subquery is
1b6a0 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1b6b0 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20  of a LEFT JOIN, 
1b6c0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74  then do not flat
1b6d0 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ten..  */.  if( 
1b6e0 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74  (pSubitem->joint
1b6f0 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
1b700 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1b710 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
1b720 73 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66  striction 17: If
1b730 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1b740 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
1b750 45 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  ECT, then it mus
1b760 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20  t.  ** use only 
1b770 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  the UNION ALL op
1b780 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65  erator. And none
1b790 20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73   of the simple s
1b7a0 65 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20  elect queries.  
1b7b0 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ** that make up 
1b7c0 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
1b7d0 45 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ECT are allowed 
1b7e0 74 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20  to be aggregate 
1b7f0 6f 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a  or distinct.  **
1b800 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20   queries..  */. 
1b810 20 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f   if( pSub->pPrio
1b820 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75  r ){.    if( pSu
1b830 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  b->pOrderBy ){. 
1b840 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1b850 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32  /* Restriction 2
1b860 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  0 */.    }.    i
1b870 66 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e  f( isAgg || (p->
1b880 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1b890 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53  stinct)!=0 || pS
1b8a0 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20  rc->nSrc!=1 ){. 
1b8b0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1b8c0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75     }.    for(pSu
1b8d0 62 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20  b1=pSub; pSub1; 
1b8e0 70 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72  pSub1=pSub1->pPr
1b8f0 69 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ior){.      test
1b900 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65  case( (pSub1->se
1b910 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
1b920 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
1b930 74 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63  te))==SF_Distinc
1b940 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t );.      testc
1b950 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1b960 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1b970 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1b980 65 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74  e))==SF_Aggregat
1b990 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
1b9a0 74 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30  t( pSub->pSrc!=0
1b9b0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
1b9c0 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26  Sub1->selFlags &
1b9d0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
1b9e0 5f 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a  _Aggregate))!=0.
1b9f0 20 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31         || (pSub1
1ba00 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
1ba10 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a  1->op!=TK_ALL) .
1ba20 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d         || pSub1-
1ba30 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20  >pSrc->nSrc<1.  
1ba40 20 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45       || pSub->pE
1ba50 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75  List->nExpr!=pSu
1ba60 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  b1->pEList->nExp
1ba70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  r.      ){.     
1ba80 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1ba90 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
1baa0 61 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63  ase( pSub1->pSrc
1bab0 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20  ->nSrc>1 );.    
1bac0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69  }..    /* Restri
1bad0 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20  ction 18. */.   
1bae0 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79   if( p->pOrderBy
1baf0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
1bb00 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
1bb10 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79  ; ii<p->pOrderBy
1bb20 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a  ->nExpr; ii++){.
1bb30 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
1bb40 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75  OrderBy->a[ii].u
1bb50 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d  .x.iOrderByCol==
1bb60 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1bb70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bb80 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20  .  /***** If we 
1bb90 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
1bba0 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  , flattening is 
1bbb0 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a  permitted. *****
1bbc0 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a  /..  /* Authoriz
1bbd0 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a  e the subquery *
1bbe0 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  /.  pParse->zAut
1bbf0 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69  hContext = pSubi
1bc00 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45  tem->zName;.  TE
1bc10 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69  STONLY(i =) sqli
1bc20 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1bc30 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
1bc40 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
1bc50 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c  testcase( i==SQL
1bc60 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50  ITE_DENY );.  pP
1bc70 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
1bc80 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43  xt = zSavedAuthC
1bc90 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66  ontext;..  /* If
1bca0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
1bcb0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
1bcc0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ECT statement, t
1bcd0 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74  hen (by restrict
1bce0 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64  ions.  ** 17 and
1bcf0 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75   18 above) it mu
1bd00 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c  st be a UNION AL
1bd10 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74  L and the parent
1bd20 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a   query must .  *
1bd30 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  * be of the form
1bd40 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1bd50 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73  SELECT <expr-lis
1bd60 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75  t> FROM (<sub-qu
1bd70 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61  ery>) <where-cla
1bd80 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  use> .  **.  ** 
1bd90 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20  followed by any 
1bda0 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20  ORDER BY, LIMIT 
1bdb0 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c  and/or OFFSET cl
1bdc0 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  auses. This bloc
1bdd0 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e  k.  ** creates N
1bde0 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  -1 copies of the
1bdf0 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69   parent query wi
1be00 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20  thout any ORDER 
1be10 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20  BY, LIMIT or .  
1be20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65  ** OFFSET clause
1be30 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d  s and joins them
1be40 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   to the left-han
1be50 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72  d-side of the or
1be60 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e  iginal.  ** usin
1be70 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  g UNION ALL oper
1be80 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63  ators. In this c
1be90 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ase N is the num
1bea0 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20  ber of simple.  
1beb0 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  ** select statem
1bec0 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  ents in the comp
1bed0 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a  ound sub-query..
1bee0 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c    **.  ** Exampl
1bef0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  e:.  **.  **    
1bf00 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d   SELECT a+1 FROM
1bf10 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53   (.  **        S
1bf20 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62  ELECT x FROM tab
1bf30 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49  .  **        UNI
1bf40 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  ON ALL.  **     
1bf50 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d     SELECT y FROM
1bf60 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1bf70 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1bf80 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62         SELECT ab
1bf90 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32  s(z*2) FROM tab2
1bfa0 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52  .  **     ) WHER
1bfb0 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20  E a!=5 ORDER BY 
1bfc0 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e  1.  **.  ** Tran
1bfd0 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20  sformed into:.  
1bfe0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  **.  **     SELE
1bff0 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT x+1 FROM tab 
1c000 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a  WHERE x+1!=5.  *
1c010 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
1c020 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1c030 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45  y+1 FROM tab WHE
1c040 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  RE y+1!=5.  **  
1c050 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a     UNION ALL.  *
1c060 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73  *     SELECT abs
1c070 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62  (z*2)+1 FROM tab
1c080 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29  2 WHERE abs(z*2)
1c090 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f  +1!=5.  **     O
1c0a0 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20  RDER BY 1.  **. 
1c0b0 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73   ** We call this
1c0c0 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73   the "compound-s
1c0d0 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
1c0e0 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ng"..  */.  for(
1c0f0 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f  pSub=pSub->pPrio
1c100 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53  r; pSub; pSub=pS
1c110 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20  ub->pPrior){.   
1c120 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
1c130 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
1c140 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
1c150 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  rBy;.    Expr *p
1c160 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
1c170 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66  t;.    Expr *pOf
1c180 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
1c190 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70  t;.    Select *p
1c1a0 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f  Prior = p->pPrio
1c1b0 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  r;.    p->pOrder
1c1c0 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  By = 0;.    p->p
1c1d0 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Src = 0;.    p->
1c1e0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
1c1f0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
1c200 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
1c210 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  0;.    pNew = sq
1c220 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
1c230 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d  b, p, 0);.    p-
1c240 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73  >pOffset = pOffs
1c250 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69  et;.    p->pLimi
1c260 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20  t = pLimit;.    
1c270 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
1c280 72 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70  rderBy;.    p->p
1c290 53 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20  Src = pSrc;.    
1c2a0 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  p->op = TK_ALL;.
1c2b0 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73      p->pRightmos
1c2c0 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  t = 0;.    if( p
1c2d0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1c2e0 70 4e 65 77 20 3d 20 70 50 72 69 6f 72 3b 0a 20  pNew = pPrior;. 
1c2f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c300 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70  pNew->pPrior = p
1c310 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 4e 65  Prior;.      pNe
1c320 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20  w->pRightmost = 
1c330 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  0;.    }.    p->
1c340 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20  pPrior = pNew;. 
1c350 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1c360 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1c370 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65   1;.  }..  /* Be
1c380 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e 67 20 74  gin flattening t
1c390 68 65 20 69 46 72 6f 6d 2d 74 68 20 65 6e 74 72  he iFrom-th entr
1c3a0 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
1c3b0 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e 20 74 68  ause .  ** in th
1c3c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1c3d0 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20 70 53 75   */.  pSub = pSu
1c3e0 62 31 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  b1 = pSubitem->p
1c3f0 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a 20 44 65  Select;..  /* De
1c400 6c 65 74 65 20 74 68 65 20 74 72 61 6e 73 69 65  lete the transie
1c410 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74 75  nt table structu
1c420 72 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  re associated wi
1c430 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71  th the.  ** subq
1c440 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  uery.  */.  sqli
1c450 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1c460 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ubitem->zDatabas
1c470 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
1c480 72 65 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d  ree(db, pSubitem
1c490 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ->zName);.  sqli
1c4a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
1c4b0 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ubitem->zAlias);
1c4c0 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61  .  pSubitem->zDa
1c4d0 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 70 53  tabase = 0;.  pS
1c4e0 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ubitem->zName = 
1c4f0 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a  0;.  pSubitem->z
1c500 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 70 53 75  Alias = 0;.  pSu
1c510 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  bitem->pSelect =
1c520 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66 65 72 20   0;..  /* Defer 
1c530 64 65 6c 65 74 69 6e 67 20 74 68 65 20 54 61 62  deleting the Tab
1c540 6c 65 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69  le object associ
1c550 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
1c560 2a 2a 20 73 75 62 71 75 65 72 79 20 75 6e 74 69  ** subquery unti
1c570 6c 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  l code generatio
1c580 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 6c 65  n is.  ** comple
1c590 74 65 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  te, since there 
1c5a0 6d 61 79 20 73 74 69 6c 6c 20 65 78 69 73 74 20  may still exist 
1c5b0 45 78 70 72 2e 70 54 61 62 20 65 6e 74 72 69 65  Expr.pTab entrie
1c5c0 73 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 66 65  s that.  ** refe
1c5d0 72 20 74 6f 20 74 68 65 20 73 75 62 71 75 65 72  r to the subquer
1c5e0 79 20 65 76 65 6e 20 61 66 74 65 72 20 66 6c 61  y even after fla
1c5f0 74 74 65 6e 69 6e 67 2e 20 20 54 69 63 6b 65 74  ttening.  Ticket
1c600 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a 20 20 2a   #3346..  **.  *
1c610 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62  * pSubitem->pTab
1c620 20 69 73 20 61 6c 77 61 79 73 20 6e 6f 6e 2d 4e   is always non-N
1c630 55 4c 4c 20 62 79 20 74 65 73 74 20 72 65 73 74  ULL by test rest
1c640 72 69 63 74 69 6f 6e 73 20 61 6e 64 20 74 65 73  rictions and tes
1c650 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2f 0a 20  ts above..  */. 
1c660 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 75 62   if( ALWAYS(pSub
1c670 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30 29 20 29  item->pTab!=0) )
1c680 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
1c690 62 54 6f 44 65 6c 20 3d 20 70 53 75 62 69 74 65  bToDel = pSubite
1c6a0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
1c6b0 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1c6c0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 50 61 72  ==1 ){.      Par
1c6d0 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1c6e0 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1c6f0 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1c700 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 70      pTabToDel->p
1c710 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20 70 54 6f  NextZombie = pTo
1c720 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1c730 61 62 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  ab;.      pTople
1c740 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54 61 62 20  vel->pZombieTab 
1c750 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a 20 20 20  = pTabToDel;.   
1c760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
1c770 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66 2d 2d 3b  abToDel->nRef--;
1c780 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 75 62 69  .    }.    pSubi
1c790 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  tem->pTab = 0;. 
1c7a0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c   }..  /* The fol
1c7b0 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
1c7c0 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
1c7d0 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  erm in a compoun
1c7e0 64 2d 73 75 62 71 75 65 72 79 0a 20 20 2a 2a 20  d-subquery.  ** 
1c7f0 66 6c 61 74 74 65 6e 69 6e 67 20 28 61 73 20 64  flattening (as d
1c800 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 29 2e  escribed above).
1c810 20 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e    If we are doin
1c820 67 20 61 20 64 69 66 66 65 72 65 6e 74 20 6b 69  g a different ki
1c830 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c 61 74 74  nd.  ** of flatt
1c840 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61 74 74 65  ening - a flatte
1c850 6e 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  ning other than 
1c860 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75  a compound-subqu
1c870 65 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d  ery flattening -
1c880 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  .  ** then this 
1c890 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e 73 20 6f  loop only runs o
1c8a0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
1c8b0 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65 73 20 61  his loop moves a
1c8c0 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 65  ll of the FROM e
1c8d0 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 73  lements of the s
1c8e0 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68 65  ubquery into the
1c8f0 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  .  ** the FROM c
1c900 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1c910 65 72 20 71 75 65 72 79 2e 20 20 42 65 66 6f 72  er query.  Befor
1c920 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 72 65  e doing this, re
1c930 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 65 20  member.  ** the 
1c940 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
1c950 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f  r the original o
1c960 75 74 65 72 20 71 75 65 72 79 20 46 52 4f 4d 20  uter query FROM 
1c970 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20 2a 2a 20  element in.  ** 
1c980 69 50 61 72 65 6e 74 2e 20 20 54 68 65 20 69 50  iParent.  The iP
1c990 61 72 65 6e 74 20 63 75 72 73 6f 72 20 77 69 6c  arent cursor wil
1c9a0 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 2e  l never be used.
1c9b0 20 20 53 75 62 73 65 71 75 65 6e 74 20 63 6f 64    Subsequent cod
1c9c0 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61 6e  e.  ** will scan
1c9d0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6c 6f 6f   expressions loo
1c9e0 6b 69 6e 67 20 66 6f 72 20 69 50 61 72 65 6e 74  king for iParent
1c9f0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
1ca00 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 74 68 6f  replace.  ** tho
1ca10 73 65 20 72 65 66 65 72 65 6e 63 65 73 20 77 69  se references wi
1ca20 74 68 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  th expressions t
1ca30 68 61 74 20 72 65 73 6f 6c 76 65 20 74 6f 20 74  hat resolve to t
1ca40 68 65 20 73 75 62 71 75 65 72 79 20 46 52 4f 4d  he subquery FROM
1ca50 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 77  .  ** elements w
1ca60 65 20 61 72 65 20 6e 6f 77 20 63 6f 70 79 69 6e  e are now copyin
1ca70 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  g in..  */.  for
1ca80 28 70 50 61 72 65 6e 74 3d 70 3b 20 70 50 61 72  (pParent=p; pPar
1ca90 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d 70 50 61  ent; pParent=pPa
1caa0 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c 20 70 53  rent->pPrior, pS
1cab0 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29  ub=pSub->pPrior)
1cac0 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 53 72  {.    int nSubSr
1cad0 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69 6e 74 79  c;.    u8 jointy
1cae0 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 53 75 62  pe = 0;.    pSub
1caf0 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53 72 63  Src = pSub->pSrc
1cb00 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
1cb10 61 75 73 65 20 6f 66 20 73 75 62 71 75 65 72 79  ause of subquery
1cb20 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53 72 63 20   */.    nSubSrc 
1cb30 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3b  = pSubSrc->nSrc;
1cb40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
1cb50 65 72 6d 73 20 69 6e 20 73 75 62 71 75 65 72 79  erms in subquery
1cb60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1cb70 20 20 20 20 70 53 72 63 20 3d 20 70 50 61 72 65      pSrc = pPare
1cb80 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  nt->pSrc;     /*
1cb90 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1cba0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1cbb0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  */..    if( pSrc
1cbc0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1cbd0 28 20 70 50 61 72 65 6e 74 3d 3d 70 20 29 3b 20  ( pParent==p ); 
1cbe0 20 2f 2a 20 46 69 72 73 74 20 74 69 6d 65 20 74   /* First time t
1cbf0 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1cc00 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e 74 79 70  */.      jointyp
1cc10 65 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  e = pSubitem->jo
1cc20 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 65 6c 73  intype;.    }els
1cc30 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1cc40 20 70 50 61 72 65 6e 74 21 3d 70 20 29 3b 20 20   pParent!=p );  
1cc50 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75 62 73 65  /* 2nd and subse
1cc60 71 75 65 6e 74 20 74 69 6d 65 73 20 74 68 72 6f  quent times thro
1cc70 75 67 68 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  ugh the loop */.
1cc80 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 50 61        pSrc = pPa
1cc90 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 73 71 6c  rent->pSrc = sql
1cca0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1ccb0 64 28 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  d(db, 0, 0, 0);.
1ccc0 20 20 20 20 20 20 69 66 28 20 70 53 72 63 3d 3d        if( pSrc==
1ccd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  0 ){.        ass
1cce0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1ccf0 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20  ailed );.       
1cd00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1cd10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1cd20 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1cd30 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74 20 6f 66  a single slot of
1cd40 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1cd50 20 6f 66 20 74 68 65 20 6f 75 74 65 72 0a 20 20   of the outer.  
1cd60 20 20 2a 2a 20 71 75 65 72 79 2e 20 20 49 66 20    ** query.  If 
1cd70 74 68 65 20 73 75 62 71 75 65 72 79 20 68 61 73  the subquery has
1cd80 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
1cd90 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73 20 46 52  lement in its FR
1cda0 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20 20 20 2a  OM clause,.    *
1cdb0 2a 20 74 68 65 6e 20 65 78 70 61 6e 64 20 74 68  * then expand th
1cdc0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 74 6f  e outer query to
1cdd0 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1cde0 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 65  it to hold all e
1cdf0 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f  lements.    ** o
1ce00 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1ce10 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78      **.    ** Ex
1ce20 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1ce30 20 20 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a    **    SELECT *
1ce40 20 46 52 4f 4d 20 74 61 62 41 2c 20 28 53 45 4c   FROM tabA, (SEL
1ce50 45 43 54 20 2a 20 46 52 4f 4d 20 73 75 62 31 2c  ECT * FROM sub1,
1ce60 20 73 75 62 32 29 2c 20 74 61 62 42 3b 0a 20 20   sub2), tabB;.  
1ce70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1ce80 6f 75 74 65 72 20 71 75 65 72 79 20 68 61 73 20  outer query has 
1ce90 33 20 73 6c 6f 74 73 20 69 6e 20 69 74 73 20 46  3 slots in its F
1cea0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 6e 65  ROM clause.  One
1ceb0 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a 20 20 20   slot of the.   
1cec0 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79 20   ** outer query 
1ced0 28 74 68 65 20 6d 69 64 64 6c 65 20 73 6c 6f 74  (the middle slot
1cee0 29 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  ) is used by the
1cef0 20 73 75 62 71 75 65 72 79 2e 20 20 54 68 65 20   subquery.  The 
1cf00 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63  next.    ** bloc
1cf10 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 65  k of code will e
1cf20 78 70 61 6e 64 20 74 68 65 20 6f 75 74 20 71 75  xpand the out qu
1cf30 65 72 79 20 74 6f 20 34 20 73 6c 6f 74 73 2e 20  ery to 4 slots. 
1cf40 20 54 68 65 20 6d 69 64 64 6c 65 0a 20 20 20 20   The middle.    
1cf50 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78 70 61 6e  ** slot is expan
1cf60 64 65 64 20 74 6f 20 74 77 6f 20 73 6c 6f 74 73  ded to two slots
1cf70 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
1cf80 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 0a  e space for the.
1cf90 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65      ** two eleme
1cfa0 6e 74 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  nts in the FROM 
1cfb0 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
1cfc0 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20  bquery..    */. 
1cfd0 20 20 20 69 66 28 20 6e 53 75 62 53 72 63 3e 31     if( nSubSrc>1
1cfe0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1cff0 74 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 20 3d  t->pSrc = pSrc =
1d000 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1d010 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 2c  nlarge(db, pSrc,
1d020 20 6e 53 75 62 53 72 63 2d 31 2c 69 46 72 6f 6d   nSubSrc-1,iFrom
1d030 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  +1);.      if( d
1d040 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1d050 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1d060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d070 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 65 72  .    /* Transfer
1d080 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d090 20 74 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20   terms from the 
1d0a0 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20 74 68  subquery into th
1d0b0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1d0c0 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  uery..    */.   
1d0d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62   for(i=0; i<nSub
1d0e0 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
1d0f0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1d100 6c 65 74 65 28 64 62 2c 20 70 53 72 63 2d 3e 61  lete(db, pSrc->a
1d110 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73 69 6e 67  [i+iFrom].pUsing
1d120 29 3b 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 61  );.      pSrc->a
1d130 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70 53 75 62  [i+iFrom] = pSub
1d140 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
1d150 20 6d 65 6d 73 65 74 28 26 70 53 75 62 53 72 63   memset(&pSubSrc
1d160 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69 7a 65 6f  ->a[i], 0, sizeo
1d170 66 28 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 29  f(pSubSrc->a[i])
1d180 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72  );.    }.    pSr
1d190 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a 6f 69 6e  c->a[iFrom].join
1d1a0 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79 70 65 3b  type = jointype;
1d1b0 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 62  .  .    /* Now b
1d1c0 65 67 69 6e 20 73 75 62 73 74 69 74 75 74 69 6e  egin substitutin
1d1d0 67 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  g subquery resul
1d1e0 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
1d1f0 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 72 65  s for .    ** re
1d200 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1d210 69 50 61 72 65 6e 74 20 69 6e 20 74 68 65 20 6f  iParent in the o
1d220 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20  uter query..    
1d230 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70  ** .    ** Examp
1d240 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le:.    **.    *
1d250 2a 20 20 20 53 45 4c 45 43 54 20 61 2b 35 2c 20  *   SELECT a+5, 
1d260 62 2a 31 30 20 46 52 4f 4d 20 28 53 45 4c 45 43  b*10 FROM (SELEC
1d270 54 20 78 2a 33 20 41 53 20 61 2c 20 79 2b 31 30  T x*3 AS a, y+10
1d280 20 41 53 20 62 20 46 52 4f 4d 20 74 31 29 20 57   AS b FROM t1) W
1d290 48 45 52 45 20 61 3e 62 3b 0a 20 20 20 20 2a 2a  HERE a>b;.    **
1d2a0 20 20 20 5c 20 20 20 20 20 20 20 20 20 20 20 20     \            
1d2b0 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
1d2c0 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75 65 72 79  _______ subquery
1d2d0 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20   __________/    
1d2e0 20 20 20 20 20 20 2f 0a 20 20 20 20 2a 2a 20 20        /.    **  
1d2f0 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
1d300 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65 72 20 71  ________ outer q
1d310 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  uery ___________
1d320 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1d330 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ___/.    **.    
1d340 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74 20 65 76  ** We look at ev
1d350 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
1d360 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1d370 79 20 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63  y and every plac
1d380 65 20 77 65 20 73 65 65 0a 20 20 20 20 2a 2a 20  e we see.    ** 
1d390 22 61 22 20 77 65 20 73 75 62 73 74 69 74 75 74  "a" we substitut
1d3a0 65 20 22 78 2a 33 22 20 61 6e 64 20 65 76 65 72  e "x*3" and ever
1d3b0 79 20 70 6c 61 63 65 20 77 65 20 73 65 65 20 22  y place we see "
1d3c0 62 22 20 77 65 20 73 75 62 73 74 69 74 75 74 65  b" we substitute
1d3d0 20 22 79 2b 31 30 22 2e 0a 20 20 20 20 2a 2f 0a   "y+10"..    */.
1d3e0 20 20 20 20 70 4c 69 73 74 20 3d 20 70 50 61 72      pList = pPar
1d3f0 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ent->pEList;.   
1d400 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1d410 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
1d420 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
1d430 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d 30 20 29  >a[i].zName==0 )
1d440 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
1d450 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
1d460 62 53 74 72 44 75 70 28 64 62 2c 20 70 4c 69 73  bStrDup(db, pLis
1d470 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 3b 0a  t->a[i].zSpan);.
1d480 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
1d490 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
1d4a0 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b         pList->a[
1d4b0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  i].zName = zName
1d4c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d4d0 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69 73      substExprLis
1d4e0 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  t(db, pParent->p
1d4f0 45 4c 69 73 74 2c 20 69 50 61 72 65 6e 74 2c 20  EList, iParent, 
1d500 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1d510 20 20 20 69 66 28 20 69 73 41 67 67 20 29 7b 0a     if( isAgg ){.
1d520 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
1d530 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  ist(db, pParent-
1d540 3e 70 47 72 6f 75 70 42 79 2c 20 69 50 61 72 65  >pGroupBy, iPare
1d550 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1d560 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1d570 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73  ->pHaving = subs
1d580 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
1d590 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72  t->pHaving, iPar
1d5a0 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1d5b0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1d5c0 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
1d5d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1d5e0 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65  ( pParent->pOrde
1d5f0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
1d600 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1d610 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
1d620 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
1d630 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1d640 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72    }else if( pPar
1d650 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ent->pOrderBy ){
1d660 0a 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72  .      substExpr
1d670 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1d680 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69 50 61 72  ->pOrderBy, iPar
1d690 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73  ent, pSub->pELis
1d6a0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
1d6b0 28 20 70 53 75 62 2d 3e 70 57 68 65 72 65 20 29  ( pSub->pWhere )
1d6c0 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d  {.      pWhere =
1d6d0 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1d6e0 64 62 2c 20 70 53 75 62 2d 3e 70 57 68 65 72 65  db, pSub->pWhere
1d6f0 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1d700 0a 20 20 20 20 20 20 70 57 68 65 72 65 20 3d 20  .      pWhere = 
1d710 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1d720 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
1d730 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1d740 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1d750 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 61  ==0 );.      pPa
1d760 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1d770 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 3b  pParent->pWhere;
1d780 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1d790 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 3b  pWhere = pWhere;
1d7a0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
1d7b0 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
1d7c0 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d  xpr(db, pParent-
1d7d0 3e 70 48 61 76 69 6e 67 2c 20 69 50 61 72 65 6e  >pHaving, iParen
1d7e0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1d7f0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1d800 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
1d810 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
1d820 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1d830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d850 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
1d860 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 48 61 76  p(db, pSub->pHav
1d870 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  ing, 0));.      
1d880 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1d890 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 0a  >pGroupBy==0 );.
1d8a0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1d8b0 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
1d8c0 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
1d8d0 20 70 53 75 62 2d 3e 70 47 72 6f 75 70 42 79 2c   pSub->pGroupBy,
1d8e0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1d8f0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
1d900 57 68 65 72 65 20 3d 20 73 75 62 73 74 45 78 70  Where = substExp
1d910 72 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  r(db, pParent->p
1d920 57 68 65 72 65 2c 20 69 50 61 72 65 6e 74 2c 20  Where, iParent, 
1d930 70 53 75 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSub->pEList);. 
1d940 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 57       pParent->pW
1d950 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
1d960 70 72 41 6e 64 28 64 62 2c 20 70 50 61 72 65 6e  prAnd(db, pParen
1d970 74 2d 3e 70 57 68 65 72 65 2c 20 70 57 68 65 72  t->pWhere, pWher
1d980 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  e);.    }.  .   
1d990 20 2f 2a 20 54 68 65 20 66 6c 61 74 74 65 6e 65   /* The flattene
1d9a0 64 20 71 75 65 72 79 20 69 73 20 64 69 73 74 69  d query is disti
1d9b0 6e 63 74 20 69 66 20 65 69 74 68 65 72 20 74 68  nct if either th
1d9c0 65 20 69 6e 6e 65 72 20 6f 72 20 74 68 65 0a 20  e inner or the. 
1d9d0 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
1d9e0 79 20 69 73 20 64 69 73 74 69 6e 63 74 2e 20 0a  y is distinct. .
1d9f0 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 65      */.    pPare
1da00 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  nt->selFlags |= 
1da10 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
1da20 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   SF_Distinct;.  
1da30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
1da40 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 28  ELECT ... FROM (
1da50 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49 4d 49 54  SELECT ... LIMIT
1da60 20 61 20 4f 46 46 53 45 54 20 62 29 20 4c 49 4d   a OFFSET b) LIM
1da70 49 54 20 78 20 4f 46 46 53 45 54 20 79 3b 0a 20  IT x OFFSET y;. 
1da80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 65     **.    ** One
1da90 20 69 73 20 74 65 6d 70 74 65 64 20 74 6f 20 74   is tempted to t
1daa0 72 79 20 74 6f 20 61 64 64 20 61 20 61 6e 64 20  ry to add a and 
1dab0 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65  b to combine the
1dac0 20 6c 69 6d 69 74 73 2e 20 20 42 75 74 20 74 68   limits.  But th
1dad0 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e  is.    ** does n
1dae0 6f 74 20 77 6f 72 6b 20 69 66 20 65 69 74 68 65  ot work if eithe
1daf0 72 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  r limit is negat
1db00 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ive..    */.    
1db10 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  if( pSub->pLimit
1db20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   ){.      pParen
1db30 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 53 75 62  t->pLimit = pSub
1db40 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
1db50 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pSub->pLimit = 0
1db60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1db70 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64 65 6c 65  * Finially, dele
1db80 74 65 20 77 68 61 74 20 69 73 20 6c 65 66 74 20  te what is left 
1db90 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1dba0 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  and return.  ** 
1dbb0 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  success..  */.  
1dbc0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1dbd0 65 74 65 28 64 62 2c 20 70 53 75 62 31 29 3b 0a  ete(db, pSub1);.
1dbe0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
1dbf0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
1dc00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
1dc10 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
1dc20 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1dc30 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  VIEW) */../*.** 
1dc40 42 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e  Based on the con
1dc50 74 65 6e 74 73 20 6f 66 20 74 68 65 20 41 67 67  tents of the Agg
1dc60 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  Info structure i
1dc70 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1dc80 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
1dc90 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
1dca0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 20 66   checks if the f
1dcb0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
1dcc0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  e:.**.**    * th
1dcd0 65 20 71 75 65 72 79 20 63 6f 6e 74 61 69 6e 73  e query contains
1dce0 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20 61   just a single a
1dcf0 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1dd00 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  n,.**    * the a
1dd10 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1dd20 6e 20 69 73 20 65 69 74 68 65 72 20 6d 69 6e 28  n is either min(
1dd30 29 20 6f 72 20 6d 61 78 28 29 2c 20 61 6e 64 0a  ) or max(), and.
1dd40 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 72 67 75  **    * the argu
1dd50 6d 65 6e 74 20 74 6f 20 74 68 65 20 61 67 67 72  ment to the aggr
1dd60 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 69  egate function i
1dd70 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
1dd80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 6f  ..**.** If all o
1dd90 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
1dda0 74 72 75 65 2c 20 74 68 65 6e 20 57 48 45 52 45  true, then WHERE
1ddb0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20  _ORDERBY_MIN or 
1ddc0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1ddd0 58 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  X.** is returned
1dde0 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   as appropriate.
1ddf0 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e 4d 61 78   Also, *ppMinMax
1de00 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1de10 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c 69 73 74   to the .** list
1de20 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61   of arguments pa
1de30 73 73 65 64 20 74 6f 20 74 68 65 20 61 67 67 72  ssed to the aggr
1de40 65 67 61 74 65 20 62 65 66 6f 72 65 20 72 65 74  egate before ret
1de50 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 4f 72  urning..**.** Or
1de60 2c 20 69 66 20 74 68 65 20 63 6f 6e 64 69 74 69  , if the conditi
1de70 6f 6e 73 20 61 62 6f 76 65 20 61 72 65 20 6e 6f  ons above are no
1de80 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e 4d 61 78  t met, *ppMinMax
1de90 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
1dea0 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44 45 52 42  .** WHERE_ORDERB
1deb0 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72 65 74 75  Y_NORMAL is retu
1dec0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1ded0 75 38 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 41  u8 minMaxQuery(A
1dee0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
1def0 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4d  , ExprList **ppM
1df00 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 65 52  inMax){.  int eR
1df10 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  et = WHERE_ORDER
1df20 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20 20 20 20  BY_NORMAL;      
1df30 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1df40 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70 4d 69 6e  lue */..  *ppMin
1df50 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Max = 0;.  if( p
1df60 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d  AggInfo->nFunc==
1df70 31 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  1 ){.    Expr *p
1df80 45 78 70 72 20 3d 20 70 41 67 67 49 6e 66 6f 2d  Expr = pAggInfo-
1df90 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78 70 72 3b  >aFunc[0].pExpr;
1dfa0 20 2f 2a 20 41 67 67 72 65 67 61 74 65 20 66 75   /* Aggregate fu
1dfb0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  nction */.    Ex
1dfc0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
1dfd0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
1dfe0 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
1dff0 74 73 20 74 6f 20 61 67 67 20 66 75 6e 63 74 69  ts to agg functi
1e000 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  on */..    asser
1e010 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
1e020 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 3b  _AGG_FUNCTION );
1e030 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20  .    if( pEList 
1e040 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  && pEList->nExpr
1e050 3d 3d 31 20 26 26 20 70 45 4c 69 73 74 2d 3e 61  ==1 && pEList->a
1e060 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  [0].pExpr->op==T
1e070 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  K_AGG_COLUMN ){.
1e080 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1e090 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78 70 72 2d   *zFunc = pExpr-
1e0a0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1e0b0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1e0c0 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 69 6e 22  Cmp(zFunc, "min"
1e0d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e0e0 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52 44  eRet = WHERE_ORD
1e0f0 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20 20 20 20  ERBY_MIN;.      
1e100 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70 45    *ppMinMax = pE
1e110 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  List;.      }els
1e120 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
1e130 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d 61 78  ICmp(zFunc, "max
1e140 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
1e150 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1e160 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20 20 20 20  DERBY_MAX;.     
1e170 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 70     *ppMinMax = p
1e180 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  EList;.      }. 
1e190 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1e1a0 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78 3d 3d 30  rt( *ppMinMax==0
1e1b0 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61 78 29 2d   || (*ppMinMax)-
1e1c0 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 72  >nExpr==1 );.  r
1e1d0 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d 0a 0a 2f  eturn eRet;.}../
1e1e0 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
1e1f0 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
1e200 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1e210 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 67 67  gument is an agg
1e220 72 65 67 61 74 65 20 71 75 65 72 79 2e 0a 2a 2a  regate query..**
1e230 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 6d   The second argm
1e240 65 6e 74 20 69 73 20 74 68 65 20 61 73 73 6f 63  ent is the assoc
1e250 69 61 74 65 64 20 61 67 67 72 65 67 61 74 65 2d  iated aggregate-
1e260 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 54 68 69  info object. Thi
1e270 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 74  s .** function t
1e280 65 73 74 73 20 69 66 20 74 68 65 20 53 45 4c 45  ests if the SELE
1e290 43 54 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  CT is of the for
1e2a0 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43  m:.**.**   SELEC
1e2b0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1e2c0 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77 68 65 72  <tbl>.**.** wher
1e2d0 65 20 74 61 62 6c 65 20 69 73 20 61 20 64 61 74  e table is a dat
1e2e0 61 62 61 73 65 20 74 61 62 6c 65 2c 20 6e 6f 74  abase table, not
1e2f0 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
1e300 20 76 69 65 77 2e 20 49 66 20 74 68 65 20 71 75   view. If the qu
1e310 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d 61 74 63  ery.** does matc
1e320 68 20 74 68 69 73 20 70 61 74 74 65 72 6e 2c 20  h this pattern, 
1e330 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  then a pointer t
1e340 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  o the Table obje
1e350 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67 0a  ct representing.
1e360 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72 65 74 75  ** <tbl> is retu
1e370 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
1e380 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a   0 is returned..
1e390 2a 2f 0a 73 74 61 74 69 63 20 54 61 62 6c 65 20  */.static Table 
1e3a0 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 53  *isSimpleCount(S
1e3b0 65 6c 65 63 74 20 2a 70 2c 20 41 67 67 49 6e 66  elect *p, AggInf
1e3c0 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
1e3d0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 45  Table *pTab;.  E
1e3e0 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a 20 20 61  xpr *pExpr;..  a
1e3f0 73 73 65 72 74 28 20 21 70 2d 3e 70 47 72 6f 75  ssert( !p->pGrou
1e400 70 42 79 20 29 3b 0a 0a 20 20 69 66 28 20 70 2d  pBy );..  if( p-
1e410 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d 3e 70 45  >pWhere || p->pE
1e420 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 0a  List->nExpr!=1 .
1e430 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63 2d 3e 6e     || p->pSrc->n
1e440 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e 70 53 72  Src!=1 || p->pSr
1e450 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 0a  c->a[0].pSelect.
1e460 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1e470 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 20 3d 20  0;.  }.  pTab = 
1e480 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  p->pSrc->a[0].pT
1e490 61 62 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 2d  ab;.  pExpr = p-
1e4a0 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
1e4b0 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  xpr;.  assert( p
1e4c0 54 61 62 20 26 26 20 21 70 54 61 62 2d 3e 70 53  Tab && !pTab->pS
1e4d0 65 6c 65 63 74 20 26 26 20 70 45 78 70 72 20 29  elect && pExpr )
1e4e0 3b 0a 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  ;..  if( IsVirtu
1e4f0 61 6c 28 70 54 61 62 29 20 29 20 72 65 74 75 72  al(pTab) ) retur
1e500 6e 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  n 0;.  if( pExpr
1e510 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op!=TK_AGG_FUN
1e520 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20 30  CTION ) return 0
1e530 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 41  ;.  if( NEVER(pA
1e540 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3d 3d 30  ggInfo->nFunc==0
1e550 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1e560 69 66 28 20 28 70 41 67 67 49 6e 66 6f 2d 3e 61  if( (pAggInfo->a
1e570 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63 2d 3e 66  Func[0].pFunc->f
1e580 75 6e 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  uncFlags&SQLITE_
1e590 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30 20 29  FUNC_COUNT)==0 )
1e5a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1e5b0 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50   pExpr->flags&EP
1e5c0 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65 74 75  _Distinct ) retu
1e5d0 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20  rn 0;..  return 
1e5e0 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  pTab;.}../*.** I
1e5f0 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1e600 74 20 69 74 65 6d 20 70 61 73 73 65 64 20 61 73  t item passed as
1e610 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77 61 73   an argument was
1e620 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74 68 20   augmented with 
1e630 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20 42 59  an.** INDEXED BY
1e640 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 72   clause, then tr
1e650 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  y to locate the 
1e660 73 70 65 63 69 66 69 65 64 20 69 6e 64 65 78 2e  specified index.
1e670 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77 61 73   If there.** was
1e680 20 73 75 63 68 20 61 20 63 6c 61 75 73 65 20 61   such a clause a
1e690 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  nd the named ind
1e6a0 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ex cannot be fou
1e6b0 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  nd, return .** S
1e6c0 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e 64 20  QLITE_ERROR and 
1e6d0 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 69  leave an error i
1e6e0 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65 72 77  n pParse. Otherw
1e6f0 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20 0a 2a  ise, populate .*
1e700 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20  * pFrom->pIndex 
1e710 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1e720 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
1e730 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f  ite3IndexedByLoo
1e740 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  kup(Parse *pPars
1e750 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  e, struct SrcLis
1e760 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29 7b 0a  t_item *pFrom){.
1e770 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61    if( pFrom->pTa
1e780 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49 6e 64  b && pFrom->zInd
1e790 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  ex ){.    Table 
1e7a0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
1e7b0 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Tab;.    char *z
1e7c0 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d 3e 7a  Index = pFrom->z
1e7d0 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64 65 78  Index;.    Index
1e7e0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
1e7f0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
1e800 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49 64 78  x; .        pIdx
1e810 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1e820 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20  mp(pIdx->zName, 
1e830 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20 20 20  zIndex); .      
1e840 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65    pIdx=pIdx->pNe
1e850 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  xt.    );.    if
1e860 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20 20 20  ( !pIdx ){.     
1e870 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1e880 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
1e890 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20 7a 49  h index: %s", zI
1e8a0 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20 20 20  ndex, 0);.      
1e8b0 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
1e8c0 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  ema = 1;.      r
1e8d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1e8e0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OR;.    }.    pF
1e8f0 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  rom->pIndex = pI
1e900 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
1e910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a   SQLITE_OK;.}./*
1e920 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f 6d 70 6f  .** Detect compo
1e930 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
1e940 6d 65 6e 74 73 20 74 68 61 74 20 75 73 65 20 61  ments that use a
1e950 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1e960 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e 20 61 6c  e with .** an al
1e970 74 65 72 6e 61 74 69 76 65 20 63 6f 6c 6c 61 74  ternative collat
1e980 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a  ing sequence..**
1e990 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2e 2e  .**    SELECT ..
1e9a0 2e 20 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54  . FROM t1 EXCEPT
1e9b0 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d   SELECT ... FROM
1e9c0 20 74 32 20 4f 52 44 45 52 20 42 59 20 2e 2e 20   t2 ORDER BY .. 
1e9d0 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a  COLLATE ....**.*
1e9e0 2a 20 54 68 65 73 65 20 61 72 65 20 72 65 77 72  * These are rewr
1e9f0 69 74 74 65 6e 20 61 73 20 61 20 73 75 62 71 75  itten as a subqu
1ea00 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45  ery:.**.**    SE
1ea10 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28 53 45 4c  LECT * FROM (SEL
1ea20 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  ECT ... FROM t1 
1ea30 45 58 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e  EXCEPT SELECT ..
1ea40 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a 20 20 20  . FROM t2).**   
1ea50 20 20 4f 52 44 45 52 20 42 59 20 2e 2e 2e 20 43    ORDER BY ... C
1ea60 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  OLLATE ....**.**
1ea70 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
1ea80 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
1ea90 79 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 75  y because the mu
1eaa0 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
1eab0 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 62  () routine.** ab
1eac0 6f 76 65 20 74 68 61 74 20 67 65 6e 65 72 61 74  ove that generat
1ead0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
1eae0 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
1eaf0 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20  T with an ORDER 
1eb00 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20 75 73 65  BY clause.** use
1eb10 73 20 61 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  s a merge algori
1eb20 74 68 6d 20 74 68 61 74 20 72 65 71 75 69 72 65  thm that require
1eb30 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
1eb40 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 6e  ting sequence on
1eb50 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
1eb60 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20 74 68 65  olumns as on the
1eb70 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1eb80 2e 20 20 53 65 65 20 74 69 63 6b 65 74 0a 2a 2a  .  See ticket.**
1eb90 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73 71 6c 69   http://www.sqli
1eba0 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e 66 6f 2f  te.org/src/info/
1ebb0 36 37 30 39 35 37 34 64 32 61 0a 2a 2a 0a 2a 2a  6709574d2a.**.**
1ebc0 20 54 68 69 73 20 74 72 61 6e 73 66 6f 72 6d 61   This transforma
1ebd0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 6e 65 65  tion is only nee
1ebe0 64 65 64 20 66 6f 72 20 45 58 43 45 50 54 2c 20  ded for EXCEPT, 
1ebf0 49 4e 54 45 52 53 45 43 54 2c 20 61 6e 64 20 55  INTERSECT, and U
1ec00 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20 55 4e 49  NION..** The UNI
1ec10 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20  ON ALL operator 
1ec20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69 74 68 20  works fine with 
1ec30 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
1ec40 42 79 28 29 20 65 76 65 6e 20 77 68 65 6e 0a 2a  By() even when.*
1ec50 2a 20 74 68 65 72 65 20 61 72 65 20 43 4f 4c 4c  * there are COLL
1ec60 41 54 45 20 74 65 72 6d 73 20 69 6e 20 74 68 65  ATE terms in the
1ec70 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f 0a 73 74   ORDER BY..*/.st
1ec80 61 74 69 63 20 69 6e 74 20 63 6f 6e 76 65 72 74  atic int convert
1ec90 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
1eca0 53 75 62 71 75 65 72 79 28 57 61 6c 6b 65 72 20  Subquery(Walker 
1ecb0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
1ecc0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
1ecd0 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
1ece0 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a 20 20 73   Select *pX;.  s
1ecf0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74  qlite3 *db;.  st
1ed00 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
1ed10 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c 69 73 74  em *a;.  SrcList
1ed20 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20 50 61 72   *pNewSrc;.  Par
1ed30 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 54 6f  se *pParse;.  To
1ed40 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20 20 69 66  ken dummy;..  if
1ed50 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
1ed60 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1ed70 69 6e 75 65 3b 0a 20 20 69 66 28 20 70 2d 3e 70  inue;.  if( p->p
1ed80 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
1ed90 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1eda0 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b 20 70 58  ;.  for(pX=p; pX
1edb0 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   && (pX->op==TK_
1edc0 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  ALL || pX->op==T
1edd0 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58 3d 70 58  K_SELECT); pX=pX
1ede0 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20 20 69 66  ->pPrior){}.  if
1edf0 28 20 70 58 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( pX==0 ) return
1ee00 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20   WRC_Continue;. 
1ee10 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79   a = p->pOrderBy
1ee20 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e  ->a;.  for(i=p->
1ee30 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2d  pOrderBy->nExpr-
1ee40 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
1ee50 20 20 20 69 66 28 20 61 5b 69 5d 2e 70 45 78 70     if( a[i].pExp
1ee60 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 43 6f  r->flags & EP_Co
1ee70 6c 6c 61 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  llate ) break;. 
1ee80 20 7d 0a 20 20 69 66 28 20 69 3c 30 20 29 20 72   }.  if( i<0 ) r
1ee90 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
1eea0 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  ue;..  /* If we 
1eeb0 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
1eec0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65  , that means the
1eed0 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20   transformation 
1eee0 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  is required. */.
1eef0 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
1ef00 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
1ef10 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1ef20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1ef30 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1ef40 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
1ef50 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1ef60 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
1ef70 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  rt;.  memset(&du
1ef80 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  mmy, 0, sizeof(d
1ef90 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65 77 53 72  ummy));.  pNewSr
1efa0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1efb0 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
1efc0 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 64  (pParse,0,0,0,&d
1efd0 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30 29 3b 0a  ummy,pNew,0,0);.
1efe0 20 20 69 66 28 20 70 4e 65 77 53 72 63 3d 3d 30    if( pNewSrc==0
1eff0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1f000 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20 3d 20 2a  ort;.  *pNew = *
1f010 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20 3d 20 70  p;.  p->pSrc = p
1f020 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e 70 45 4c  NewSrc;.  p->pEL
1f030 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
1f040 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
1f050 73 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78  se, 0, sqlite3Ex
1f060 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30  pr(db, TK_ALL, 0
1f070 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d 20 54 4b  ));.  p->op = TK
1f080 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d 3e 70 57  _SELECT;.  p->pW
1f090 68 65 72 65 20 3d 20 30 3b 0a 20 20 70 4e 65 77  here = 0;.  pNew
1f0a0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 30 3b 0a  ->pGroupBy = 0;.
1f0b0 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
1f0c0 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  = 0;.  pNew->pOr
1f0d0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 70 2d 3e  derBy = 0;.  p->
1f0e0 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 70 4e  pPrior = 0;.  pN
1f0f0 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a  ew->pLimit = 0;.
1f100 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
1f110 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57 52  = 0;.  return WR
1f120 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23  C_Continue;.}..#
1f130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f140 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67  IT_CTE./*.** Arg
1f150 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77 68 69  ument pWith (whi
1f160 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  ch may be NULL) 
1f170 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b  points to a link
1f180 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73 74 65  ed list of neste
1f190 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65  d .** WITH conte
1f1a0 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20  xts, from inner 
1f1b0 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66  to outermost. If
1f1c0 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74   the table ident
1f1d0 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f  ified by .** FRO
1f1e0 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
1f1f0 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c 6c 79   pItem is really
1f200 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d   a common-table-
1f210 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54 45 29  expression (CTE)
1f220 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e   .** then return
1f230 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1f240 65 20 43 54 45 20 64 65 66 69 6e 69 74 69 6f 6e  e CTE definition
1f250 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c 65 2e   for that table.
1f260 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 72 65   Otherwise.** re
1f270 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
1f280 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76   If a non-NULL v
1f290 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64  alue is returned
1f2a0 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65 78 74  , set *ppContext
1f2b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
1f2c0 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20   With.** object 
1f2d0 74 68 61 74 20 74 68 65 20 72 65 74 75 72 6e 65  that the returne
1f2e0 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f  d CTE belongs to
1f2f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
1f300 63 74 20 43 74 65 20 2a 73 65 61 72 63 68 57 69  ct Cte *searchWi
1f310 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57 69 74  th(.  With *pWit
1f320 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
1f330 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1f340 20 6f 75 74 65 72 6d 6f 73 74 20 57 49 54 48 20   outermost WITH 
1f350 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1f360 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1f370 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46  *pItem,     /* F
1f380 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
1f390 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f  nt to resolve */
1f3a0 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74  .  With **ppCont
1f3b0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
1f3c0 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20     /* OUT: WITH 
1f3d0 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20 76 61  clause return va
1f3e0 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  lue belongs to *
1f3f0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
1f400 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
1f410 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1f420 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20  ==0 && (zName = 
1f430 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30  pItem->zName)!=0
1f440 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a 70 3b   ){.    With *p;
1f450 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69 74 68  .    for(p=pWith
1f460 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72  ; p; p=p->pOuter
1f470 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
1f480 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1f490 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a  <p->nCte; i++){.
1f4a0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
1f4b0 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65  te3StrICmp(zName
1f4c0 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  , p->a[i].zName)
1f4d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1f4e0 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b   *ppContext = p;
1f4f0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1f500 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  n &p->a[i];.    
1f510 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f520 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1f530 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f   0;.}../* The co
1f540 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d 61 69  de generator mai
1f550 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b 20 6f  ntains a stack o
1f560 66 20 61 63 74 69 76 65 20 57 49 54 48 20 63 6c  f active WITH cl
1f570 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20 74 68  auses.** with th
1f580 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54  e inner-most WIT
1f590 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67 20 61  H clause being a
1f5a0 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  t the top of the
1f5b0 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
1f5c0 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73 68 65  is routine pushe
1f5d0 73 20 74 68 65 20 57 49 54 48 20 63 6c 61 75 73  s the WITH claus
1f5e0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1f5f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
1f600 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20  ** onto the top 
1f610 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20 49 66  of the stack. If
1f620 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65 65 20   argument bFree 
1f630 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1f640 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  is.** WITH claus
1f650 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  e will never be 
1f660 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20  popped from the 
1f670 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  stack. In this c
1f680 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64  ase it.** should
1f690 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20   be freed along 
1f6a0 77 69 74 68 20 74 68 65 20 50 61 72 73 65 20 6f  with the Parse o
1f6b0 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65 72 20  bject. In other 
1f6c0 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62  cases, when.** b
1f6d0 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57 69 74  Free==0, the Wit
1f6e0 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65  h object will be
1f6f0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
1f700 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a  h the SELECT .**
1f710 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
1f720 77 68 69 63 68 20 69 74 20 69 73 20 61 73 73 6f  which it is asso
1f730 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ciated..*/.void 
1f740 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
1f750 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 57  Parse *pParse, W
1f760 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38 20 62  ith *pWith, u8 b
1f770 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Free){.  assert(
1f780 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61   bFree==0 || pPa
1f790 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b  rse->pWith==0 );
1f7a0 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
1f7b0 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65      pWith->pOute
1f7c0 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  r = pParse->pWit
1f7d0 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
1f7e0 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
1f7f0 20 20 70 50 61 72 73 65 2d 3e 62 46 72 65 65 57    pParse->bFreeW
1f800 69 74 68 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d  ith = bFree;.  }
1f810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1f820 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20 69  unction checks i
1f830 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d  f argument pFrom
1f840 20 72 65 66 65 72 73 20 74 6f 20 61 20 43 54 45   refers to a CTE
1f850 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a   declared by .**
1f860 20 61 20 57 49 54 48 20 63 6c 61 75 73 65 20 6f   a WITH clause o
1f870 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75 72 72  n the stack curr
1f880 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64  ently maintained
1f890 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2e 20   by the parser. 
1f8a0 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65  And,.** if curre
1f8b0 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e 67 20  ntly processing 
1f8c0 61 20 43 54 45 20 65 78 70 72 65 73 73 69 6f 6e  a CTE expression
1f8d0 2c 20 69 66 20 69 74 20 69 73 20 61 20 72 65 63  , if it is a rec
1f8e0 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65 72 65  ursive.** refere
1f8f0 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72 72 65  nce to the curre
1f900 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66  nt CTE..**.** If
1f910 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74   pFrom falls int
1f920 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  o either of the 
1f930 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73 20 61  two categories a
1f940 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61  bove, pFrom->pTa
1f950 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  b.** and other f
1f960 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75 6c 61  ields are popula
1f970 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
1f980 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
1f990 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72  ld check.** (pFr
1f9a0 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74 6f 20  om->pTab!=0) to 
1f9b0 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  determine whethe
1f9c0 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63 63 65  r or not a succe
1f9d0 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77  ssful match.** w
1f9e0 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  as found..**.** 
1f9f0 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61  Whether or not a
1fa00 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
1fa10 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1fa20 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
1fa30 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66  or.** occurs. If
1fa40 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
1fa50 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d  ccur, an error m
1fa60 65 73 73 61 67 65 20 69 73 20 73 74 6f 72 65 64  essage is stored
1fa70 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72 73 65   in the.** parse
1fa80 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72  r and some error
1fa90 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68 61 6e   code other than
1faa0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1fab0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1fac0 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28 0a 20  nt withExpand(. 
1fad0 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72   Walker *pWalker
1fae0 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
1faf0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a  ist_item *pFrom.
1fb00 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
1fb10 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
1fb20 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  arse;.  sqlite3 
1fb30 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1fb40 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65 20 2a  ;.  struct Cte *
1fb50 70 43 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  pCte;           
1fb60 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64 20 43      /* Matched C
1fb70 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  TE (or NULL if n
1fb80 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20 57 69  o match) */.  Wi
1fb90 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20 20 20  th *pWith;      
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fbb0 20 57 49 54 48 20 63 6c 61 75 73 65 20 74 68 61   WITH clause tha
1fbc0 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73 20 74  t pCte belongs t
1fbd0 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  o */..  assert( 
1fbe0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
1fbf0 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65 61 72  ;..  pCte = sear
1fc00 63 68 57 69 74 68 28 70 50 61 72 73 65 2d 3e 70  chWith(pParse->p
1fc10 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57  With, pFrom, &pW
1fc20 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43 74 65  ith);.  if( pCte
1fc30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
1fc40 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c 69 73  Tab;.    ExprLis
1fc50 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
1fc60 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20  elect *pSel;.   
1fc70 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20   Select *pLeft; 
1fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fc90 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  * Left-most SELE
1fca0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
1fcb0 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65 63 75      int bMayRecu
1fcc0 72 73 69 76 65 3b 20 20 20 20 20 20 20 20 20 20  rsive;          
1fcd0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 6f 6d    /* True if com
1fce0 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20  pound joined by 
1fcf0 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20  UNION [ALL] */. 
1fd00 20 20 20 57 69 74 68 20 2a 70 53 61 76 65 64 57     With *pSavedW
1fd10 69 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ith;            
1fd20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
1fd30 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 57 69  e of pParse->pWi
1fd40 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  th */..    /* If
1fd50 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73 20 6e   pCte->zErr is n
1fd60 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69 73 20  on-NULL at this 
1fd70 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
1fd80 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20   is an illegal. 
1fd90 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20     ** recursive 
1fda0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43 54 45  reference to CTE
1fdb0 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61 6e 20   pCte. Leave an 
1fdc0 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 20  error in pParse 
1fdd0 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a  and return.    *
1fde0 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43 74 65  * early. If pCte
1fdf0 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20  ->zErr is NULL, 
1fe00 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e 6f 74  then this is not
1fe10 20 61 20 72 65 63 75 72 73 69 76 65 20 72 65 66   a recursive ref
1fe20 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49  erence..    ** I
1fe30 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70 72 6f  n this case, pro
1fe40 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ceed.  */.    if
1fe50 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29 7b 0a  ( pCte->zErr ){.
1fe60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1fe70 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 70 43  orMsg(pParse, pC
1fe80 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65 2d 3e  te->zErr, pCte->
1fe90 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
1fea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1feb0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  R;.    }..    as
1fec0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61  sert( pFrom->pTa
1fed0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f  b==0 );.    pFro
1fee0 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d  m->pTab = pTab =
1fef0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1ff00 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1ff10 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28  Table));.    if(
1ff20 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
1ff30 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
1ff40 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b   pTab->nRef = 1;
1ff50 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  .    pTab->zName
1ff60 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
1ff70 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  up(db, pCte->zNa
1ff80 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69  me);.    pTab->i
1ff90 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70  PKey = -1;.    p
1ffa0 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31  Tab->nRowEst = 1
1ffb0 30 34 38 35 37 36 3b 0a 20 20 20 20 70 54 61 62  048576;.    pTab
1ffc0 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
1ffd0 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  _Ephemeral;.    
1ffe0 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d  pFrom->pSelect =
1fff0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
20000 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  p(db, pCte->pSel
20010 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ect, 0);.    if(
20020 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
20030 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  d ) return SQLIT
20040 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73  E_NOMEM;.    ass
20050 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ert( pFrom->pSel
20060 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ect );..    /* C
20070 68 65 63 6b 20 69 66 20 74 68 69 73 20 69 73 20  heck if this is 
20080 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
20090 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d 20 70   */.    pSel = p
200a0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  From->pSelect;. 
200b0 20 20 20 62 4d 61 79 52 65 63 75 72 73 69 76 65     bMayRecursive
200c0 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54   = ( pSel->op==T
200d0 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f  K_ALL || pSel->o
200e0 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20  p==TK_UNION );. 
200f0 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
20100 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  sive ){.      in
20110 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63 4c 69  t i;.      SrcLi
20120 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d  st *pSrc = pFrom
20130 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  ->pSelect->pSrc;
20140 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
20150 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  i<pSrc->nSrc; i+
20160 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75  +){.        stru
20170 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
20180 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  *pItem = &pSrc->
20190 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  a[i];.        if
201a0 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
201b0 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  se==0 .         
201c0 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21  && pItem->zName!
201d0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
201e0 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
201f0 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20  p(pItem->zName, 
20200 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20  pCte->zName).   
20210 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
20220 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 20      pItem->pTab 
20230 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
20240 20 20 70 49 74 65 6d 2d 3e 69 73 52 65 63 75 72    pItem->isRecur
20250 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  sive = 1;.      
20260 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
20270 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 6c  ;.          pSel
20280 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
20290 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  _Recursive;.    
202a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
202b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79    }..    /* Only
202c0 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65 20 72   one recursive r
202d0 65 66 65 72 65 6e 63 65 20 69 73 20 70 65 72 6d  eference is perm
202e0 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69  itted. */ .    i
202f0 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20  f( pTab->nRef>2 
20300 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20310 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20 20 20  ErrorMsg(.      
20320 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d 75 6c      pParse, "mul
20330 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
20340 20 74 6f 20 72 65 63 75 72 73 69 76 65 20 74 61   to recursive ta
20350 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e  ble: %s", pCte->
20360 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
20370 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20380 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
20390 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
203a0 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70  ->nRef==1 || ((p
203b0 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46  Sel->selFlags&SF
203c0 5f 52 65 63 75 72 73 69 76 65 29 20 26 26 20 70  _Recursive) && p
203d0 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b  Tab->nRef==2 ));
203e0 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72  ..    pCte->zErr
203f0 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72 65 66   = "circular ref
20400 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20  erence: %s";.   
20410 20 70 53 61 76 65 64 57 69 74 68 20 3d 20 70 50   pSavedWith = pP
20420 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20  arse->pWith;.   
20430 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
20440 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71 6c 69   pWith;.    sqli
20450 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
20460 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63 75 72  alker, bMayRecur
20470 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70 50 72  sive ? pSel->pPr
20480 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 0a 20 20  ior : pSel);..  
20490 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c    for(pLeft=pSel
204a0 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b  ; pLeft->pPrior;
204b0 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50   pLeft=pLeft->pP
204c0 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c 69 73  rior);.    pELis
204d0 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73  t = pLeft->pELis
204e0 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74 65 2d  t;.    if( pCte-
204f0 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20  >pCols ){.      
20500 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  if( pEList->nExp
20510 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e  r!=pCte->pCols->
20520 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
20530 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
20540 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
20550 25 73 20 68 61 73 20 25 64 20 76 61 6c 75 65 73  %s has %d values
20560 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22   for %d columns"
20570 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ,.            pC
20580 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73  te->zName, pELis
20590 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e  t->nExpr, pCte->
205a0 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20  pCols->nExpr.   
205b0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
205c0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20  pParse->pWith = 
205d0 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 20 20  pSavedWith;.    
205e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
205f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
20600 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
20610 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20  pCte->pCols;.   
20620 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74 43 6f   }..    selectCo
20630 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
20640 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  t(pParse, pEList
20650 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26  , &pTab->nCol, &
20660 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20  pTab->aCol);.   
20670 20 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69   if( bMayRecursi
20680 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ve ){.      if( 
20690 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSel->selFlags &
206a0 20 53 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b   SF_Recursive ){
206b0 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a  .        pCte->z
206c0 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20  Err = "multiple 
206d0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
206e0 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20 20 20  nces: %s";.     
206f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20700 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65  pCte->zErr = "re
20710 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
20720 65 20 69 6e 20 61 20 73 75 62 71 75 65 72 79 3a  e in a subquery:
20730 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20   %s";.      }.  
20740 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
20750 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
20760 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sel);.    }.    
20770 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a  pCte->zErr = 0;.
20780 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
20790 68 20 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a  h = pSavedWith;.
207a0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
207b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
207c0 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
207d0 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
207e0 20 49 66 20 74 68 65 20 53 45 4c 45 43 54 20 70   If the SELECT p
207f0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
20800 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68 61 73  ond argument has
20810 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 57   an associated W
20820 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20  ITH .** clause, 
20830 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68 65 20  pop it from the 
20840 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61 73 20  stack stored as 
20850 70 61 72 74 20 6f 66 20 74 68 65 20 50 61 72 73  part of the Pars
20860 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  e object..**.** 
20870 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
20880 20 75 73 65 64 20 61 73 20 74 68 65 20 78 53 65   used as the xSe
20890 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28 29 20  lectCallback2() 
208a0 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73  callback by.** s
208b0 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
208c0 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e  nd() when walkin
208d0 67 20 61 20 53 45 4c 45 43 54 20 74 72 65 65 20  g a SELECT tree 
208e0 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  to resolve table
208f0 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74  .** names and ot
20900 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  her FROM clause 
20910 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74  elements. .*/.st
20920 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65 63 74  atic void select
20930 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72 20 2a  PopWith(Walker *
20940 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
20950 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
20960 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
20970 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70 2d  pParse;.  if( p-
20980 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61 73  >pWith ){.    as
20990 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 57  sert( pParse->pW
209a0 69 74 68 3d 3d 70 2d 3e 70 57 69 74 68 20 29 3b  ith==p->pWith );
209b0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69  .    pParse->pWi
209c0 74 68 20 3d 20 70 2d 3e 70 57 69 74 68 2d 3e 70  th = p->pWith->p
209d0 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  Outer;.  }.}.#el
209e0 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
209f0 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
20a00 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
20a10 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
20a20 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
20a30 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
20a40 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
20a50 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
20a60 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
20a70 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
20a80 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
20a90 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
20aa0 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
20ab0 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
20ac0 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
20ad0 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
20ae0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
20af0 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
20b00 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
20b10 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
20b20 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
20b30 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
20b40 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
20b50 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
20b60 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
20b70 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
20b80 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
20b90 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
20ba0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
20bb0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20bc0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
20bd0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
20be0 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
20bf0 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
20c00 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
20c10 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
20c20 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
20c30 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
20c40 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
20c50 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
20c60 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
20c70 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
20c80 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
20c90 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
20ca0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
20cb0 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
20cc0 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
20cd0 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
20ce0 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
20cf0 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
20d00 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
20d10 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
20d20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
20d30 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
20d40 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
20d50 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
20d60 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
20d70 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
20d80 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
20d90 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
20da0 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
20db0 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
20dc0 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
20dd0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
20de0 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
20df0 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
20e00 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
20e10 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
20e20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
20e30 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
20e40 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
20e50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
20e60 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
20e70 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
20e80 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
20e90 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
20ea0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
20eb0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
20ec0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
20ed0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
20ee0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
20ef0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
20f00 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
20f10 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
20f20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67   Expr *pE, *pRig
20f30 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31  ht, *pExpr;.  u1
20f40 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  6 selFlags = p->
20f50 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e  selFlags;..  p->
20f60 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
20f70 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64  xpanded;.  if( d
20f80 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
20f90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
20fa0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
20fb0 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72  if( NEVER(p->pSr
20fc0 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61  c==0) || (selFla
20fd0 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
20fe0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
20ff0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
21000 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
21010 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
21020 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
21030 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
21040 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69 74 68  pParse, p->pWith
21050 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  , 0);..  /* Make
21060 20 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d   sure cursor num
21070 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
21080 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65  ssigned to all e
21090 6e 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74  ntries in.  ** t
210a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
210b0 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
210c0 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73  tement..  */.  s
210d0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
210e0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
210f0 65 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20  e, pTabList);.. 
21100 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72   /* Look up ever
21110 79 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e  y table named in
21120 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
21130 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20   of the select. 
21140 20 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72   If.  ** an entr
21150 79 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  y of the FROM cl
21160 61 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65  ause is a subque
21170 72 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  ry instead of a 
21180 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20  table or view,. 
21190 20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20   ** then create 
211a0 61 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c  a transient tabl
211b0 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64  e structure to d
211c0 65 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71  escribe the subq
211d0 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  uery..  */.  for
211e0 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62  (i=0, pFrom=pTab
211f0 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  List->a; i<pTabL
21200 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
21210 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61  pFrom++){.    Ta
21220 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61  ble *pTab;.    a
21230 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73  ssert( pFrom->is
21240 52 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20  Recursive==0 || 
21250 70 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20  pFrom->pTab );. 
21260 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73     if( pFrom->is
21270 52 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74  Recursive ) cont
21280 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46  inue;.    if( pF
21290 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a  rom->pTab!=0 ){.
212a0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74        /* This st
212b0 61 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65  atement has alre
212c0 61 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65  ady been prepare
212d0 64 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  d.  There is no 
212e0 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  need.      ** to
212f0 20 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a   go further. */.
21300 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d        assert( i=
21310 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
21320 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20  LITE_OMIT_CTE.  
21330 20 20 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74      selectPopWit
21340 68 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23  h(pWalker, p);.#
21350 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
21360 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
21370 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
21380 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20  TE_OMIT_CTE.    
21390 69 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70  if( withExpand(p
213a0 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29  Walker, pFrom) )
213b0 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
213c0 74 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  t;.    if( pFrom
213d0 2d 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65  ->pTab ) {} else
213e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
213f0 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20  pFrom->zName==0 
21400 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
21410 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
21420 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
21430 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
21440 65 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  ect;.      /* A 
21450 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
21460 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
21470 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
21480 20 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d    assert( pSel!=
21490 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
214a0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
214b0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
214c0 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61  e3WalkSelect(pWa
214d0 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20  lker, pSel);.   
214e0 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
214f0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44   pTab = sqlite3D
21500 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
21510 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
21520 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
21530 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  0 ) return WRC_A
21540 62 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62  bort;.      pTab
21550 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
21560 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
21570 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
21580 62 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70  b, "sqlite_sq_%p
21590 22 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b  ", (void*)pTab);
215a0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53  .      while( pS
215b0 65 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53  el->pPrior ){ pS
215c0 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
215d0 72 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63  r; }.      selec
215e0 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
215f0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
21600 6c 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  l->pEList, &pTab
21610 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
21620 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Col);.      pTab
21630 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
21640 20 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73      pTab->nRowEs
21650 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 20  t = 1048576;.   
21660 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
21670 73 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61  s |= TF_Ephemera
21680 6c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  l;.#endif.    }e
21690 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
216a0 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
216b0 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20  or view name in 
216c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
216d0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
216e0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20   pFrom->pTab==0 
216f0 29 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e  );.      pFrom->
21700 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
21710 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
21720 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
21730 70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66  pFrom);.      if
21740 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75  ( pTab==0 ) retu
21750 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
21760 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52      if( pTab->nR
21770 65 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20  ef==0xffff ){.  
21780 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
21790 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
217a0 6f 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63  oo many referenc
217b0 65 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61  es to \"%s\": ma
217c0 78 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20  x 65535",.      
217d0 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
217e0 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d  );.        pFrom
217f0 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
21800 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
21810 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
21820 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b      pTab->nRef++
21830 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
21840 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
21850 20 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51   || !defined (SQ
21860 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
21870 4c 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66  LTABLE).      if
21880 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
21890 7c 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  || IsVirtual(pTa
218a0 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  b) ){.        /*
218b0 20 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69   We reach here i
218c0 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
218d0 65 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20  e is a really a 
218e0 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20  view */.        
218f0 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
21900 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
21910 61 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65  arse, pTab) ) re
21920 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
21930 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
21940 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d  pFrom->pSelect==
21950 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72  0 );.        pFr
21960 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
21970 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
21980 62 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  b, pTab->pSelect
21990 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
219a0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
219b0 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e  pWalker, pFrom->
219c0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
219d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
219e0 20 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68      /* Locate th
219f0 65 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79  e index named by
21a00 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
21a10 63 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20  clause, if any. 
21a20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
21a30 65 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75  e3IndexedByLooku
21a40 70 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29  p(pParse, pFrom)
21a50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21a60 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
21a70 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63  }.  }..  /* Proc
21a80 65 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  ess NATURAL keyw
21a90 6f 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64  ords, and ON and
21aa0 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f   USING clauses o
21ab0 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  f joins..  */.  
21ac0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
21ad0 69 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72  iled || sqlitePr
21ae0 6f 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65  ocessJoin(pParse
21af0 2c 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , p) ){.    retu
21b00 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
21b10 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  }..  /* For ever
21b20 79 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72  y "*" that occur
21b30 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s in the column 
21b40 6c 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65  list, insert the
21b50 20 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61   names of.  ** a
21b60 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c  ll columns in al
21b70 6c 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66  l tables.  And f
21b80 6f 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a  or every TABLE.*
21b90 20 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65   insert the name
21ba0 73 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f  s.  ** of all co
21bb0 6c 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20  lumns in TABLE. 
21bc0 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65   The parser inse
21bd0 72 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65  rted a special e
21be0 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77  xpression.  ** w
21bf0 69 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f  ith the TK_ALL o
21c00 70 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68  perator for each
21c10 20 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75   "*" that it fou
21c20 6e 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e  nd in the column
21c30 20 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20   list..  ** The 
21c40 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a  following code j
21c50 75 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74  ust has to locat
21c60 65 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70  e the TK_ALL exp
21c70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70  ressions and exp
21c80 61 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e  and.  ** each on
21c90 65 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  e to the list of
21ca0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   all columns in 
21cb0 61 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  all tables..  **
21cc0 0a 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20  .  ** The first 
21cd0 6c 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73  loop just checks
21ce0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
21cf0 20 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65   are any "*" ope
21d00 72 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74  rators.  ** that
21d10 20 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e   need expanding.
21d20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b  .  */.  for(k=0;
21d30 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   k<pEList->nExpr
21d40 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d  ; k++){.    pE =
21d50 20 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45   pEList->a[k].pE
21d60 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d  xpr;.    if( pE-
21d70 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
21d80 65 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  eak;.    assert(
21d90 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20   pE->op!=TK_DOT 
21da0 7c 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30  || pE->pRight!=0
21db0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21dc0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
21dd0 7c 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  | (pE->pLeft!=0 
21de0 26 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70  && pE->pLeft->op
21df0 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20  ==TK_ID) );.    
21e00 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44  if( pE->op==TK_D
21e10 4f 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74  OT && pE->pRight
21e20 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62  ->op==TK_ALL ) b
21e30 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
21e40 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  k<pEList->nExpr 
21e50 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
21e60 20 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20   If we get here 
21e70 69 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73  it means the res
21e80 75 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73  ult set contains
21e90 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22   one or more "*"
21ea0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72  .    ** operator
21eb0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
21ec0 65 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f  e expanded.  Loo
21ed0 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
21ee0 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
21ef0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
21f00 65 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68  et and expand th
21f10 65 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  em one by one.. 
21f20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74     */.    struct
21f30 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
21f40 61 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  a = pEList->a;. 
21f50 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65     ExprList *pNe
21f60 77 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66  w = 0;.    int f
21f70 6c 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64  lags = pParse->d
21f80 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e  b->flags;.    in
21f90 74 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66  t longNames = (f
21fa0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
21fb0 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20  llColNames)!=0. 
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fd0 20 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26       && (flags &
21fe0 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
21ff0 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20  Names)==0;..    
22000 2f 2a 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69  /* When processi
22010 6e 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ng FROM-clause s
22020 75 62 71 75 65 72 69 65 73 2c 20 69 74 20 69 73  ubqueries, it is
22030 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
22040 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 66 75 6c  .    ** that ful
22050 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f  l_column_names=O
22060 46 46 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c  FF and short_col
22070 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54  umn_names=ON.  T
22080 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  he.    ** sqlite
22090 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
220a0 63 74 28 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b  ct() routine mak
220b0 65 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20  es it so. */.   
220c0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
220d0 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65  Flags & SF_Neste
220e0 64 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20  dFrom)==0.      
220f0 20 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 20 26      || ((flags &
22100 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
22110 61 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20 20 20  ames)==0 &&.    
22120 20 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73            (flags
22130 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43   & SQLITE_ShortC
22140 6f 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a  olNames)!=0) );.
22150 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c  .    for(k=0; k<
22160 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b  pEList->nExpr; k
22170 2b 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20  ++){.      pE = 
22180 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[k].pExpr;.    
22190 20 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70    pRight = pE->p
221a0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73  Right;.      ass
221b0 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
221c0 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30  DOT || pRight!=0
221d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45   );.      if( pE
221e0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20  ->op!=TK_ALL && 
221f0 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20  (pE->op!=TK_DOT 
22200 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54  || pRight->op!=T
22210 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  K_ALL) ){.      
22220 20 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63    /* This partic
22230 75 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ular expression 
22240 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
22250 20 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20   be expanded..  
22260 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
22270 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
22280 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
22290 61 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d  arse, pNew, a[k]
222a0 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
222b0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
222c0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70         pNew->a[p
222d0 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e  New->nExpr-1].zN
222e0 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65  ame = a[k].zName
222f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
22300 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d  ->a[pNew->nExpr-
22310 31 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e  1].zSpan = a[k].
22320 7a 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20  zSpan;.         
22330 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b   a[k].zName = 0;
22340 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
22350 7a 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20  zSpan = 0;.     
22360 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b     }.        a[k
22370 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  ].pExpr = 0;.   
22380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22390 20 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73    /* This expres
223a0 73 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72  sion is a "*" or
223b0 20 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64   a "TABLE.*" and
223c0 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
223d0 20 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64       ** expanded
223e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
223f0 20 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20   tableSeen = 0; 
22400 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
22410 20 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63   when TABLE matc
22420 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  hes */.        c
22430 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b  har *zTName = 0;
22440 20 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f         /* text o
22450 66 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20  f name of TABLE 
22460 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
22470 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  E->op==TK_DOT ){
22480 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22490 74 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20  t( pE->pLeft!=0 
224a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
224b0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
224c0 70 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c  perty(pE->pLeft,
224d0 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
224e0 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d  .          zTNam
224f0 65 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75  e = pE->pLeft->u
22500 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
22510 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
22520 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
22530 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
22540 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
22550 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
22560 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
22570 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
22580 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
22590 53 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sub = pFrom->pSe
225a0 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20  lect;.          
225b0 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
225c0 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pFrom->zAlias;.
225d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
225e0 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d  char *zSchemaNam
225f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
22600 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
22610 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
22620 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22630 20 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54     zTabName = pT
22640 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
22650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22660 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
22670 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
22680 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75           if( pSu
22690 62 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73  b==0 || (pSub->s
226a0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73  elFlags & SF_Nes
226b0 74 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20  tedFrom)==0 ){. 
226c0 20 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20             pSub 
226d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
226e0 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73   if( zTName && s
226f0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
22700 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21  Name, zTabName)!
22710 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
22720 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
22730 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22740 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71          iDb = sq
22750 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
22760 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
22770 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20  hema);.         
22780 20 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d     zSchemaName =
22790 20 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44   iDb>=0 ? db->aD
227a0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22  b[iDb].zName : "
227b0 2a 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  *";.          }.
227c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
227d0 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  0; j<pTab->nCol;
227e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
227f0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
22800 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
22810 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
22820 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65    char *zColname
22830 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74  ;  /* The comput
22840 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ed column name *
22850 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  /.            ch
22860 61 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f  ar *zToFree;   /
22870 2a 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e  * Malloced strin
22880 67 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  g that needs to 
22890 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
228a0 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43          Token sC
228b0 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70  olname;  /* Comp
228c0 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uted column name
228d0 20 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a   as a token */..
228e0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
228f0 72 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20  rt( zName );.   
22900 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e           if( zTN
22910 61 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20  ame && pSub.    
22920 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
22930 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65  te3MatchSpanName
22940 28 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61  (pSub->pEList->a
22950 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54  [j].zSpan, 0, zT
22960 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20  Name, 0)==0.    
22970 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
22980 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
22990 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
229a0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ..            /*
229b0 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20   If a column is 
229c0 6d 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65  marked as 'hidde
229d0 6e 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e  n' (currently on
229e0 6c 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20  ly possible.    
229f0 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76          ** for v
22a00 69 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20  irtual tables), 
22a10 64 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69  do not include i
22a20 74 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65  t in the expande
22a30 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
22a40 20 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74   result-set list
22a50 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
22a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
22a70 20 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28   IsHiddenColumn(
22a80 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20  &pTab->aCol[j]) 
22a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22aa0 20 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61   assert(IsVirtua
22ab0 6c 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20  l(pTab));.      
22ac0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
22ad0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c              tabl
22af0 65 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20  eSeen = 1;..    
22b00 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
22b10 26 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a  && zTName==0 ){.
22b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22b30 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79  ( (pFrom->jointy
22b40 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29  pe & JT_NATURAL)
22b50 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  !=0.            
22b60 20 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43      && tableAndC
22b70 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c  olumnIndex(pTabL
22b80 69 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30  ist, i, zName, 0
22b90 2c 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  , 0).           
22ba0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
22bb0 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41        /* In a NA
22bc0 54 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74  TURAL join, omit
22bd0 20 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e   the join column
22be0 73 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  s from the .    
22bf0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
22c00 61 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68  able to the righ
22c10 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  t of the join */
22c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
22c40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22c50 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
22c60 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
22c70 70 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pFrom->pUsing, z
22c80 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Name)>=0 ){.    
22c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22ca0 6e 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20  n a join with a 
22cb0 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d  USING clause, om
22cc0 69 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  it columns in th
22cd0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
22ce0 20 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73    ** using claus
22cf0 65 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65  e from the table
22d00 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a   on the right. *
22d10 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
22d20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
22d30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22d40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22d50 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73        pRight = s
22d60 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
22d70 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  K_ID, zName);.  
22d80 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61            zColna
22d90 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20  me = zName;.    
22da0 20 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20          zToFree 
22db0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
22dc0 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c   if( longNames |
22dd0 7c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  | pTabList->nSrc
22de0 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
22df0 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b      Expr *pLeft;
22e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
22e10 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
22e20 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54  pr(db, TK_ID, zT
22e30 61 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  abName);.       
22e40 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
22e50 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
22e60 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
22e70 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20  t, pRight, 0);. 
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
22e90 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a   zSchemaName ){.
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
22ec0 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a  xpr(db, TK_ID, z
22ed0 53 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20  SchemaName);.   
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
22ef0 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
22f00 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
22f10 2c 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20  , pLeft, pExpr, 
22f20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
22f30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
22f40 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20    if( longNames 
22f50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22f60 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71     zColname = sq
22f70 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
22f80 20 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61   "%s.%s", zTabNa
22f90 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  me, zName);.    
22fa0 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
22fb0 72 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  ree = zColname;.
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
22fe0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
22ff0 20 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b   pExpr = pRight;
23000 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23010 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20             pNew 
23020 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
23030 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
23040 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
23050 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61            sColna
23060 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b  me.z = zColname;
23070 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f  .            sCo
23080 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65  lname.n = sqlite
23090 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61  3Strlen30(zColna
230a0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
230b0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
230c0 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
230d0 70 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c  pNew, &sColname,
230e0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
230f0 20 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d   if( pNew && (p-
23100 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
23110 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b  estedFrom)!=0 ){
23120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
23130 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
23140 74 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d  tem *pX = &pNew-
23150 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
23160 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
23170 20 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20   if( pSub ){.   
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d               pX-
23190 3e 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33  >zSpan = sqlite3
231a0 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75  DbStrDup(db, pSu
231b0 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  b->pEList->a[j].
231c0 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
231d0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
231e0 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29  ( pX->zSpan==0 )
231f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
23210 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
23220 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
23230 66 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22  f(db, "%s.%s.%s"
23240 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23260 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63               zSc
23270 68 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  hemaName, zTabNa
23280 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  me, zColname);. 
23290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
232a0 65 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70  estcase( pX->zSp
232b0 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  an==0 );.       
232c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
232d0 20 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e         pX->bSpan
232e0 49 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20  IsTab = 1;.     
232f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23300 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
23310 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b  ee(db, zToFree);
23320 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23340 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b  f( !tableSeen ){
23350 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
23360 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  TName ){.       
23370 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23380 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
23390 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22   such table: %s"
233a0 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20  , zTName);.     
233b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
233c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
233d0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
233e0 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69  "no tables speci
233f0 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  fied");.        
23400 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
23410 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23420 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
23430 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74  elete(db, pEList
23440 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74  );.    p->pEList
23450 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66   = pNew;.  }.#if
23460 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
23470 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  MN.  if( p->pELi
23480 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  st && p->pEList-
23490 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
234a0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
234b0 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
234c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
234d0 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
234e0 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c  columns in resul
234f0 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e  t set");.  }.#en
23500 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43  dif.  return WRC
23510 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
23520 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e  .** No-op routin
23530 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d  e for the parse-
23540 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a  tree walker..**.
23550 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
23560 74 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b  tine is the Walk
23570 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
23580 20 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e   then expression
23590 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61   trees.** are wa
235a0 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79  lked without any
235b0 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74   actions being t
235c0 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64  aken at each nod
235d0 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a  e.  Presumably,.
235e0 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
235f0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
23600 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c   Walker.xExprCal
23610 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57  lback then .** W
23620 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
23630 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20  lback is set to 
23640 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65  do something use
23650 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a  ful for every .*
23660 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68  * subquery in th
23670 65 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a  e parser tree..*
23680 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
23690 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72  rWalkNoop(Walker
236a0 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20   *NotUsed, Expr 
236b0 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e  *NotUsed2){.  UN
236c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28  USED_PARAMETER2(
236d0 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64  NotUsed, NotUsed
236e0 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43  2);.  return WRC
236f0 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
23700 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23710 20 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c   "expands" a SEL
23720 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
23730 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62  d all of its sub
23740 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20  queries..** For 
23750 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
23760 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69  mation on what i
23770 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61  t means to "expa
23780 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20  nd" a SELECT.** 
23790 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74  statement, see t
237a0 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68  he comment on th
237b0 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77  e selectExpand w
237c0 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61  orker callback a
237d0 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61  bove..**.** Expa
237e0 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73  nding a SELECT s
237f0 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20  tatement is the 
23800 66 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72  first step in pr
23810 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45  ocessing a.** SE
23820 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
23830 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
23840 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78  ement must be ex
23850 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a  panded before.**
23860 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
23870 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a   is performed..*
23880 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67  *.** If anything
23890 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20   goes wrong, an 
238a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
238b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50   written into pP
238c0 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c  arse..** The cal
238d0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61  ling function ca
238e0 6e 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f  n detect the pro
238f0 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  blem by looking 
23900 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a  at pParse->nErr.
23910 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65  ** and/or pParse
23920 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
23930 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
23940 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  id sqlite3Select
23950 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50  Expand(Parse *pP
23960 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53  arse, Select *pS
23970 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72  elect){.  Walker
23980 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c   w;.  memset(&w,
23990 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a   0, sizeof(w));.
239a0 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
239b0 6b 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70  k = exprWalkNoop
239c0 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
239d0 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61  Parse;.  if( pPa
239e0 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64  rse->hasCompound
239f0 20 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63   ){.    w.xSelec
23a00 74 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76  tCallback = conv
23a10 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
23a20 74 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20  tToSubquery;.   
23a30 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
23a40 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b  ct(&w, pSelect);
23a50 0a 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74  .  }.  w.xSelect
23a60 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63  Callback = selec
23a70 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78  tExpander;.  w.x
23a80 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
23a90 3d 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b  = selectPopWith;
23aa0 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
23ab0 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
23ac0 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53  );.}...#ifndef S
23ad0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
23ae0 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ERY./*.** This i
23af0 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65  s a Walker.xSele
23b00 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62  ctCallback callb
23b10 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69  ack for the sqli
23b20 74 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66  te3SelectTypeInf
23b30 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  o().** interface
23b40 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68  ..**.** For each
23b50 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
23b60 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d  query, add Colum
23b70 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75  n.zType and Colu
23b80 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f  mn.zColl.** info
23b90 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54  rmation to the T
23ba0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
23bb0 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
23bc0 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  he result set.**
23bd0 20 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72   of that subquer
23be0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62  y..**.** The Tab
23bf0 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
23c00 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65  t represents the
23c10 20 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20   result set was 
23c20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62  constructed.** b
23c30 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  y selectExpander
23c40 28 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20  () but the type 
23c50 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
23c60 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d  formation was om
23c70 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74  itted.** at that
23c80 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69   point because i
23c90 64 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e  dentifiers had n
23ca0 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f  ot yet been reso
23cb0 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72  lved.  This.** r
23cc0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
23cd0 20 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65   after identifie
23ce0 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f  r resolution..*/
23cf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
23d00 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
23d10 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70  peInfo(Walker *p
23d20 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
23d30 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  p){.  Parse *pPa
23d40 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rse;.  int i;.  
23d50 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
23d60 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
23d70 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
23d80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ..  assert( p->s
23d90 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
23da0 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28  olved );.  if( (
23db0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
23dc0 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30  _HasTypeInfo)==0
23dd0 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
23de0 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70  ags |= SF_HasTyp
23df0 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73  eInfo;.    pPars
23e00 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
23e10 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73  rse;.    pTabLis
23e20 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
23e30 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
23e40 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
23e50 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
23e60 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
23e70 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
23e80 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20  = pFrom->pTab;. 
23e90 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
23ea0 70 54 61 62 21 3d 30 29 20 26 26 20 28 70 54 61  pTab!=0) && (pTa
23eb0 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
23ec0 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29  _Ephemeral)!=0 )
23ed0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73  {.        /* A s
23ee0 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
23ef0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
23f00 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
23f10 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
23f20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
23f30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
23f40 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  el ){.          
23f50 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72  while( pSel->pPr
23f60 69 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65  ior ) pSel = pSe
23f70 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  l->pPrior;.     
23f80 20 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f       selectAddCo
23f90 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
23fa0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
23fb0 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20  b, pSel);.      
23fc0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23fd0 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
23fe0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
23ff0 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70  ine adds datatyp
24000 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  e and collating 
24010 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61  sequence informa
24020 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54  tion to.** the T
24030 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  able structures 
24040 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  of all FROM-clau
24050 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  se subqueries in
24060 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
24070 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73  tement..**.** Us
24080 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  e this routine a
24090 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
240a0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
240b0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
240c0 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61  ctAddTypeInfo(Pa
240d0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
240e0 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23  ect *pSelect){.#
240f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24100 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61  IT_SUBQUERY.  Wa
24110 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
24120 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
24130 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ));.  w.xSelectC
24140 61 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63  allback2 = selec
24150 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65  tAddSubqueryType
24160 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43  Info;.  w.xExprC
24170 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61  allback = exprWa
24180 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
24190 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
241a0 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
241b0 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23  (&w, pSelect);.#
241c0 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
241d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
241e0 73 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74  s up a SELECT st
241f0 61 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63  atement for proc
24200 65 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20  essing.  The.** 
24210 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63  following is acc
24220 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a  omplished:.**.**
24230 20 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72       *  VDBE Cur
24240 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20  sor numbers are 
24250 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20  assigned to all 
24260 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d  FROM-clause term
24270 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68  s..**     *  Eph
24280 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a  emeral Table obj
24290 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64  ects are created
242a0 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c   for all FROM-cl
242b0 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e  ause subqueries.
242c0 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e  .**     *  ON an
242d0 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20  d USING clauses 
242e0 61 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f  are shifted into
242f0 20 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74   WHERE statement
24300 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64  s.**     *  Wild
24310 63 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54  cards "*" and "T
24320 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c  ABLE.*" in resul
24330 74 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e  t sets are expan
24340 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49  ded..**     *  I
24350 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78  dentifiers in ex
24360 70 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74  pression are mat
24370 63 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a  ched to tables..
24380 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
24390 6e 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76  ne acts recursiv
243a0 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75  ely on all subqu
243b0 65 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65  eries within the
243c0 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
243d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
243e0 65 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ep(.  Parse *pPa
243f0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
24400 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
24410 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
24420 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
24430 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
24440 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
24450 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ed. */.  NameCon
24460 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20  text *pOuterNC  
24470 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
24480 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f  for container */
24490 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
244a0 62 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  b;.  if( NEVER(p
244b0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
244c0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
244d0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
244e0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
244f0 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  n;.  if( p->selF
24500 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70  lags & SF_HasTyp
24510 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a  eInfo ) return;.
24520 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45    sqlite3SelectE
24530 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29  xpand(pParse, p)
24540 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
24550 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
24560 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
24570 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  n;.  sqlite3Reso
24580 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70  lveSelectNames(p
24590 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72  Parse, p, pOuter
245a0 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73  NC);.  if( pPars
245b0 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
245c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
245d0 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53  turn;.  sqlite3S
245e0 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
245f0 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a  (pParse, p);.}..
24600 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
24610 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
24620 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lator..**.** The
24630 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
24640 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20  ulator is a set 
24650 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  of memory cells 
24660 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74  that hold.** int
24670 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
24680 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74  s while calculat
24690 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65  ing an aggregate
246a0 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
246b0 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
246c0 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55  e that stores NU
246d0 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  LLs in all of th
246e0 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65  ose memory.** ce
246f0 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lls..*/.static v
24700 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c  oid resetAccumul
24710 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
24720 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
24730 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
24740 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
24750 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  e;.  int i;.  st
24760 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e  ruct AggInfo_fun
24770 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20  c *pFunc;.  int 
24780 6e 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d  nReg = pAggInfo-
24790 3e 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66  >nFunc + pAggInf
247a0 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66  o->nColumn;.  if
247b0 28 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75  ( nReg==0 ) retu
247c0 72 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rn;.#ifdef SQLIT
247d0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72  E_DEBUG.  /* Ver
247e0 69 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67  ify that all Agg
247f0 49 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61  Info registers a
24800 72 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61  re within the ra
24810 6e 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79  nge specified by
24820 0a 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e  .  ** AggInfo.mn
24830 52 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52  Reg..AggInfo.mxR
24840 65 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  eg */.  assert( 
24850 6e 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e  nReg==pAggInfo->
24860 6d 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e  mxReg-pAggInfo->
24870 6d 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72  mnReg+1 );.  for
24880 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f  (i=0; i<pAggInfo
24890 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
248a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
248b0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69  gInfo->aCol[i].i
248c0 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Mem>=pAggInfo->m
248d0 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26  nReg.         &&
248e0 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
248f0 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66  i].iMem<=pAggInf
24900 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a  o->mxReg );.  }.
24910 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67    for(i=0; i<pAg
24920 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
24930 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  +){.    assert( 
24940 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  pAggInfo->aFunc[
24950 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
24960 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
24970 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
24980 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41  Func[i].iMem<=pA
24990 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b  ggInfo->mxReg );
249a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
249b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
249c0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70  v, OP_Null, 0, p
249d0 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20  AggInfo->mnReg, 
249e0 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29  pAggInfo->mxReg)
249f0 3b 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  ;.  for(pFunc=pA
24a00 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
24a10 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
24a20 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
24a30 63 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46  c++){.    if( pF
24a40 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d  unc->iDistinct>=
24a50 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  0 ){.      Expr 
24a60 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78  *pE = pFunc->pEx
24a70 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
24a80 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
24a90 74 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c  ty(pE, EP_xIsSel
24aa0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66  ect) );.      if
24ab0 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  ( pE->x.pList==0
24ac0 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d   || pE->x.pList-
24ad0 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
24ae0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
24af0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49  rMsg(pParse, "DI
24b00 53 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65  STINCT aggregate
24b10 73 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63  s must have exac
24b20 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20  tly one ".      
24b30 20 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29       "argument")
24b40 3b 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d  ;.        pFunc-
24b50 3e 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b  >iDistinct = -1;
24b60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24b70 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
24b80 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
24b90 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
24ba0 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73  arse, pE->x.pLis
24bb0 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
24bc0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
24bd0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
24be0 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69  l, pFunc->iDisti
24bf0 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  nct, 0, 0,.     
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
24c20 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
24c30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24c40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
24c50 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67 67 46  voke the OP_AggF
24c60 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66  inalize opcode f
24c70 6f 72 20 65 76 65 72 79 20 61 67 67 72 65 67 61  or every aggrega
24c80 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  te function.** i
24c90 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74  n the AggInfo st
24ca0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
24cb0 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65  ic void finalize
24cc0 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50 61 72  AggFunctions(Par
24cd0 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49  se *pParse, AggI
24ce0 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a  nfo *pAggInfo){.
24cf0 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
24d00 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
24d10 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67   i;.  struct Agg
24d20 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20  Info_func *pF;. 
24d30 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67   for(i=0, pF=pAg
24d40 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c  gInfo->aFunc; i<
24d50 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b  pAggInfo->nFunc;
24d60 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20   i++, pF++){.   
24d70 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
24d80 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e   = pF->pExpr->x.
24d90 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  pList;.    asser
24da0 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
24db0 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20 45  rty(pF->pExpr, E
24dc0 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
24dd0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24de0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 46  ddOp4(v, OP_AggF
24df0 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20  inal, pF->iMem, 
24e00 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
24e10 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20  Expr : 0, 0,.   
24e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e30 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
24e40 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
24e50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ;.  }.}../*.** U
24e60 70 64 61 74 65 20 74 68 65 20 61 63 63 75 6d 75  pdate the accumu
24e70 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c  lator memory cel
24e80 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72 65 67  ls for an aggreg
24e90 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ate based on.** 
24ea0 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
24eb0 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
24ec0 73 74 61 74 69 63 20 76 6f 69 64 20 75 70 64 61  static void upda
24ed0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 50 61  teAccumulator(Pa
24ee0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67 67  rse *pParse, Agg
24ef0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
24f00 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
24f10 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
24f20 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67 48 69  t i;.  int regHi
24f30 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 64 64  t = 0;.  int add
24f40 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a 20 20  rHitTest = 0;.  
24f50 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
24f60 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72 75 63  unc *pF;.  struc
24f70 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70  t AggInfo_col *p
24f80 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e  C;..  pAggInfo->
24f90 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
24fa0 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41    for(i=0, pF=pA
24fb0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69  ggInfo->aFunc; i
24fc0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
24fd0 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20  ; i++, pF++){.  
24fe0 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20    int nArg;.    
24ff0 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d 20 30  int addrNext = 0
25000 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41 67 67  ;.    int regAgg
25010 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
25020 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70  pList = pF->pExp
25030 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20  r->x.pList;.    
25040 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
25050 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78  Property(pF->pEx
25060 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
25070 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
25080 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41 72 67  st ){.      nArg
25090 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
250a0 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d 20  .      regAgg = 
250b0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61  sqlite3GetTempRa
250c0 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41 72 67  nge(pParse, nArg
250d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
250e0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
250f0 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
25100 72 65 67 41 67 67 2c 20 53 51 4c 49 54 45 5f 45  regAgg, SQLITE_E
25110 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65  CEL_DUP);.    }e
25120 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20  lse{.      nArg 
25130 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67  = 0;.      regAg
25140 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
25150 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e   if( pF->iDistin
25160 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ct>=0 ){.      a
25170 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65  ddrNext = sqlite
25180 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
25190 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
251a0 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20   nArg==1 );.    
251b0 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70    codeDistinct(p
251c0 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74  Parse, pF->iDist
251d0 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20  inct, addrNext, 
251e0 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20  1, regAgg);.    
251f0 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46  }.    if( pF->pF
25200 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  unc->funcFlags &
25210 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45   SQLITE_FUNC_NEE
25220 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43  DCOLL ){.      C
25230 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
25240 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  0;.      struct 
25250 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
25260 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Item;.      int 
25270 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  j;.      assert(
25280 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a   pList!=0 );  /*
25290 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70 46 2d   pList!=0 if pF-
252a0 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45 44 43  >pFunc has NEEDC
252b0 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  OLL */.      for
252c0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (j=0, pItem=pLis
252d0 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20  t->a; !pColl && 
252e0 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74  j<nArg; j++, pIt
252f0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
25300 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
25310 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
25320 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
25330 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25340 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
25350 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61       pColl = pPa
25360 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f  rse->db->pDfltCo
25370 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
25380 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d 30 20    if( regHit==0 
25390 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63  && pAggInfo->nAc
253a0 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65 67 48  cumulator ) regH
253b0 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  it = ++pParse->n
253c0 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Mem;.      sqlit
253d0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
253e0 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48  OP_CollSeq, regH
253f0 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20  it, 0, 0, (char 
25400 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
25410 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  SEQ);.    }.    
25420 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
25430 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c  4(v, OP_AggStep,
25440 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46 2d 3e   0, regAgg, pF->
25450 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 20 20  iMem,.          
25460 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
25470 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34  d*)pF->pFunc, P4
25480 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 73  _FUNCDEF);.    s
25490 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
254a0 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67 29 3b  P5(v, (u8)nArg);
254b0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
254c0 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
254d0 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
254e0 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 73  gg, nArg);.    s
254f0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
25500 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  pRange(pParse, r
25510 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20  egAgg, nArg);.  
25520 20 20 69 66 28 20 61 64 64 72 4e 65 78 74 20 29    if( addrNext )
25530 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
25540 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
25550 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a 20 20  v, addrNext);.  
25560 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
25570 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
25580 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
25590 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75 6c 61  /* Before popula
255a0 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
255b0 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20  ator registers, 
255c0 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e  clear the column
255d0 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68   cache..  ** Oth
255e0 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79 20 6f  erwise, if any o
255f0 66 20 74 68 65 20 72 65 71 75 69 72 65 64 20 63  f the required c
25600 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61 72 65  olumn values are
25610 20 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74   already present
25620 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69 73 74   .  ** in regist
25630 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78 70 72  ers, sqlite3Expr
25640 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65 20 4f  Code() may use O
25650 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70 79 20  P_SCopy to copy 
25660 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74  the value.  ** t
25670 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20  o pC->iMem. But 
25680 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20  by the time the 
25690 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c 20 74  value is used, t
256a0 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65 67 69  he original regi
256b0 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61  ster.  ** may ha
256c0 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20 69 6e  ve been used, in
256d0 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65 20 75  validating the u
256e0 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66 65 72  nderlying buffer
256f0 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a   holding the.  *
25700 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62 20 76  * text or blob v
25710 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b 65 74  alue. See ticket
25720 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e 0a 20   [883034dcb5].. 
25730 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72   **.  ** Another
25740 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20   solution would 
25750 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65  be to change the
25760 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64 20 74   OP_SCopy used t
25770 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a 20 20  o copy cached.  
25780 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61 6e 20  ** values to an 
25790 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20  OP_Copy..  */.  
257a0 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a 20 20  if( regHit ){.  
257b0 20 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20    addrHitTest = 
257c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
257d0 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48  1(v, OP_If, regH
257e0 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  it);.  }.  sqlit
257f0 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
25800 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f 72 28  (pParse);.  for(
25810 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f  i=0, pC=pAggInfo
25820 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e  ->aCol; i<pAggIn
25830 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
25840 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20  ; i++, pC++){.  
25850 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
25860 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e 70 45  e(pParse, pC->pE
25870 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a  xpr, pC->iMem);.
25880 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e    }.  pAggInfo->
25890 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a  directMode = 0;.
258a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
258b0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
258c0 0a 20 20 69 66 28 20 61 64 64 72 48 69 74 54 65  .  if( addrHitTe
258d0 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  st ){.    sqlite
258e0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
258f0 20 61 64 64 72 48 69 74 54 65 73 74 29 3b 0a 20   addrHitTest);. 
25900 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
25910 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c  a single OP_Expl
25920 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ain instruction 
25930 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f 20 65  to the VDBE to e
25940 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a  xplain a simple.
25950 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75 65 72  ** count(*) quer
25960 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  y ("SELECT count
25970 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22 29 2e  (*) FROM pTab").
25980 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
25990 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
259a0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
259b0 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a  ainSimpleCount(.
259c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
259d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259e0 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
259f0 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
25a00 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
25a10 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
25a20 20 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a   being queried *
25a30 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a50 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 65      /* Index use
25a60 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63  d to optimize sc
25a70 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  an, or NULL */.)
25a80 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
25a90 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20  explain==2 ){.  
25aa0 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d 20 73    char *zEqp = s
25ab0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
25ac0 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20  arse->db, "SCAN 
25ad0 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c 0a 20  TABLE %s%s%s",. 
25ae0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
25af0 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70 49 64  me, .        pId
25b00 78 20 3f 20 22 20 55 53 49 4e 47 20 43 4f 56 45  x ? " USING COVE
25b10 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a 20 22  RING INDEX " : "
25b20 22 2c 0a 20 20 20 20 20 20 20 20 70 49 64 78 20  ",.        pIdx 
25b30 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  ? pIdx->zName : 
25b40 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  "".    );.    sq
25b50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
25b60 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
25b70 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61  >pVdbe, OP_Expla
25b80 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
25b90 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71  ectId, 0, 0, zEq
25ba0 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20  p, P4_DYNAMIC.  
25bb0 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65    );.  }.}.#else
25bc0 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
25bd0 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62  nSimpleCount(a,b
25be0 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,c).#endif../*.*
25bf0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
25c00 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54 20 73  for the SELECT s
25c10 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 69  tatement given i
25c20 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65 6e 74  n the p argument
25c30 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  .  .**.** The re
25c40 73 75 6c 74 73 20 61 72 65 20 72 65 74 75 72 6e  sults are return
25c50 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ed according to 
25c60 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20 73  the SelectDest s
25c70 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53 65 65  tructure..** See
25c80 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73 71 6c   comments in sql
25c90 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66 75 72  iteInt.h for fur
25ca0 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ther information
25cb0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
25cc0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
25cd0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
25ce0 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72 6f 72  s.  If any error
25cf0 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74  s are.** encount
25d00 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20 61 70  ered, then an ap
25d10 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
25d20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
25d30 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  in.** pParse->zE
25d40 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  rrMsg..**.** Thi
25d50 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 4e  s routine does N
25d60 4f 54 20 66 72 65 65 20 74 68 65 20 53 65 6c 65  OT free the Sele
25d70 63 74 20 73 74 72 75 63 74 75 72 65 20 70 61 73  ct structure pas
25d80 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a 2a 20  sed in.  The.** 
25d90 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
25da0 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74 68 61   needs to do tha
25db0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
25dc0 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  3Select(.  Parse
25dd0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
25de0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
25df0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
25e00 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
25e10 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
25e20 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  T statement bein
25e30 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 53 65  g coded. */.  Se
25e40 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
25e50 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
25e60 64 6f 20 77 69 74 68 20 74 68 65 20 71 75 65 72  do with the quer
25e70 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
25e80 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
25e90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
25ea0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
25eb0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
25ec0 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
25ed0 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68 65 72  from sqlite3Wher
25ee0 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20 56 64  eBegin() */.  Vd
25ef0 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
25f00 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
25f10 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
25f20 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
25f30 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b 20 20  /.  int isAgg;  
25f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25f50 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20 6c 69  ue for select li
25f60 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  sts like "count(
25f70 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  *)" */.  ExprLis
25f80 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
25f90 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c 75 6d  /* List of colum
25fa0 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e 20 2a  ns to extract. *
25fb0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
25fc0 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20 4c 69  bList;     /* Li
25fd0 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74 6f 20  st of tables to 
25fe0 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f 0a 20  select from */. 
25ff0 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20 20   Expr *pWhere;  
26000 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
26010 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d 61  HERE clause.  Ma
26020 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45  y be NULL */.  E
26030 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
26040 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  y;    /* The ORD
26050 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 4d  ER BY clause.  M
26060 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
26070 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
26080 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 47 52  By;    /* The GR
26090 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
260a0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
260b0 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67 3b 20   Expr *pHaving; 
260c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 48          /* The H
260d0 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20 20 4d  AVING clause.  M
260e0 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ay be NULL */.  
260f0 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20 20 20  int rc = 1;     
26100 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
26110 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d 20 74  to return from t
26120 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
26130 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 49 6e    int addrSortIn
26140 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  dex;     /* Addr
26150 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f 70 65  ess of an OP_Ope
26160 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
26170 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69 73 74  uction */.  Dist
26180 69 6e 63 74 43 74 78 20 73 44 69 73 74 69 6e 63  inctCtx sDistinc
26190 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f  t; /* Info on ho
261a0 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20 44 49  w to code the DI
261b0 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 2a  STINCT keyword *
261c0 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41 67 67  /.  AggInfo sAgg
261d0 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20 49 6e  Info;      /* In
261e0 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 20 62  formation used b
261f0 79 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  y aggregate quer
26200 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e  ies */.  int iEn
26210 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
26220 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
26230 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71 75 65  e end of the que
26240 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ry */.  sqlite3 
26250 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
26260 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
26270 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69  onnection */..#i
26280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26290 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
262a0 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64  iRestoreSelectId
262b0 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65   = pParse->iSele
262c0 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65 2d 3e  ctId;.  pParse->
262d0 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72  iSelectId = pPar
262e0 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
262f0 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  d++;.#endif..  d
26300 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
26310 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 64 62    if( p==0 || db
26320 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
26330 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
26340 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
26350 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
26360 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
26370 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43 54  e, SQLITE_SELECT
26380 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65 74  , 0, 0, 0) ) ret
26390 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65 74 28  urn 1;.  memset(
263a0 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20 73 69  &sAggInfo, 0, si
263b0 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29 29 3b  zeof(sAggInfo));
263c0 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61 62 6c  ..  if( Ignorabl
263d0 65 4f 72 64 65 72 62 79 28 70 44 65 73 74 29 20  eOrderby(pDest) 
263e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 44  ){.    assert(pD
263f0 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f  est->eDest==SRT_
26400 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73 74 2d  Exists || pDest-
26410 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e 69 6f  >eDest==SRT_Unio
26420 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  n || .          
26430 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
26440 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70 44 65  RT_Except || pDe
26450 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 44  st->eDest==SRT_D
26460 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f 2a 20  iscard);.    /* 
26470 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61 6b 65  If ORDER BY make
26480 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63 65 20  s no difference 
26490 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 74 68  in the output th
264a0 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65 73 0a  en neither does.
264b0 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43 54 20      ** DISTINCT 
264c0 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72 65 6d  so it can be rem
264d0 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20  oved too. */.   
264e0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
264f0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f  Delete(db, p->pO
26500 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70 2d 3e  rderBy);.    p->
26510 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
26520 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d    p->selFlags &=
26530 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20   ~SF_Distinct;. 
26540 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   }.  sqlite3Sele
26550 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
26560 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72 42 79  , 0);.  pOrderBy
26570 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a   = p->pOrderBy;.
26580 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e    pTabList = p->
26590 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74 20 3d  pSrc;.  pEList =
265a0 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 69 66   p->pEList;.  if
265b0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
265c0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
265d0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  ed ){.    goto s
265e0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20  elect_end;.  }. 
265f0 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73 65 6c   isAgg = (p->sel
26600 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
26610 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73 73 65  gate)!=0;.  asse
26620 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
26630 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
26640 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a 20 20  erating code..  
26650 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
26660 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
26670 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f  .  if( v==0 ) go
26680 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
26690 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e 67 20    /* If writing 
266a0 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67 65 6e  to memory or gen
266b0 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a 20 20  erating a set.  
266c0 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
266d0 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65 20 6f   column may be o
266e0 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  utput..  */.#ifn
266f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
26700 53 55 42 51 55 45 52 59 0a 20 20 69 66 28 20 63  SUBQUERY.  if( c
26710 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75  heckForMultiColu
26720 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 70 50  mnSelectError(pP
26730 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70 45 4c  arse, pDest, pEL
26740 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20  ist->nExpr) ){. 
26750 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65     goto select_e
26760 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  nd;.  }.#endif..
26770 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
26780 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62 2d 71  de for all sub-q
26790 75 65 72 69 65 73 20 69 6e 20 74 68 65 20 46 52  ueries in the FR
267a0 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 23  OM clause.  */.#
267b0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
267c0 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
267d0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
267e0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 0a  LITE_OMIT_VIEW).
267f0 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d 3e 70    for(i=0; !p->p
26800 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61 62 4c  Prior && i<pTabL
26810 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
26820 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
26830 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
26840 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  = &pTabList->a[i
26850 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44 65 73  ];.    SelectDes
26860 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65 6c 65  t dest;.    Sele
26870 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74 65 6d  ct *pSub = pItem
26880 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 69  ->pSelect;.    i
26890 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a 20 20  nt isAggSub;..  
268a0 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 29 20    if( pSub==0 ) 
268b0 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 2f  continue;..    /
268c0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68 65 20  * Sometimes the 
268d0 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62 71 75  code for a subqu
268e0 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65 6e 65  ery will be gene
268f0 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61 6e 0a  rated more than.
26900 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69 66 20      ** once, if 
26910 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
26920 70 61 72 74 20 6f 66 20 74 68 65 20 57 48 45 52  part of the WHER
26930 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20 4c 45  E clause in a LE
26940 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20  FT JOIN,.    ** 
26950 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 49 6e  for example.  In
26960 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f 20 6e   that case, do n
26970 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20 74 68  ot regenerate th
26980 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69 66 65  e code to manife
26990 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69 65 77  st.    ** a view
269a0 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75 74 69   or the co-routi
269b0 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ne to implement 
269c0 61 20 76 69 65 77 2e 20 20 54 68 65 20 66 69 72  a view.  The fir
269d0 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20 20 20  st instance.    
269e0 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  ** is sufficient
269f0 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73 75 62  , though the sub
26a00 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e 69 66  routine to manif
26a10 65 73 74 20 74 68 65 20 76 69 65 77 20 64 6f 65  est the view doe
26a20 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  s need.    ** to
26a30 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67 61 69   be invoked agai
26a40 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49  n. */.    if( pI
26a50 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62  tem->addrFillSub
26a60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
26a70 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e  tem->viaCoroutin
26a80 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
26a90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26aa0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
26ab0 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c  Item->regReturn,
26ac0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
26ad0 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Sub);.      }.  
26ae0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26af0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72    }..    /* Incr
26b00 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48 65 69  ement Parse.nHei
26b10 67 68 74 20 62 79 20 74 68 65 20 68 65 69 67 68  ght by the heigh
26b20 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  t of the largest
26b30 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
26b40 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72 65 64  ** tree referred
26b50 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74 68 65   to by this, the
26b60 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74 2e 20   parent select. 
26b70 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65 63 74  The child select
26b80 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f 6e 74  .    ** may cont
26b90 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ain expression t
26ba0 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73 74 0a  rees of at most.
26bb0 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45 5f 4d      ** (SQLITE_M
26bc0 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d 50 61  AX_EXPR_DEPTH-Pa
26bd0 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68 65 69  rse.nHeight) hei
26be0 67 68 74 2e 20 54 68 69 73 20 69 73 20 61 20 62  ght. This is a b
26bf0 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 63  it.    ** more c
26c00 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68 61 6e  onservative than
26c10 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75 74 20   necessary, but 
26c20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68 61 6e  much easier than
26c30 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20 20 2a   enforcing.    *
26c40 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d 69 74  * an exact limit
26c50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
26c60 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
26c70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
26c80 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20 20 20  rHeight(p);..   
26c90 20 69 73 41 67 67 53 75 62 20 3d 20 28 70 53 75   isAggSub = (pSu
26ca0 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
26cb0 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a  _Aggregate)!=0;.
26cc0 20 20 20 20 69 66 28 20 66 6c 61 74 74 65 6e 53      if( flattenS
26cd0 75 62 71 75 65 72 79 28 70 50 61 72 73 65 2c 20  ubquery(pParse, 
26ce0 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69 73 41  p, i, isAgg, isA
26cf0 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20 20 20  ggSub) ){.      
26d00 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65 72 79  /* This subquery
26d10 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62 65 64   can be absorbed
26d20 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65 6e 74   into its parent
26d30 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  . */.      if( i
26d40 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20 20 20  sAggSub ){.     
26d50 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a 20 20     isAgg = 1;.  
26d60 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
26d70 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
26d80 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
26d90 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   i = -1;.    }el
26da0 73 65 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  se if( pTabList-
26db0 3e 6e 53 72 63 3d 3d 31 20 26 26 20 28 70 2d 3e  >nSrc==1 && (p->
26dc0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 61  selFlags & SF_Ma
26dd0 74 65 72 69 61 6c 69 7a 65 29 3d 3d 30 0a 20 20  terialize)==0.  
26de0 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
26df0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
26e00 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74  QLITE_SubqCorout
26e10 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ine).    ){.    
26e20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61    /* Implement a
26e30 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74   co-routine that
26e40 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20 73   will return a s
26e50 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65  ingle row of the
26e60 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a   result.      **
26e70 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69 6e 76   set on each inv
26e80 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ocation..      *
26e90 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
26ea0 54 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 61  Top;.      int a
26eb0 64 64 72 45 6f 66 3b 0a 20 20 20 20 20 20 70 49  ddrEof;.      pI
26ec0 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d  tem->regReturn =
26ed0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
26ee0 0a 20 20 20 20 20 20 61 64 64 72 45 6f 66 20 3d  .      addrEof =
26ef0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
26f00 0a 20 20 20 20 20 20 2f 2a 20 42 65 66 6f 72 65  .      /* Before
26f10 20 63 6f 64 69 6e 67 20 74 68 65 20 4f 50 5f 47   coding the OP_G
26f20 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 74 6f 20 74  oto to jump to t
26f30 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
26f40 6d 61 69 6e 20 72 6f 75 74 69 6e 65 2c 0a 20 20  main routine,.  
26f50 20 20 20 20 2a 2a 20 65 6e 73 75 72 65 20 74 68      ** ensure th
26f60 61 74 20 74 68 65 20 6a 75 6d 70 20 74 6f 20 74  at the jump to t
26f70 68 65 20 76 65 72 69 66 79 2d 73 63 68 65 6d 61  he verify-schema
26f80 20 72 6f 75 74 69 6e 65 20 68 61 73 20 61 6c 72   routine has alr
26f90 65 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 62 65  eady.      ** be
26fa0 65 6e 20 63 6f 64 65 64 2e 20 4f 74 68 65 72 77  en coded. Otherw
26fb0 69 73 65 2c 20 74 68 65 20 76 65 72 69 66 79 2d  ise, the verify-
26fc0 73 63 68 65 6d 61 20 77 6f 75 6c 64 20 6c 69 6b  schema would lik
26fd0 65 6c 79 20 62 65 20 63 6f 64 65 64 20 61 73 20  ely be coded as 
26fe0 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 20 6f  .      ** part o
26ff0 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  f the co-routine
27000 2e 20 49 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  . If the main ro
27010 75 74 69 6e 65 20 74 68 65 6e 20 61 63 63 65 73  utine then acces
27020 73 65 64 20 74 68 65 20 0a 20 20 20 20 20 20 2a  sed the .      *
27030 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  * database befor
27040 65 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63  e invoking the c
27050 6f 2d 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68  o-routine for th
27060 65 20 66 69 72 73 74 20 74 69 6d 65 20 28 66 6f  e first time (fo
27070 72 20 0a 20 20 20 20 20 20 2a 2a 20 65 78 61 6d  r .      ** exam
27080 70 6c 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ple to initializ
27090 65 20 61 20 4c 49 4d 49 54 20 72 65 67 69 73 74  e a LIMIT regist
270a0 65 72 20 66 72 6f 6d 20 61 20 73 75 62 2d 73 65  er from a sub-se
270b0 6c 65 63 74 29 2c 20 69 74 20 77 6f 75 6c 64 20  lect), it would 
270c0 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 64 6f 69  .      ** be doi
270d0 6e 67 20 73 6f 20 77 69 74 68 6f 75 74 20 68 61  ng so without ha
270e0 76 69 6e 67 20 76 65 72 69 66 69 65 64 20 74 68  ving verified th
270f0 65 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  e schema version
27100 20 61 6e 64 20 6f 62 74 61 69 6e 65 64 20 0a 20   and obtained . 
27110 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75       ** the requ
27120 69 72 65 64 20 64 62 20 6c 6f 63 6b 73 2e 20 53  ired db locks. S
27130 65 65 20 74 69 63 6b 65 74 20 64 36 62 33 36 62  ee ticket d6b36b
27140 65 33 38 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73  e38.  */.      s
27150 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
27160 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 2d  Schema(pParse, -
27170 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
27180 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
27190 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 61  P_Goto);.      a
271a0 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
271b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
271c0 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 49 74  _OpenPseudo, pIt
271d0 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
271e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
271f0 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20  hangeP5(v, 1);. 
27200 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
27210 28 28 76 2c 20 22 63 6f 72 6f 75 74 69 6e 65 20  ((v, "coroutine 
27220 66 6f 72 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  for %s", pItem->
27230 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  pTab->zName));. 
27240 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72       pItem->addr
27250 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f  FillSub = addrTo
27260 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  p;.      sqlite3
27270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
27280 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 61 64 64  _Integer, 0, add
27290 72 45 6f 66 29 3b 0a 20 20 20 20 20 20 73 71 6c  rEof);.      sql
272a0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
272b0 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  (v, 1);.      sq
272c0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
272d0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43  nit(&dest, SRT_C
272e0 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d  oroutine, pItem-
272f0 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
27300 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
27310 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
27320 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
27330 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
27340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27350 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
27360 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
27370 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
27380 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67  nRowEst = (unsig
27390 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63  ned)pSub->nSelec
273a0 74 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65  tRow;.      pIte
273b0 6d 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  m->viaCoroutine 
273c0 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
273d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
273e0 2c 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74 2e  , addrTop, dest.
273f0 69 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  iSdst);.      sq
27400 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
27410 33 28 76 2c 20 61 64 64 72 54 6f 70 2c 20 64 65  3(v, addrTop, de
27420 73 74 2e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  st.nSdst);.     
27430 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27440 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
27450 2c 20 31 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20  , 1, addrEof);. 
27460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27470 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
27480 6c 64 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ld, pItem->regRe
27490 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  turn);.      Vdb
274a0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e  eComment((v, "en
274b0 64 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54  d %s", pItem->pT
274c0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
274d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
274e0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f  mpHere(v, addrTo
274f0 70 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  p-1);.      sqli
27500 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
27510 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
27520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
27530 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
27540 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
27550 6c 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65  l fill an epheme
27560 72 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20  ral table with. 
27570 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74       ** the cont
27580 65 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71  ent of this subq
27590 75 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64  uery.  pItem->ad
275a0 64 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70  drFillSub will p
275b0 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f  oint.      ** to
275c0 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
275d0 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75  the generated su
275e0 62 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d  broutine.  pItem
275f0 2d 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20  ->regReturn.    
27600 20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74    ** is a regist
27610 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20  er allocated to 
27620 68 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74  hold the subrout
27630 69 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65  ine return addre
27640 73 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ss.      */.    
27650 20 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20    int topAddr;. 
27660 20 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64       int onceAdd
27670 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
27680 20 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20   retAddr;.      
27690 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61  assert( pItem->a
276a0 64 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b  ddrFillSub==0 );
276b0 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65  .      pItem->re
276c0 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72  gReturn = ++pPar
276d0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
276e0 74 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65  topAddr = sqlite
276f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
27700 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49  P_Integer, 0, pI
27710 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
27720 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
27730 64 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41  drFillSub = topA
27740 64 64 72 2b 31 3b 0a 20 20 20 20 20 20 56 64 62  ddr+1;.      Vdb
27750 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
27760 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 25 73   "materialize %s
27770 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
27780 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 69  zName));.      i
27790 66 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72  f( pItem->isCorr
277a0 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  elated==0 ){.   
277b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73       /* If the s
277c0 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 63  ubquery is not c
277d0 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66  orrelated and if
277e0 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69   we are not insi
277f0 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  de of.        **
27800 20 61 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e   a trigger, then
27810 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
27820 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c   compute the val
27830 75 65 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ue of the subque
27840 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  ry.        ** on
27850 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f  ce. */.        o
27860 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65  nceAddr = sqlite
27870 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65  3CodeOnce(pParse
27880 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27890 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
278a0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
278b0 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
278c0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
278d0 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
278e0 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
278f0 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
27900 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
27910 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27920 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
27930 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
27940 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
27950 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67  nRowEst = (unsig
27960 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63  ned)pSub->nSelec
27970 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
27980 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74  onceAddr ) sqlit
27990 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
279a0 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20  , onceAddr);.   
279b0 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c     retAddr = sql
279c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
279d0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74  , OP_Return, pIt
279e0 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
279f0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
27a00 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20  t((v, "end %s", 
27a10 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
27a20 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
27a30 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
27a40 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41  v, topAddr, retA
27a50 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
27a60 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
27a70 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
27a80 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50    }.    if( /*pP
27a90 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20  arse->nErr ||*/ 
27aa0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
27ab0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
27ac0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
27ad0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
27ae0 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53  ight -= sqlite3S
27af0 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
27b00 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  p);.    pTabList
27b10 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
27b20 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
27b30 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
27b40 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
27b50 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
27b60 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
27b70 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65   = p->pEList;.#e
27b80 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20  ndif.  pWhere = 
27b90 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
27ba0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
27bb0 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
27bc0 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
27bd0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
27be0 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
27bf0 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
27c00 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
27c10 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
27c20 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
27c30 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
27c40 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
27c50 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
27c60 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
27c70 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
27c80 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  or ){.    if( p-
27c90 3e 70 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29  >pRightmost==0 )
27ca0 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
27cb0 70 4c 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d  pLoop, *pRight =
27cc0 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   0;.      int cn
27cd0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  t = 0;.      int
27ce0 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20   mxSelect;.     
27cf0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
27d00 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
27d10 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29  ->pPrior, cnt++)
27d20 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  {.        pLoop-
27d30 3e 70 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b  >pRightmost = p;
27d40 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
27d50 70 4e 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a  pNext = pRight;.
27d60 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20 3d          pRight =
27d70 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a   pLoop;.      }.
27d80 20 20 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d        mxSelect =
27d90 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
27da0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
27db0 44 5f 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20  D_SELECT];.     
27dc0 20 69 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26   if( mxSelect &&
27dd0 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b   cnt>mxSelect ){
27de0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
27df0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
27e00 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73   "too many terms
27e10 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c   in compound SEL
27e20 45 43 54 22 29 3b 0a 20 20 20 20 20 20 20 20 67  ECT");.        g
27e30 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
27e40 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27e50 20 20 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65    rc = multiSele
27e60 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  ct(pParse, p, pD
27e70 65 73 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69  est);.    explai
27e80 6e 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72  nSetInteger(pPar
27e90 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69  se->iSelectId, i
27ea0 52 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29  RestoreSelectId)
27eb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
27ec0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
27ed0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 62 6f  * If there is bo
27ee0 74 68 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e  th a GROUP BY an
27ef0 64 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  d an ORDER BY cl
27f00 61 75 73 65 20 61 6e 64 20 74 68 65 79 20 61 72  ause and they ar
27f10 65 0a 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c  e.  ** identical
27f20 2c 20 74 68 65 6e 20 64 69 73 61 62 6c 65 20 74  , then disable t
27f30 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
27f40 73 65 20 73 69 6e 63 65 20 74 68 65 20 47 52 4f  se since the GRO
27f50 55 50 20 42 59 0a 20 20 2a 2a 20 77 69 6c 6c 20  UP BY.  ** will 
27f60 63 61 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74  cause elements t
27f70 6f 20 63 6f 6d 65 20 6f 75 74 20 69 6e 20 74 68  o come out in th
27f80 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
27f90 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 61    This is.  ** a
27fa0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d  n optimization -
27fb0 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   the correct ans
27fc0 77 65 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c  wer should resul
27fd0 74 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  t regardless..  
27fe0 2a 2a 20 55 73 65 20 74 68 65 20 53 51 4c 49 54  ** Use the SQLIT
27ff0 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66  E_GroupByOrder f
28000 6c 61 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f  lag with SQLITE_
28010 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
28020 45 52 0a 20 20 2a 2a 20 74 6f 20 64 69 73 61 62  ER.  ** to disab
28030 6c 65 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  le this optimiza
28040 74 69 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67  tion for testing
28050 20 70 75 72 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a   purposes..  */.
28060 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
28070 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 2d 3e  rListCompare(p->
28080 70 47 72 6f 75 70 42 79 2c 20 70 4f 72 64 65 72  pGroupBy, pOrder
28090 42 79 2c 20 2d 31 29 3d 3d 30 0a 20 20 20 20 20  By, -1)==0.     
280a0 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74      && Optimizat
280b0 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53  ionEnabled(db, S
280c0 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
280d0 65 72 29 20 29 7b 0a 20 20 20 20 70 4f 72 64 65  er) ){.    pOrde
280e0 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
280f0 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
28100 69 73 20 44 49 53 54 49 4e 43 54 20 77 69 74 68  is DISTINCT with
28110 20 61 6e 20 4f 52 44 45 52 20 42 59 20 62 75 74   an ORDER BY but
28120 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
28130 67 61 74 65 2c 20 61 6e 64 20 0a 20 20 2a 2a 20  gate, and .  ** 
28140 69 66 20 74 68 65 20 73 65 6c 65 63 74 2d 6c 69  if the select-li
28150 73 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  st is the same a
28160 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6c  s the ORDER BY l
28170 69 73 74 2c 20 74 68 65 6e 20 74 68 69 73 20 71  ist, then this q
28180 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e 20 62 65  uery.  ** can be
28190 20 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20   rewritten as a 
281a0 47 52 4f 55 50 20 42 59 2e 20 49 6e 20 6f 74 68  GROUP BY. In oth
281b0 65 72 20 77 6f 72 64 73 2c 20 74 68 69 73 3a 0a  er words, this:.
281c0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45    **.  **     SE
281d0 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 78 79  LECT DISTINCT xy
281e0 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52  z FROM ... ORDER
281f0 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a   BY xyz.  **.  *
28200 2a 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  * is transformed
28210 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
28220 20 20 20 53 45 4c 45 43 54 20 78 79 7a 20 46 52     SELECT xyz FR
28230 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20 42 59 20  OM ... GROUP BY 
28240 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  xyz.  **.  ** Th
28250 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 73  e second form is
28260 20 70 72 65 66 65 72 72 65 64 20 61 73 20 61 20   preferred as a 
28270 73 69 6e 67 6c 65 20 69 6e 64 65 78 20 28 6f 72  single index (or
28280 20 74 65 6d 70 2d 74 61 62 6c 65 29 20 6d 61 79   temp-table) may
28290 20 62 65 20 0a 20 20 2a 2a 20 75 73 65 64 20 66   be .  ** used f
282a0 6f 72 20 62 6f 74 68 20 74 68 65 20 4f 52 44 45  or both the ORDE
282b0 52 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43  R BY and DISTINC
282c0 54 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 41 73  T processing. As
282d0 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a 20 20 2a   originally .  *
282e0 2a 20 77 72 69 74 74 65 6e 20 74 68 65 20 71 75  * written the qu
282f0 65 72 79 20 6d 75 73 74 20 75 73 65 20 61 20 74  ery must use a t
28300 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 61 74  emp-table for at
28310 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
28320 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a 20 42 59  e ORDER .  ** BY
28330 20 61 6e 64 20 44 49 53 54 49 4e 43 54 2c 20 61   and DISTINCT, a
28340 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f 72 20 73  nd an index or s
28350 65 70 61 72 61 74 65 20 74 65 6d 70 2d 74 61 62  eparate temp-tab
28360 6c 65 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  le for the other
28370 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
28380 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
28390 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
283a0 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
283b0 69 6e 63 74 20 0a 20 20 20 26 26 20 73 71 6c 69  inct .   && sqli
283c0 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61  te3ExprListCompa
283d0 72 65 28 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e  re(pOrderBy, p->
283e0 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d 30 0a 20  pEList, -1)==0. 
283f0 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   ){.    p->selFl
28400 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
28410 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70 47 72 6f  nct;.    p->pGro
28420 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
28430 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d  prListDup(db, p-
28440 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  >pEList, 0);.   
28450 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70   pGroupBy = p->p
28460 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 70 4f 72  GroupBy;.    pOr
28470 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 2f  derBy = 0;.    /
28480 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20 65 76  * Notice that ev
28490 65 6e 20 74 68 6f 75 67 68 74 20 53 46 5f 44 69  en thought SF_Di
284a0 73 74 69 6e 63 74 20 68 61 73 20 62 65 65 6e 20  stinct has been 
284b0 63 6c 65 61 72 65 64 20 66 72 6f 6d 20 70 2d 3e  cleared from p->
284c0 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20 20 2a 2a  selFlags,.    **
284d0 20 74 68 65 20 73 44 69 73 74 69 6e 63 74 2e 69   the sDistinct.i
284e0 73 54 6e 63 74 20 69 73 20 73 74 69 6c 6c 20 73  sTnct is still s
284f0 65 74 2e 20 20 48 65 6e 63 65 2c 20 69 73 54 6e  et.  Hence, isTn
28500 63 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  ct represents th
28510 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 61  e.    ** origina
28520 6c 20 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65  l setting of the
28530 20 53 46 5f 44 69 73 74 69 6e 63 74 20 66 6c 61   SF_Distinct fla
28540 67 2c 20 6e 6f 74 20 74 68 65 20 63 75 72 72 65  g, not the curre
28550 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20  nt setting */.  
28560 20 20 61 73 73 65 72 74 28 20 73 44 69 73 74 69    assert( sDisti
28570 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b 0a 20 20  nct.isTnct );.  
28580 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
28590 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
285a0 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 69  clause, then thi
285b0 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 69  s sorting.  ** i
285c0 6e 64 65 78 20 6d 69 67 68 74 20 65 6e 64 20 75  ndex might end u
285d0 70 20 62 65 69 6e 67 20 75 6e 75 73 65 64 20 69  p being unused i
285e0 66 20 74 68 65 20 64 61 74 61 20 63 61 6e 20 62  f the data can b
285f0 65 20 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65  e .  ** extracte
28600 64 20 69 6e 20 70 72 65 2d 73 6f 72 74 65 64 20  d in pre-sorted 
28610 6f 72 64 65 72 2e 20 20 49 66 20 74 68 61 74 20  order.  If that 
28620 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
28630 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70  n the.  ** OP_Op
28640 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
28650 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  ruction will be 
28660 63 68 61 6e 67 65 64 20 74 6f 20 61 6e 20 4f 50  changed to an OP
28670 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20 2a 2a 20  _Noop once.  ** 
28680 77 65 20 66 69 67 75 72 65 20 6f 75 74 20 74 68  we figure out th
28690 61 74 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  at the sorting i
286a0 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e 65 65 64  ndex is not need
286b0 65 64 2e 20 20 54 68 65 20 61 64 64 72 53 6f 72  ed.  The addrSor
286c0 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76 61 72 69  tIndex.  ** vari
286d0 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
286e0 66 61 63 69 6c 69 74 61 74 65 20 74 68 61 74 20  facilitate that 
286f0 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  change..  */.  i
28700 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
28710 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
28720 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65 79 49 6e  Info;.    pKeyIn
28730 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f 6d  fo = keyInfoFrom
28740 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
28750 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20   pOrderBy);.    
28760 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
28770 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
28780 62 2b 2b 3b 0a 20 20 20 20 70 2d 3e 61 64 64 72  b++;.    p->addr
28790 4f 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 61 64  OpenEphm[2] = ad
287a0 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 0a 20 20  drSortIndex =.  
287b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
287c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
287d0 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20  Ephemeral,.     
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287f0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e        pOrderBy->
28800 69 45 43 75 72 73 6f 72 2c 20 70 4f 72 64 65 72  iECursor, pOrder
28810 42 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a  By->nExpr+2, 0,.
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28830 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
28840 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
28850 45 59 49 4e 46 4f 29 3b 0a 20 20 7d 65 6c 73 65  EYINFO);.  }else
28860 7b 0a 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e  {.    addrSortIn
28870 64 65 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20  dex = -1;.  }.. 
28880 20 2f 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75   /* If the outpu
28890 74 20 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f  t is destined fo
288a0 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  r a temporary ta
288b0 62 6c 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74  ble, open that t
288c0 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
288d0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
288e0 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20  RT_EphemTab ){. 
288f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
28900 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
28910 70 68 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d  phemeral, pDest-
28920 3e 69 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74  >iSDParm, pEList
28930 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20  ->nExpr);.  }.. 
28940 20 2f 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69   /* Set the limi
28950 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64  ter..  */.  iEnd
28960 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
28970 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d  keLabel(v);.  p-
28980 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 4c 41  >nSelectRow = LA
28990 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 63  RGEST_INT64;.  c
289a0 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
289b0 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
289c0 69 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e  iEnd);.  if( p->
289d0 69 4c 69 6d 69 74 3d 3d 30 20 26 26 20 61 64 64  iLimit==0 && add
289e0 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 29 7b  rSortIndex>=0 ){
289f0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
28a00 47 65 74 4f 70 28 76 2c 20 61 64 64 72 53 6f 72  GetOp(v, addrSor
28a10 74 49 6e 64 65 78 29 2d 3e 6f 70 63 6f 64 65 20  tIndex)->opcode 
28a20 3d 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 3b  = OP_SorterOpen;
28a30 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
28a40 20 7c 3d 20 53 46 5f 55 73 65 53 6f 72 74 65 72   |= SF_UseSorter
28a50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
28a60 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78   a virtual index
28a70 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20   to use for the 
28a80 64 69 73 74 69 6e 63 74 20 73 65 74 2e 0a 20 20  distinct set..  
28a90 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  */.  if( p->selF
28aa0 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
28ab0 63 74 20 29 7b 0a 20 20 20 20 73 44 69 73 74 69  ct ){.    sDisti
28ac0 6e 63 74 2e 74 61 62 54 6e 63 74 20 3d 20 70 50  nct.tabTnct = pP
28ad0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
28ae0 20 20 73 44 69 73 74 69 6e 63 74 2e 61 64 64 72    sDistinct.addr
28af0 54 6e 63 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Tnct = sqlite3Vd
28b00 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
28b10 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a 20 20  penEphemeral,.  
28b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 44                sD
28b40 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74 2c  istinct.tabTnct,
28b50 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20   0, 0,.         
28b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b70 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 6b 65         (char*)ke
28b80 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
28b90 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c  t(pParse, p->pEL
28ba0 69 73 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ist),.          
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f        P4_KEYINFO
28bd0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
28be0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54  beChangeP5(v, BT
28bf0 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a  REE_UNORDERED);.
28c00 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54      sDistinct.eT
28c10 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f  nctType = WHERE_
28c20 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52  DISTINCT_UNORDER
28c30 45 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ED;.  }else{.   
28c40 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
28c50 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53  Type = WHERE_DIS
28c60 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a  TINCT_NOOP;.  }.
28c70 0a 20 20 69 66 28 20 21 69 73 41 67 67 20 26 26  .  if( !isAgg &&
28c80 20 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a   pGroupBy==0 ){.
28c90 20 20 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67      /* No aggreg
28ca0 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
28cb0 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  d no GROUP BY cl
28cc0 61 75 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  ause */.    u16 
28cd0 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44  wctrlFlags = (sD
28ce0 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f  istinct.isTnct ?
28cf0 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54   WHERE_WANT_DIST
28d00 49 4e 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20  INCT : 0);..    
28d10 2f 2a 20 42 65 67 69 6e 20 74 68 65 20 64 61 74  /* Begin the dat
28d20 61 62 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20  abase scan. */. 
28d30 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
28d40 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
28d50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
28d60 70 57 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79  pWhere, pOrderBy
28d70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 0a 20 20 20  , p->pEList,.   
28d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d90 20 20 20 20 20 20 20 20 20 20 20 20 77 63 74 72              wctr
28da0 6c 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  lFlags, 0);.    
28db0 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20  if( pWInfo==0 ) 
28dc0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
28dd0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
28de0 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f  WhereOutputRowCo
28df0 75 6e 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d  unt(pWInfo) < p-
28e00 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20  >nSelectRow ){. 
28e10 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
28e20 6f 77 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ow = sqlite3Wher
28e30 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
28e40 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
28e50 20 20 20 69 66 28 20 73 44 69 73 74 69 6e 63 74     if( sDistinct
28e60 2e 69 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74  .isTnct && sqlit
28e70 65 33 57 68 65 72 65 49 73 44 69 73 74 69 6e 63  e3WhereIsDistinc
28e80 74 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20  t(pWInfo) ){.   
28e90 20 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e     sDistinct.eTn
28ea0 63 74 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  ctType = sqlite3
28eb0 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
28ec0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20  pWInfo);.    }. 
28ed0 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
28ee0 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  && sqlite3WhereI
28ef0 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
28f00 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   ) pOrderBy = 0;
28f10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74  ..    /* If sort
28f20 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74 20 77  ing index that w
28f30 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20  as created by a 
28f40 70 72 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68  prior OP_OpenEph
28f50 65 6d 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69  emeral .    ** i
28f60 6e 73 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64  nstruction ended
28f70 20 75 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65   up not being ne
28f80 65 64 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67  eded, then chang
28f90 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68  e the OP_OpenEph
28fa0 65 6d 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e  emeral.    ** in
28fb0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20  to an OP_Noop.. 
28fc0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64     */.    if( ad
28fd0 64 72 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26  drSortIndex>=0 &
28fe0 26 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b  & pOrderBy==0 ){
28ff0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
29000 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
29010 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29  , addrSortIndex)
29020 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
29030 70 65 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b  penEphm[2] = -1;
29040 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
29050 73 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  se the standard 
29060 69 6e 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20  inner loop. */. 
29070 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
29080 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45  op(pParse, p, pE
29090 4c 69 73 74 2c 20 2d 31 2c 20 70 4f 72 64 65 72  List, -1, pOrder
290a0 42 79 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20  By, &sDistinct, 
290b0 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
290c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
290d0 65 33 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c  e3WhereContinueL
290e0 61 62 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20  abel(pWInfo),.  
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29100 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72    sqlite3WhereBr
29110 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
29120 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74  );..    /* End t
29130 68 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e  he database scan
29140 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
29150 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
29160 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c  d(pWInfo);.  }el
29170 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  se{.    /* This 
29180 63 61 73 65 20 77 68 65 6e 20 74 68 65 72 65 20  case when there 
29190 65 78 69 73 74 20 61 67 67 72 65 67 61 74 65 20  exist aggregate 
291a0 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47  functions or a G
291b0 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20  ROUP BY clause. 
291c0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f     ** or both */
291d0 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
291e0 20 73 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65   sNC;    /* Name
291f0 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f   context for pro
29200 63 65 73 73 69 6e 67 20 61 67 67 72 65 67 61 74  cessing aggregat
29210 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
29220 0a 20 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20  .    int iAMem; 
29230 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
29240 74 20 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f  t Mem address fo
29250 72 20 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e  r storing curren
29260 74 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  t GROUP BY */.  
29270 20 20 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20    int iBMem;    
29280 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
29290 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20 70  em address for p
292a0 72 65 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59  revious GROUP BY
292b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65   */.    int iUse
292c0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d  Flag;       /* M
292d0 65 6d 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69  em address holdi
292e0 6e 67 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69  ng flag indicati
292f0 6e 67 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  ng that at least
29300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29310 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20           ** one 
29320 72 6f 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74  row of the input
29330 20 74 6f 20 74 68 65 20 61 67 67 72 65 67 61 74   to the aggregat
29340 6f 72 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20  or has been.    
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29360 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64      ** processed
29370 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f   */.    int iAbo
29380 72 74 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d  rtFlag;     /* M
29390 65 6d 20 61 64 64 72 65 73 73 20 77 68 69 63 68  em address which
293a0 20 63 61 75 73 65 73 20 71 75 65 72 79 20 61 62   causes query ab
293b0 6f 72 74 20 69 66 20 70 6f 73 69 74 69 76 65 20  ort if positive 
293c0 2a 2f 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70  */.    int group
293d0 42 79 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f  BySort;    /* Ro
293e0 77 73 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75  ws come from sou
293f0 72 63 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20  rce in GROUP BY 
29400 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  order */.    int
29410 20 61 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20   addrEnd;       
29420 20 2f 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65   /* End of proce
29430 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
29440 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74  ELECT */.    int
29450 20 73 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20   sortPTab = 0;  
29460 20 2f 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20   /* Pseudotable 
29470 75 73 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73  used to decode s
29480 6f 72 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a  orting results *
29490 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75  /.    int sortOu
294a0 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74  t = 0;    /* Out
294b0 70 75 74 20 72 65 67 69 73 74 65 72 20 66 72 6f  put register fro
294c0 6d 20 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a  m the sorter */.
294d0 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61  .    /* Remove a
294e0 6e 79 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73  ny and all alias
294f0 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 72  es between the r
29500 65 73 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68  esult set and th
29510 65 0a 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42  e.    ** GROUP B
29520 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
29530 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
29540 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  y ){.      int k
29550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29560 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
29570 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
29580 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
29590 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
295a0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
295b0 76 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ver expression i
295c0 6e 20 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20  n a list */..   
295d0 20 20 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69     for(k=p->pELi
295e0 73 74 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d  st->nExpr, pItem
295f0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b  =p->pEList->a; k
29600 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; k--, pItem++
29610 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
29620 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30  ->u.x.iAlias = 0
29630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29640 66 6f 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e  for(k=pGroupBy->
29650 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72  nExpr, pItem=pGr
29660 6f 75 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  oupBy->a; k>0; k
29670 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
29680 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
29690 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
296a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
296b0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30  ->nSelectRow>100
296c0 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
296d0 20 3d 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73   = 100;.    }els
296e0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  e{.      p->nSel
296f0 65 63 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  ectRow = 1;.    
29700 7d 0a 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.. .    /* Crea
29710 74 65 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75  te a label to ju
29720 6d 70 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61  mp to when we wa
29730 6e 74 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20  nt to abort the 
29740 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64  query */.    add
29750 72 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64  rEnd = sqlite3Vd
29760 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
29770 0a 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  .    /* Convert 
29780 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
29790 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55  into TK_AGG_COLU
297a0 4d 4e 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72  MN and make entr
297b0 69 65 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41  ies in.    ** sA
297c0 67 67 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54  ggInfo for all T
297d0 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e  K_AGG_FUNCTION n
297e0 6f 64 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  odes in expressi
297f0 6f 6e 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ons of the.    *
29800 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
29810 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  nt..    */.    m
29820 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
29830 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
29840 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
29850 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53  arse;.    sNC.pS
29860 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73  rcList = pTabLis
29870 74 3b 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49  t;.    sNC.pAggI
29880 6e 66 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b  nfo = &sAggInfo;
29890 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e  .    sAggInfo.mn
298a0 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Reg = pParse->nM
298b0 65 6d 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e  em+1;.    sAggIn
298c0 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d  fo.nSortingColum
298d0 6e 20 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70  n = pGroupBy ? p
298e0 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31  GroupBy->nExpr+1
298f0 20 3a 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e   : 0;.    sAggIn
29900 66 6f 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  fo.pGroupBy = pG
29910 72 6f 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69  roupBy;.    sqli
29920 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
29930 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69  gList(&sNC, pELi
29940 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
29950 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69  ExprAnalyzeAggLi
29960 73 74 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42  st(&sNC, pOrderB
29970 79 29 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76  y);.    if( pHav
29980 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
29990 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
299a0 67 67 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20  ggregates(&sNC, 
299b0 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a  pHaving);.    }.
299c0 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63      sAggInfo.nAc
299d0 63 75 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67  cumulator = sAgg
299e0 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Info.nColumn;.  
299f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
29a00 67 49 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b  gInfo.nFunc; i++
29a10 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
29a20 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
29a30 79 28 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63  y(sAggInfo.aFunc
29a40 5b 69 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49  [i].pExpr, EP_xI
29a50 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
29a60 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
29a70 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20   NC_InAggFunc;. 
29a80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
29a90 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
29aa0 73 4e 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  sNC, sAggInfo.aF
29ab0 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e  unc[i].pExpr->x.
29ac0 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e  pList);.      sN
29ad0 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43  C.ncFlags &= ~NC
29ae0 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20  _InAggFunc;.    
29af0 7d 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d  }.    sAggInfo.m
29b00 78 52 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xReg = pParse->n
29b10 4d 65 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  Mem;.    if( db-
29b20 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
29b30 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
29b40 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
29b50 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
29b60 65 73 20 77 69 74 68 20 47 52 4f 55 50 20 42 59  es with GROUP BY
29b70 20 69 73 20 76 65 72 79 20 64 69 66 66 65 72 65   is very differe
29b80 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75  nt and.    ** mu
29b90 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20  ch more complex 
29ba0 74 68 61 6e 20 61 67 67 72 65 67 61 74 65 73 20  than aggregates 
29bb0 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20  without a GROUP 
29bc0 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  BY..    */.    i
29bd0 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
29be0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
29bf0 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69  eyInfo;  /* Keyi
29c00 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
29c10 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62 79 20  or the group by 
29c20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
29c30 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20  int j1;         
29c40 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f      /* A-vs-B co
29c50 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a  mparision jump *
29c60 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
29c70 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53  OutputRow;  /* S
29c80 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69  tart of subrouti
29c90 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
29ca0 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a  a result row */.
29cb0 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74        int regOut
29cc0 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74  putRow;   /* Ret
29cd0 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69  urn address regi
29ce0 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20  ster for output 
29cf0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
29d00 20 20 20 20 69 6e 74 20 61 64 64 72 53 65 74 41      int addrSetA
29d10 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74  bort;   /* Set t
29d20 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e  he abort flag an
29d30 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20  d return */.    
29d40 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c    int addrTopOfL
29d50 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20  oop;  /* Top of 
29d60 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a  the input loop *
29d70 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  /.      int addr
29d80 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54  SortingIdx; /* T
29d90 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  he OP_OpenEpheme
29da0 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74  ral for the sort
29db0 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
29dc0 20 20 20 69 6e 74 20 61 64 64 72 52 65 73 65 74     int addrReset
29dd0 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75  ;      /* Subrou
29de0 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69  tine for resetti
29df0 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  ng the accumulat
29e00 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  or */.      int 
29e10 72 65 67 52 65 73 65 74 3b 20 20 20 20 20 20 20  regReset;       
29e20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65 73  /* Return addres
29e30 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 72  s register for r
29e40 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20  eset subroutine 
29e50 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  */..      /* If 
29e60 74 68 65 72 65 20 69 73 20 61 20 47 52 4f 55 50  there is a GROUP
29e70 20 42 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69   BY clause we mi
29e80 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69  ght need a sorti
29e90 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20  ng index to.    
29ea0 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69    ** implement i
29eb0 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61  t.  Allocate tha
29ec0 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  t sorting index 
29ed0 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e  now.  If it turn
29ee0 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74  s out.      ** t
29ef0 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65  hat we do not ne
29f00 65 64 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c  ed it after all,
29f10 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70   the OP_SorterOp
29f20 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  en instruction. 
29f30 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20       ** will be 
29f40 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
29f50 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a   Noop.  .      *
29f60 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f  /.      sAggInfo
29f70 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50  .sortingIdx = pP
29f80 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
29f90 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b      pKeyInfo = k
29fa0 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69  eyInfoFromExprLi
29fb0 73 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  st(pParse, pGrou
29fc0 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72  pBy);.      addr
29fd0 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c  SortingIdx = sql
29fe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
29ff0 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
2a000 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67   .          sAgg
2a010 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2a020 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
2a030 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20  ngColumn, .     
2a040 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70       0, (char*)p
2a050 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
2a060 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  NFO);..      /* 
2a070 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
2a080 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64  y locations used
2a090 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67 67   by GROUP BY agg
2a0a0 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e  regate processin
2a0b0 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  g.      */.     
2a0c0 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50   iUseFlag = ++pP
2a0d0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
2a0e0 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b    iAbortFlag = +
2a0f0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
2a100 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f       regOutputRo
2a110 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  w = ++pParse->nM
2a120 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  em;.      addrOu
2a130 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
2a140 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
2a150 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73 65  );.      regRese
2a160 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
2a170 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65  em;.      addrRe
2a180 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  set = sqlite3Vdb
2a190 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2a1a0 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61       iAMem = pPa
2a1b0 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20  rse->nMem + 1;. 
2a1c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
2a1d0 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e  m += pGroupBy->n
2a1e0 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65  Expr;.      iBMe
2a1f0 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
2a200 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
2a210 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
2a220 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
2a230 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a240 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2a250 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61  er, 0, iAbortFla
2a260 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
2a270 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72  mment((v, "clear
2a280 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
2a290 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a2a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2a2b0 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c  teger, 0, iUseFl
2a2c0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
2a2d0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
2a2e0 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  cate accumulator
2a2f0 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20   empty"));.     
2a300 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a310 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p3(v, OP_Null, 0
2a320 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70  , iAMem, iAMem+p
2a330 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31  GroupBy->nExpr-1
2a340 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67  );..      /* Beg
2a350 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77  in a loop that w
2a360 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20  ill extract all 
2a370 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47  source rows in G
2a380 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20  ROUP BY order.. 
2a390 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67       ** This mig
2a3a0 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73  ht involve two s
2a3b0 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69  eparate loops wi
2a3c0 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e  th an OP_Sort in
2a3d0 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20   between, or.   
2a3e0 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62     ** it might b
2a3f0 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20  e a single loop 
2a400 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64  that uses an ind
2a410 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e  ex to extract in
2a420 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20  formation.      
2a430 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74 20  ** in the right 
2a440 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77  order to begin w
2a450 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ith..      */.  
2a460 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a470 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2a480 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64 64  b, regReset, add
2a490 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70  rReset);.      p
2a4a0 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
2a4b0 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
2a4c0 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
2a4d0 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c  re, pGroupBy, 0,
2a4e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a500 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59     WHERE_GROUPBY
2a510 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2a520 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
2a530 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
2a540 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
2a550 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49  ereIsOrdered(pWI
2a560 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nfo) ){.        
2a570 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72  /* The optimizer
2a580 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69   is able to deli
2a590 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75  ver rows in grou
2a5a0 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20  p by order so.  
2a5b0 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e        ** we do n
2a5c0 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e  ot have to sort.
2a5d0 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68    The OP_OpenEph
2a5e0 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c  emeral table wil
2a5f0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
2a600 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20  cancelled later 
2a610 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c  because we still
2a620 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68 65   need to use the
2a630 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20   pKeyInfo.      
2a640 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f    */.        gro
2a650 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20  upBySort = 0;.  
2a660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a670 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63     /* Rows are c
2a680 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64  oming out in und
2a690 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e  etermined order.
2a6a0 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75 73    We have to pus
2a6b0 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63  h.        ** eac
2a6c0 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72  h row into a sor
2a6d0 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d  ting index, term
2a6e0 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74 20  inate the first 
2a6f0 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a  loop,.        **
2a700 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20   then loop over 
2a710 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  the sorting inde
2a720 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  x in order to ge
2a730 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  t the output.   
2a740 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65       ** in sorte
2a750 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20  d order.        
2a760 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  */.        int r
2a770 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20  egBase;.        
2a780 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20  int regRecord;. 
2a790 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b         int nCol;
2a7a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72  .        int nGr
2a7b0 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20  oupBy;..        
2a7c0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2a7d0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
2a7e0 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63 74        (sDistinct
2a7f0 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73  .isTnct && (p->s
2a800 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69  elFlags&SF_Disti
2a810 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  nct)==0) ?.     
2a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2a830 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f  DISTINCT" : "GRO
2a840 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20  UP BY");..      
2a850 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20    groupBySort = 
2a860 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75  1;.        nGrou
2a870 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e  pBy = pGroupBy->
2a880 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e  nExpr;.        n
2a890 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b  Col = nGroupBy +
2a8a0 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20   1;.        j = 
2a8b0 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20  nGroupBy+1;.    
2a8c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2a8d0 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b  AggInfo.nColumn;
2a8e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2a8f0 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43   if( sAggInfo.aC
2a900 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c  ol[i].iSorterCol
2a910 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20  umn>=j ){.      
2a920 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20        nCol++;.  
2a930 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20            j++;. 
2a940 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2a950 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67     }.        reg
2a960 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
2a970 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
2a980 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, nCol);.      
2a990 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2a9a0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2a9b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a9c0 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
2a9d0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2a9e0 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a  y, regBase, 0);.
2a9f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2aa00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2aa10 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e  Sequence, sAggIn
2aa20 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65  fo.sortingIdx,re
2aa30 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b  gBase+nGroupBy);
2aa40 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72  .        j = nGr
2aa50 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20  oupBy+1;.       
2aa60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67   for(i=0; i<sAgg
2aa70 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Info.nColumn; i+
2aa80 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  +){.          st
2aa90 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c  ruct AggInfo_col
2aaa0 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e   *pCol = &sAggIn
2aab0 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20  fo.aCol[i];.    
2aac0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e        if( pCol->
2aad0 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a  iSorterColumn>=j
2aae0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2aaf0 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67  int r1 = j + reg
2ab00 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Base;.          
2ab10 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20    int r2;..     
2ab20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69         r2 = sqli
2ab30 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f  te3ExprCodeGetCo
2ab40 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20  lumn(pParse, .  
2ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
2ab70 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69  l->pTab, pCol->i
2ab80 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54  Column, pCol->iT
2ab90 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20  able, r1, 0);.  
2aba0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 31            if( r1
2abb0 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20  !=r2 ){.        
2abc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2abd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43  eAddOp2(v, OP_SC
2abe0 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20  opy, r2, r1);.  
2abf0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ac00 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
2ac10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ac20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52 65   }.        regRe
2ac30 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
2ac40 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
2ac50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ac60 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2ac70 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
2ac80 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67  gBase, nCol, reg
2ac90 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2aca0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2acb0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49  p2(v, OP_SorterI
2acc0 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e  nsert, sAggInfo.
2acd0 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52  sortingIdx, regR
2ace0 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
2acf0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2ad00 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
2ad10 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2ad20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
2ad30 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
2ad40 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29  , regBase, nCol)
2ad50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ad60 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
2ad70 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67 49  );.        sAggI
2ad80 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54  nfo.sortingIdxPT
2ad90 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20  ab = sortPTab = 
2ada0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
2adb0 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20          sortOut 
2adc0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
2add0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
2ade0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2adf0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
2ae00 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61  nPseudo, sortPTa
2ae10 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c  b, sortOut, nCol
2ae20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ae30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ae40 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73  OP_SorterSort, s
2ae50 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
2ae60 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  dx, addrEnd);.  
2ae70 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2ae80 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20  t((v, "GROUP BY 
2ae90 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20  sort"));.       
2aea0 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72   sAggInfo.useSor
2aeb0 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20  tingIdx = 1;.   
2aec0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2aed0 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
2aee0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  e);.      }..   
2aef0 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74     /* Evaluate t
2af00 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
2af10 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74   BY terms and st
2af20 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62  ore in b0, b1, b
2af30 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62  2....      ** (b
2af40 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  0 is memory loca
2af50 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31  tion iBMem+0, b1
2af60 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64   is iBMem+1, and
2af70 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20   so forth).     
2af80 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65   ** Then compare
2af90 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f   the current GRO
2afa0 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69  UP BY terms agai
2afb0 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59  nst the GROUP BY
2afc0 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20   terms.      ** 
2afd0 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75  from the previou
2afe0 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20  s row currently 
2aff0 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31  stored in a0, a1
2b000 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  , a2....      */
2b010 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66  .      addrTopOf
2b020 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Loop = sqlite3Vd
2b030 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2b040 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
2b050 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
2b060 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28  arse);.      if(
2b070 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
2b080 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b090 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b0a0 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67  SorterData, sAgg
2b0b0 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
2b0c0 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20   sortOut);.     
2b0d0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30   }.      for(j=0
2b0e0 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; j<pGroupBy->nE
2b0f0 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
2b100 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f     if( groupBySo
2b110 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
2b120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2b130 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
2b140 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d  sortPTab, j, iBM
2b150 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  em+j);.         
2b160 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69   if( j==0 ) sqli
2b170 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
2b180 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43  v, OPFLAG_CLEARC
2b190 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d  ACHE);.        }
2b1a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b1b0 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d  sAggInfo.directM
2b1c0 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ode = 1;.       
2b1d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
2b1e0 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75  de(pParse, pGrou
2b1f0 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  pBy->a[j].pExpr,
2b200 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20   iBMem+j);.     
2b210 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2b220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b230 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
2b240 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d  re, iAMem, iBMem
2b250 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  , pGroupBy->nExp
2b260 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2b270 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2b280 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
2b290 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
2b2a0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
2b2b0 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
2b2c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
2b2d0 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
2b2e0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
2b2f0 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c  P_Jump, j1+1, 0,
2b300 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f   j1+1);..      /
2b310 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2b320 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
2b330 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
2b340 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
2b350 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65  * Changes in the
2b360 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
2b370 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
2b380 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
2b390 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
2b3a0 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
2b3b0 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
2b3c0 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
2b3d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2b3e0 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
2b3f0 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
2b400 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
2b410 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
2b420 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
2b430 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
2b440 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
2b450 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
2b460 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
2b470 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2b480 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
2b490 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
2b4a0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
2b4b0 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
2b4c0 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
2b4d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2b4e0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
2b4f0 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47  iBMem, iAMem, pG
2b500 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  roupBy->nExpr);.
2b510 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b520 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2b530 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
2b540 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
2b550 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2b560 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
2b570 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
2b580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b590 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
2b5a0 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
2b5b0 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64  drEnd);.      Vd
2b5c0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63  beComment((v, "c
2b5d0 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22  heck abort flag"
2b5e0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2b5f0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2b600 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65  P_Gosub, regRese
2b610 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20  t, addrReset);. 
2b620 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2b630 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63 75  ((v, "reset accu
2b640 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  mulator"));..   
2b650 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
2b660 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2b670 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e  ulators based on
2b680 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a   the content of.
2b690 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72        ** the cur
2b6a0 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a  rent row.      *
2b6b0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2b6c0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
2b6d0 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65  1);.      update
2b6e0 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
2b6f0 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2b700 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b710 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2b720 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c  teger, 1, iUseFl
2b730 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
2b740 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69  omment((v, "indi
2b750 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63 63  cate data in acc
2b760 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
2b770 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
2b780 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a  e loop.      */.
2b790 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70 42        if( groupB
2b7a0 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  ySort ){.       
2b7b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b7c0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
2b7d0 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ext, sAggInfo.so
2b7e0 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f  rtingIdx, addrTo
2b7f0 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  pOfLoop);.      
2b800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2b810 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 70  qlite3WhereEnd(p
2b820 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
2b830 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2b840 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
2b850 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20  ortingIdx);.    
2b860 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75    }..      /* Ou
2b870 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72  tput the final r
2b880 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20  ow of result.   
2b890 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69     */.      sqli
2b8a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2b8b0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
2b8c0 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74  tputRow, addrOut
2b8d0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2b8e0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2b8f0 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77  output final row
2b900 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a  "));..      /* J
2b910 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75 62  ump over the sub
2b920 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a  routines.      *
2b930 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2b940 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2b950 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64  Goto, 0, addrEnd
2b960 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
2b970 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
2b980 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
2b990 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
2b9a0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
2b9b0 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73   ** set.  This s
2b9c0 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20  ubroutine first 
2b9d0 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73  looks at the iUs
2b9e0 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46  eFlag.  If iUseF
2b9f0 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  lag.      ** is 
2ba00 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
2ba10 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20  al to zero, the 
2ba20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20  subroutine is a 
2ba30 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20  no-op.  If.     
2ba40 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69   ** the processi
2ba50 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  ng calls for the
2ba60 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c   query to abort,
2ba70 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
2ba80 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d  .      ** increm
2ba90 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74 46  ents the iAbortF
2baa0 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lag memory locat
2bab0 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ion before retur
2bac0 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ning in.      **
2bad0 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c   order to signal
2bae0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61   the caller to a
2baf0 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bort..      */. 
2bb00 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f 72       addrSetAbor
2bb10 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
2bb20 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2bb30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2bb40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
2bb50 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46  eger, 1, iAbortF
2bb60 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2bb70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74  Comment((v, "set
2bb80 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
2bb90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2bba0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2bbb0 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
2bbc0 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ow);.      sqlit
2bbd0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
2bbe0 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74  el(v, addrOutput
2bbf0 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72  Row);.      addr
2bc00 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69  OutputRow = sqli
2bc10 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
2bc20 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr(v);.      sql
2bc30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2bc40 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65  , OP_IfPos, iUse
2bc50 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74  Flag, addrOutput
2bc60 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64  Row+2);.      Vd
2bc70 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47  beComment((v, "G
2bc80 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
2bc90 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f  nerator entry po
2bca0 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71  int"));.      sq
2bcb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2bcc0 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
2bcd0 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  gOutputRow);.   
2bce0 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75     finalizeAggFu
2bcf0 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20  nctions(pParse, 
2bd00 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
2bd10 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
2bd20 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61  alse(pParse, pHa
2bd30 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74  ving, addrOutput
2bd40 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55  Row+1, SQLITE_JU
2bd50 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
2bd60 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
2bd70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
2bd80 45 4c 69 73 74 2c 20 2d 31 2c 20 70 4f 72 64 65  EList, -1, pOrde
2bd90 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
2bda0 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73             &sDis
2bdb0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
2bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdd0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2bde0 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
2bdf0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2be00 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2be10 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
2be20 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2be30 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2be40 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
2be50 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
2be60 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
2be70 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
2be80 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
2be90 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
2bea0 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
2beb0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2bec0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2bed0 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
2bee0 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
2bef0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2bf00 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2bf10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2bf20 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2bf30 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
2bf40 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
2bf50 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
2bf60 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
2bf70 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
2bf80 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
2bf90 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  e {.      ExprLi
2bfa0 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69  st *pDel = 0;.#i
2bfb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2bfc0 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
2bfd0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
2bfe0 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20        if( (pTab 
2bff0 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  = isSimpleCount(
2c000 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d  p, &sAggInfo))!=
2c010 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2c020 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  If isSimpleCount
2c030 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  () returns a poi
2c040 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20  nter to a Table 
2c050 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a  structure, then.
2c060 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
2c070 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
2c080 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20  of the form:.   
2c090 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2c0a0 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
2c0b0 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
2c0c0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2c0d0 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20     ** where the 
2c0e0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2c0f0 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65  returned represe
2c100 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e  nts table <tbl>.
2c110 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2c120 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74      ** This stat
2c130 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d  ement is so comm
2c140 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70  on that it is op
2c150 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c  timized speciall
2c160 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  y. The.        *
2c170 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72  * OP_Count instr
2c180 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
2c190 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65  ed either on the
2c1a0 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68   intkey table th
2c1b0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
2c1c0 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20  ntains the data 
2c1d0 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20  for table <tbl> 
2c1e0 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73  or on one of its
2c1f0 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20   indexes. It.   
2c200 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65       ** is bette
2c210 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  r to execute the
2c220 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c   op on an index,
2c230 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20   as indexes are 
2c240 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a  almost.        *
2c250 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20  * always spread 
2c260 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65  across less page
2c270 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72  s than their cor
2c280 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
2c290 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2c2a0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
2c2b0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2c2c0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
2c2d0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
2c2e0 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63  hema);.        c
2c2f0 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20  onst int iCsr = 
2c300 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
2c310 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
2c320 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a   scan b-tree */.
2c330 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
2c340 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c360 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2c370 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79  e */.        Key
2c380 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
2c390 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2c3a0 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72    /* Keyinfo for
2c3b0 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a   scanned index *
2c3c0 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
2c3d0 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
2c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c3f0 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75  * Best index fou
2c400 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  nd so far */.   
2c410 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d       int iRoot =
2c420 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20   pTab->tnum;    
2c430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
2c440 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65  t page of scanne
2c450 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20  d b-tree */..   
2c460 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
2c470 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
2c480 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
2c490 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
2c4a0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
2c4b0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
2c4c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
2c4d0 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2c4e0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74   for the index t
2c4f0 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65  hat has the lowe
2c500 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20  st scan cost..  
2c510 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2c520 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29   ** (2011-04-15)
2c530 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c   Do not do a ful
2c540 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f  l scan of an uno
2c550 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20  rdered index..  
2c560 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2c570 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29   ** (2013-10-03)
2c580 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68   Do not count th
2c590 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70  e entries in a p
2c5a0 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20  artial index..  
2c5b0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2c5c0 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
2c5d0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
2c5e0 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
2c5f0 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
2c600 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
2c610 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
2c620 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
2c630 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2c640 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
2c650 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20  d(pTab) ) pBest 
2c660 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
2c670 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
2c680 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
2c690 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
2c6a0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
2c6b0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
2c6c0 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f    if( pIdx->bUno
2c6d0 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
2c6e0 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a       && pIdx->sz
2c6f0 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
2c700 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20  abRow.          
2c710 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49   && pIdx->pPartI
2c720 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20  dxWhere==0.     
2c730 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74        && (!pBest
2c740 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   || pIdx->szIdxR
2c750 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52  ow<pBest->szIdxR
2c760 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ow).          ){
2c770 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65  .            pBe
2c780 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
2c790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2c7a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65  .        if( pBe
2c7b0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
2c7c0 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74  iRoot = pBest->t
2c7d0 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  num;.          p
2c7e0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
2c7f0 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
2c800 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a  pParse, pBest);.
2c810 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2c820 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61     /* Open a rea
2c830 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65  d-only cursor, e
2c840 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f  xecute the OP_Co
2c850 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63  unt, close the c
2c860 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ursor. */.      
2c870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c880 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
2c890 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f  nRead, iCsr, iRo
2c8a0 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20  ot, iDb, 1);.   
2c8b0 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
2c8c0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
2c8d0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2c8e0 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
2c8f0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2c900 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
2c910 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2c920 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2c930 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20  OP_Count, iCsr, 
2c940 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
2c950 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
2c960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2c970 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
2c980 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65  iCsr);.        e
2c990 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2c9a0 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  t(pParse, pTab, 
2c9b0 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  pBest);.      }e
2c9c0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
2c9d0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
2c9e0 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  OUNT */.      {.
2c9f0 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2ca00 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
2ca10 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
2ca20 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
2ca30 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2ca40 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
2ca50 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  in(x) FROM .... 
2ca60 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
2ca70 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e  CT max(x) FROM .
2ca80 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ...        **.  
2ca90 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69        ** If it i
2caa0 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20  s, then ask the 
2cab0 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
2cac0 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f  to attempt to so
2cad0 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  rt results.     
2cae0 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72     ** as if ther
2caf0 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20  e was an "ORDER 
2cb00 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20  ON x" or "ORDER 
2cb10 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73  ON x DESC" claus
2cb20 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  e. .        ** I
2cb30 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c  f where.c is abl
2cb40 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73  e to produce res
2cb50 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74  ults sorted in t
2cb60 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  his order, then.
2cb70 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76          ** add v
2cb80 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61  dbe code to brea
2cb90 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f  k out of the pro
2cba0 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74  cessing loop aft
2cbb0 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  er the .        
2cbc0 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69  ** first iterati
2cbd0 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69  on (since the fi
2cbe0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
2cbf0 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20   the loop is .  
2cc00 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
2cc10 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  eed to operate o
2cc20 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74  n the row with t
2cc30 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61  he minimum or ma
2cc40 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a  ximum .        *
2cc50 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68  * value of x, th
2cc60 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69  e only row requi
2cc70 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  red)..        **
2cc80 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70  .        ** A sp
2cc90 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20  ecial flag must 
2cca0 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  be passed to sql
2ccb0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2ccc0 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   to slightly.   
2ccd0 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62       ** modify b
2cce0 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f  ehavior as follo
2ccf0 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ws:.        **. 
2cd00 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66         **   + If
2cd10 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
2cd20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
2cd30 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
2cd40 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  oded by.        
2cd50 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
2cd60 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
2cd70 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
2cd80 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
2cd90 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  lue.        **  
2cda0 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
2cdb0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2cdc0 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65    + The optimize
2cdd0 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  r code in where.
2cde0 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  c (the thing tha
2cdf0 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a  t decides which.
2ce00 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
2ce10 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
2ce20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
2ce30 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
2ce40 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
2ce50 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
2ce60 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
2ce70 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
2ce80 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
2ce90 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
2cea0 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
2ceb0 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
2cec0 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
2ced0 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
2cee0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2cef0 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
2cf00 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  x = 0;.        u
2cf10 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f  8 flag = WHERE_O
2cf20 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
2cf30 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2cf40 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
2cf50 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
2cf60 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
2cf70 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
2cf80 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
2cf90 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
2cfa0 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26   = minMaxQuery(&
2cfb0 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d  sAggInfo, &pMinM
2cfc0 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ax);.        }. 
2cfd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
2cfe0 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d  lag==0 || (pMinM
2cff0 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78  ax!=0 && pMinMax
2d000 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a  ->nExpr==1) );..
2d010 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
2d020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   ){.          pM
2d030 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
2d040 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
2d050 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20  MinMax, 0);.    
2d060 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
2d070 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20  nMax;.          
2d080 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21  if( pMinMax && !
2d090 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2d0a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d0b0 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f  pMinMax->a[0].so
2d0c0 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d  rtOrder = flag!=
2d0d0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
2d0e0 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20  N ?1:0;.        
2d0f0 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
2d100 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b  ].pExpr->op = TK
2d110 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
2d120 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d130 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69   .        /* Thi
2d140 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
2d150 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
2d160 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
2d170 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
2d180 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
2d190 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  is much simpler 
2d1a0 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f  since there is o
2d1b0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
2d1c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f  .        ** of o
2d1d0 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a  utput..        *
2d1e0 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41  /.        resetA
2d1f0 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
2d200 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2d210 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20         pWInfo = 
2d220 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2d230 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2d240 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e  st, pWhere, pMin
2d250 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20  Max,0,flag,0);. 
2d260 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66         if( pWInf
2d270 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
2d280 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2d290 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
2d2a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2d2b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2d2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d2d0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
2d2e0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
2d2f0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73  nfo);.        as
2d300 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30  sert( pMinMax==0
2d310 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   || pMinMax->nEx
2d320 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  pr==1 );.       
2d330 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2d340 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2d350 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
2d360 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2d370 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
2d380 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
2d390 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
2d3a0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
2d3b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
2d3c0 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20  ) by index",.   
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
2d3e0 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
2d3f0 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
2d400 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ")));.        }.
2d410 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2d420 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2d430 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  .        finaliz
2d440 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
2d450 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2d460 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2d470 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
2d480 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2d490 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
2d4a0 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
2d4b0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2d4c0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
2d4d0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
2d4e0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
2d4f0 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20 20  , -1, 0, 0, .   
2d500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d510 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45 6e     pDest, addrEn
2d520 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20  d, addrEnd);.   
2d530 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2d540 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
2d550 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
2d560 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2d570 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e 64  Label(v, addrEnd
2d580 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20 65  );.    .  } /* e
2d590 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20 71  ndif aggregate q
2d5a0 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20 73  uery */..  if( s
2d5b0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
2d5c0 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e  pe==WHERE_DISTIN
2d5d0 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b 0a  CT_UNORDERED ){.
2d5e0 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70 54      explainTempT
2d5f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44 49  able(pParse, "DI
2d600 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a 20  STINCT");.  }.. 
2d610 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2d620 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
2d630 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65 64  se, then we need
2d640 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65 73   to sort the res
2d650 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73 65  ults.  ** and se
2d660 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 63  nd them to the c
2d670 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20 6f  allback one by o
2d680 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ne..  */.  if( p
2d690 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 65  OrderBy ){.    e
2d6a0 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
2d6b0 70 50 61 72 73 65 2c 20 22 4f 52 44 45 52 20 42  pParse, "ORDER B
2d6c0 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61 74  Y");.    generat
2d6d0 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73 65  eSortTail(pParse
2d6e0 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d 3e  , p, v, pEList->
2d6f0 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a 20  nExpr, pDest);. 
2d700 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65   }..  /* Jump he
2d710 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73 20  re to skip this 
2d720 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71 6c  query.  */.  sql
2d730 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2d740 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a 0a  abel(v, iEnd);..
2d750 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
2d760 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
2d770 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74 68   coded.   Set th
2d780 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74 6f  e return code to
2d790 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63   0.  ** to indic
2d7a0 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a 20  ate no errors.. 
2d7b0 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a 20   */.  rc = 0;.. 
2d7c0 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70   /* Control jump
2d7d0 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e 20  s to here if an 
2d7e0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
2d7f0 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20 75  ered above, or u
2d800 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73  pon.  ** success
2d810 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74 68  ful coding of th
2d820 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73  e SELECT..  */.s
2d830 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78 70  elect_end:.  exp
2d840 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
2d850 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
2d860 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
2d870 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e 74  Id);..  /* Ident
2d880 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ify column names
2d890 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20 74   if results of t
2d8a0 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74 6f  he SELECT are to
2d8b0 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
2d8c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2d8d0 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e 65  E_OK && pDest->e
2d8e0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
2d8f0 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
2d900 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
2d910 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45  se, pTabList, pE
2d920 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  List);.  }..  sq
2d930 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2d940 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a  sAggInfo.aCol);.
2d950 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2d960 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  db, sAggInfo.aFu
2d970 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nc);.  return rc
2d980 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
2d990 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
2d9a0 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a  REE_EXPLAIN)./*.
2d9b0 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68 75  ** Generate a hu
2d9c0 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65 73  man-readable des
2d9d0 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 74 68  cription of a th
2d9e0 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 2e  e Select object.
2d9f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2da00 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74  explainOneSelect
2da10 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65  (Vdbe *pVdbe, Se
2da20 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c 69  lect *p){.  sqli
2da30 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2da40 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43 54 20  (pVdbe, "SELECT 
2da50 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c  ");.  if( p->sel
2da60 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
2da70 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
2da80 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  e) ){.    if( p-
2da90 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
2daa0 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20  istinct ){.     
2dab0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2dac0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 44 49  rintf(pVdbe, "DI
2dad0 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20 20 7d  STINCT ");.    }
2dae0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  .    if( p->selF
2daf0 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
2db00 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
2db10 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2db20 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f 66 6c  f(pVdbe, "agg_fl
2db30 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ag ");.    }.   
2db40 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2db50 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    sq
2db60 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2db70 74 66 28 70 56 64 62 65 2c 20 22 20 20 20 22 29  tf(pVdbe, "   ")
2db80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
2db90 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
2dba0 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  Vdbe, p->pEList)
2dbb0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
2dbc0 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 69  inNL(pVdbe);.  i
2dbd0 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70 2d  f( p->pSrc && p-
2dbe0 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20  >pSrc->nSrc ){. 
2dbf0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71     int i;.    sq
2dc00 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2dc10 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f 4d 20  tf(pVdbe, "FROM 
2dc20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2dc30 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65  xplainPush(pVdbe
2dc40 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
2dc50 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
2dc60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
2dc70 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2dc80 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
2dc90 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
2dca0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2dcb0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b 25 64  intf(pVdbe, "{%d
2dcc0 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d 3e  ,*} = ", pItem->
2dcd0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2dce0 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
2dcf0 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
2dd00 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65  lite3ExplainSele
2dd10 63 74 28 70 56 64 62 65 2c 20 70 49 74 65 6d 2d  ct(pVdbe, pItem-
2dd20 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
2dd30 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 54     if( pItem->pT
2dd40 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
2dd50 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2dd60 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28 74  intf(pVdbe, " (t
2dd70 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49 74  abname=%s)", pIt
2dd80 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
2dd90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2dda0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65    }else if( pIte
2ddb0 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  m->zName ){.    
2ddc0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2ddd0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2dde0 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61  "%s", pItem->zNa
2ddf0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
2de00 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
2de10 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
2de20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2de30 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28 41  intf(pVdbe, " (A
2de40 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 7a  S %s)", pItem->z
2de50 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a  Alias);.      }.
2de60 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
2de70 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
2de80 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  EFT ){.        s
2de90 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2dea0 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c 45 46  ntf(pVdbe, " LEF
2deb0 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20 20  T-JOIN");.      
2dec0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
2ded0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2dee0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2def0 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64  e3ExplainPop(pVd
2df00 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
2df10 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20  ->pWhere ){.    
2df20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2df30 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57 48 45  intf(pVdbe, "WHE
2df40 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  RE ");.    sqlit
2df50 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2df60 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b  dbe, p->pWhere);
2df70 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2df80 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2df90 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f 75  }.  if( p->pGrou
2dfa0 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pBy ){.    sqlit
2dfb0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2dfc0 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42 59 20  pVdbe, "GROUPBY 
2dfd0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2dfe0 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
2dff0 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70 42  Vdbe, p->pGroupB
2e000 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
2e010 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2e020 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 48  .  }.  if( p->pH
2e030 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71 6c  aving ){.    sql
2e040 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2e050 66 28 70 56 64 62 65 2c 20 22 48 41 56 49 4e 47  f(pVdbe, "HAVING
2e060 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2e070 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62  ExplainExpr(pVdb
2e080 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  e, p->pHaving);.
2e090 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2e0a0 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
2e0b0 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
2e0c0 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  By ){.    sqlite
2e0d0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2e0e0 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59 20 22  Vdbe, "ORDERBY "
2e0f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2e100 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 56  plainExprList(pV
2e110 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  dbe, p->pOrderBy
2e120 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2e130 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2e140 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69    }.  if( p->pLi
2e150 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
2e160 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2e170 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20 22 29  pVdbe, "LIMIT ")
2e180 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2e190 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
2e1a0 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
2e1b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2e1c0 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
2e1d0 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29 7b  f( p->pOffset ){
2e1e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2e1f0 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2e200 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20 20 20   "OFFSET ");.   
2e210 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
2e220 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4f  xpr(pVdbe, p->pO
2e230 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69  ffset);.    sqli
2e240 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2e250 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  be);.  }.}.void 
2e260 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
2e270 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62 65  lect(Vdbe *pVdbe
2e280 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
2e290 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
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 28 6e 75  intf(pVdbe, "(nu
2e2c0 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20 20  ll-select)");.  
2e2d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2e2e0 77 68 69 6c 65 28 20 70 2d 3e 70 50 72 69 6f 72  while( p->pPrior
2e2f0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f   ){.    p->pPrio
2e300 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  r->pNext = p;.  
2e310 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b    p = p->pPrior;
2e320 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
2e330 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65 29  plainPush(pVdbe)
2e340 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
2e350 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65      explainOneSe
2e360 6c 65 63 74 28 70 56 64 62 65 2c 20 70 29 3b 0a  lect(pVdbe, p);.
2e370 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
2e380 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
2e390 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69   break;.    sqli
2e3a0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2e3b0 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  be);.    sqlite3
2e3c0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2e3d0 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20 73 65 6c  dbe, "%s\n", sel
2e3e0 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
2e3f0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2e400 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2e410 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a 20 20 73  dbe, "END");.  s
2e420 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
2e430 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a 20 45  (pVdbe);.}../* E
2e440 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74  nd of the struct
2e450 75 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69  ure debug printi
2e460 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  ng code.********
2e470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e4b0 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
2e4c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2e4d0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
2e4e0 41 49 4e 29 20 2a 2f 0a                          AIN) */.