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

Artifact 29976d169853492a20d3201e8a83eeefa39a868f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  fset);.  sqlite3
0400: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0410: 2d 3e 70 57 69 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pWith);.}../*.
0420: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0430: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0440: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0450: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0460: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0470: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0480: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0490: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
04a0: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
04b0: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
04c0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04d0: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
04e0: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
04f0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0500: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0510: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0520: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0530: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0540: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0550: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0560: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0570: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0580: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0590: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
05a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
05b0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
05c0: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
05d0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
05e0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
05f0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0600: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0610: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0620: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0630: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0640: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0650: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0660: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0670: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0680: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0690: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
06a0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
06b0: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
06c0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
06d0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
06e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
06f0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0700: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0710: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0720: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0730: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0740: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0750: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0760: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0770: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0780: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0790: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
07a0: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
07b0: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07c0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07d0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07f0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0810: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0820: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0830: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0840: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0850: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0860: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0870: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0880: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0890: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
08a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
08b0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08c0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08d0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0900: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0910: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0920: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0930: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0940: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0950: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0960: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0970: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0980: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0990: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
09a0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09c0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09e0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09f0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0a00: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
0a10: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a20: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a30: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
0a40: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
0a50: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
0a60: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
0a70: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
0a80: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
0a90: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
0aa0: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
0ab0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0ac0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0ad0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ae0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0af0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0b00: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  ] = -1;.  if( db
0b10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0b20: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
0b30: 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ct(db, pNew);.  
0b40: 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61    if( pNew!=&sta
0b50: 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62  ndin ) sqlite3Db
0b60: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
0b70: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
0b80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
0b90: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
0ba0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
0bb0: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
0bc0: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
0bd0: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
0be0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0bf0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0c00: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0c10: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0c20: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0c40: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0c50: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0c60: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0c70: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0c80: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0c90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0ca0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0cb0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0cc0: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
0cd0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0ce0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0cf0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0d00: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0d10: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0d20: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0d30: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0d40: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0d50: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0d60: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0d70: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
0d80: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
0d90: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0da0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0db0: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0dc0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0dd0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0de0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0df0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0e00: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0e10: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0e20: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0e30: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0e40: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0e50: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0e60: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0e70: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0e80: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0e90: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
0ea0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0eb0: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0ec0: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0ed0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0ee0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0ef0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0f00: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
0f30: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
0f40: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
0f50: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0f60: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
0f70: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
0f80: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
0f90: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0fa0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
0fb0: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
0fc0: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
0fd0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
0fe0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
0ff0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
1000: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
1010: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
1020: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1030: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1040: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1050: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1060: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1070: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1080: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1090: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
10a0: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
10b0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
10c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
10d0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
10e0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
1110: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
1120: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1130: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1140: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1150: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1160: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1170: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1180: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1190: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
11a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
11b0: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
11c0: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
11d0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
11e0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
11f0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
1200: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
1210: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
1220: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1230: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1240: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1250: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1260: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1270: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1280: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1290: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
12a0: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
12b0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
12c0: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
12d0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
12e0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
12f0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1300: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1310: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1320: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1340: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1350: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1360: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1370: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1380: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1390: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
13a0: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
13b0: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
13c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
13e0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
13f0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1400: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1410: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1420: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1430: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1440: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1450: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1460: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1470: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1480: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1490: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14a0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
14b0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
14c0: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
14d0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
14e0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
14f0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1500: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1510: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1520: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1530: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1540: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1550: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1560: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1570: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1580: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1590: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
15a0: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
15b0: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
15c0: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
15d0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
15e0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
15f0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1600: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1610: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1620: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1630: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1640: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1650: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1670: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1680: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1690: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
16a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
16b0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
16c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
16d0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
16e0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
16f0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1700: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1710: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1720: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1730: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1740: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1750: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1760: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1770: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1780: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1790: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
17a0: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
17b0: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
17c0: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
17d0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
17e0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
17f0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1800: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1810: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1820: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
1830: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
1840: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
1850: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
1860: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
1870: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
1880: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
1890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18a0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
18b0: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
18c0: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
18d0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
18e0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
18f0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
1900: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
1910: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
1920: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
1930: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
1940: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
1950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1960: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
1970: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
1980: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
1990: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
19a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
19b0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
19c0: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
19d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
19e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19f0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
1a00: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
1a10: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
1a20: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
1a30: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
1a40: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
1a50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
1a60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
1a70: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
1a80: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
1a90: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
1aa0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
1ab0: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
1ac0: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
1ad0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
1ae0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
1af0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1b00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
1b20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1b30: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
1b40: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
1b50: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
1b60: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
1b70: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
1b80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1b90: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
1ba0: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
1bb0: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
1bc0: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
1bd0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1be0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
1bf0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
1c00: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
1c10: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
1c20: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
1c30: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
1c40: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
1c50: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
1c60: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
1c70: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
1c80: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
1c90: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
1ca0: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
1cb0: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1cc0: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
1cd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1cf0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d00: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1d30: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
1d40: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
1d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1d70: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
1d80: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
1d90: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
1da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1db0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1dc0: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
1dd0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1de0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
1df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1e00: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
1e10: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
1e20: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1e50: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
1e60: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
1e70: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e90: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
1ea0: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
1eb0: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
1ee0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
1ef0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
1f00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1f10: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
1f20: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
1f30: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
1f40: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
1f50: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
1f60: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
1f70: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1f80: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
1f90: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
1fa0: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
1fb0: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
1fc0: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
1fd0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
1fe0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
1ff0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
2000: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
2010: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
2020: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2030: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2040: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2050: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2060: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2070: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2080: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2090: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20a0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
20b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20c0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
20e0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
20f0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2100: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2110: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2120: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2130: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2140: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2150: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2160: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2170: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2180: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2190: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
21a0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
21b0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
21c0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
21d0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
21e0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
21f0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2200: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2210: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2220: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2230: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2240: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2250: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2260: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2270: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2280: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2290: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
22a0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
22b0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
22c0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
22d0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
22e0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
22f0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2300: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2310: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2320: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2330: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2340: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2350: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2360: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2370: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2380: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2390: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
23a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
23b0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
23c0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
23e0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
23f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2400: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2410: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2420: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2430: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2440: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2450: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2460: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2470: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2480: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2490: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
24a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
24b0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
24c0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
24d0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
24e0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
24f0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2500: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2510: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2520: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2530: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2540: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2550: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2560: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2570: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2580: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2590: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
25a0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
25b0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
25c0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
25d0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
25e0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
25f0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2600: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2610: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2620: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2630: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2640: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2650: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2660: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2670: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2680: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2690: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
26a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
26b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
26c0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
26d0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
26e0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
26f0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2700: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2710: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2720: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2730: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2740: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2750: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2770: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2780: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2790: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
27a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
27b0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
27c0: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
27d0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
27e0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
27f0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2800: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2810: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2820: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
2830: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
2840: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
2850: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
2860: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
2870: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
2880: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
2890: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
28a0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
28b0: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
28c0: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
28d0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
28e0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
28f0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
2900: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
2910: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
2920: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
2930: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
2940: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
2950: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
2960: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
2970: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
2980: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
2990: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
29a0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
29b0: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
29c0: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
29d0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29e0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29f0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
2a00: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2a10: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
2a20: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
2a30: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2a40: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
2a70: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a80: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
2a90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ab0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
2ac0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ad0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
2ae0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
2af0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
2b00: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b10: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
2b20: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
2b30: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
2b40: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
2b50: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
2b60: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
2b70: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
2b80: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
2b90: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
2ba0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
2bc0: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
2bd0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
2be0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
2bf0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
2c00: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
2c10: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
2c20: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
2c30: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
2c40: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
2c50: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
2c60: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2c70: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
2c80: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
2c90: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
2ca0: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
2cb0: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
2cc0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
2cd0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
2ce0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
2cf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d00: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
2d10: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
2d20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
2d30: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
2d40: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
2d50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
2d70: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
2d80: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
2d90: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
2da0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
2db0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
2dc0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
2dd0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2de0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
2df0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
2e00: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
2e10: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
2e20: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
2e30: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
2e40: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
2e50: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
2e60: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
2e70: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
2e80: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
2e90: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
2ea0: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
2eb0: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
2ec0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
2ed0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
2ee0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
2ef0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
2f00: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
2f10: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
2f20: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2f30: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
2f40: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
2f50: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2f70: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
2f80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2fa0: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
2fb0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2fc0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2fd0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
2fe0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2ff0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
3000: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
3010: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3020: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3030: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3040: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3050: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3060: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3080: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3090: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
30a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
30b0: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
30c0: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
30d0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
30e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
30f0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
3100: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
3110: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
3120: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3130: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3140: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3150: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3160: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3170: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3180: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3190: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
31a0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
31b0: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
31c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
31d0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
31e0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
31f0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
3200: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
3210: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
3220: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3230: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3240: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3250: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3260: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3270: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3280: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3290: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
32a0: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
32b0: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
32c0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
32d0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
32e0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
32f0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3300: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3310: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3320: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3330: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3340: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3350: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3360: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3370: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3380: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
33a0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
33b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
33c0: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
33d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
33e0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
33f0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3400: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3410: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3430: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3440: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3450: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3460: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3470: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3480: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3490: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
34a0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
34b0: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
34c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
34d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
34e0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
34f0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3500: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3510: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3520: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3530: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3540: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3550: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3560: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3570: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3590: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
35a0: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
35b0: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
35c0: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
35d0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
35e0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
35f0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3620: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3630: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3640: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3650: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3680: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3690: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
36a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
36b0: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
36c0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
36d0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
36e0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
36f0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
3700: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
3710: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
3720: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
3730: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3740: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3750: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3760: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
3770: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
3780: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
3790: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
37a0: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
37b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
37c0: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20  /.  int regData 
37d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37e0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
37f0: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
3800: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3810: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3820: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
3830: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3840: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3850: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3860: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
3870: 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67  pr+2);.  int reg
3880: 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
3890: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
38a0: 65 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20  e);.  int op;.  
38b0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
38c0: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
38d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
38e0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
38f0: 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61   pOrderBy, regBa
3900: 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  se, 0);.  sqlite
3910: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3920: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
3930: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3940: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
3950: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3960: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
3970: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
3980: 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71  Expr+1, 1);.  sq
3990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
39a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
39b0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
39c0: 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29   + 2, regRecord)
39d0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  ;.  if( pSelect-
39e0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
39f0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
3a00: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
3a10: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
3a20: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
3a30: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
3a40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3a50: 20 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69   op, pOrderBy->i
3a60: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
3a70: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
3a80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
3a90: 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
3aa0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
3ab0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
3ac0: 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  e, regBase, nExp
3ad0: 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  r+2);.  if( pSel
3ae0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ect->iLimit ){. 
3af0: 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
3b00: 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  dr2;.    int iLi
3b10: 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65  mit;.    if( pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b  lect->iOffset ){
3b30: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
3b40: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
3b50: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
3b60: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
3b70: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
3b80: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d     }.    addr1 =
3b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ba0: 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p1(v, OP_IfZero,
3bb0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71   iLimit);.    sq
3bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3bd0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c  v, OP_AddImm, iL
3be0: 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  imit, -1);.    a
3bf0: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
3c00: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
3c10: 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oto);.    sqlite
3c20: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3c30: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
3c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3c50: 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65  , OP_Last, pOrde
3c60: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
3c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3c80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
3c90: 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  te, pOrderBy->iE
3ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
3cb0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3cc0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
3cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
3ce0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
3cf0: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
3d00: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
3d10: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
3d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3d30: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3d40: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
3d50: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
3d60: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
3d70: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3d80: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3d90: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
3da0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
3db0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
3dc0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
3dd0: 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74  iOffset && iCont
3de0: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
3df0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
3e00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3e10: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
3e20: 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20  iOffset, -1);.  
3e30: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
3e40: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
3e50: 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73  _IfNeg, p->iOffs
3e60: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
3e70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3e80: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
3e90: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
3ea0: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20  mment((v, "skip 
3eb0: 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29  OFFSET records")
3ec0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3ed0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3ee0: 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  dr);.  }.}../*.*
3ef0: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
3f00: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
3f10: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
3f20: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
3f30: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
3f40: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
3f50: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
3f60: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
3f70: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
3f80: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
3f90: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
3fa0: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
3fb0: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
3fc0: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
3fd0: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
3fe0: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
3ff0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
4000: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
4010: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
4020: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
4030: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
4040: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
4050: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
4060: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
4070: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
4080: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4090: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
40a0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
40b0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
40c0: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
40d0: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
40e0: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
40f0: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
4100: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
4110: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
4120: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
4130: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
4140: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
4150: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4160: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
4170: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
4180: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
4190: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
41a0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
41b0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
41c0: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
41d0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
41e0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
41f0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
4200: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
4210: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d  , addrRepeat, iM
4220: 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65  em, N);.  sqlite
4230: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4240: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
4250: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
4260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4270: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
4280: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
4290: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
42a0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
42b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
42c0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
42d0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
42e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
42f0: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
4300: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
4310: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
4320: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
4330: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
4340: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
4350: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
4360: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
4370: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
4380: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
4390: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
43a0: 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a   used to occur.*
43b0: 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  * in multiple pl
43c0: 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f  aces.  (The erro
43d0: 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e  r only occurs in
43e0: 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20   one place now, 
43f0: 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e  but we.** retain
4400: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
4410: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65  to minimize code
4420: 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f   disruption.).*/
4430: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
4440: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
4450: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
4460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4470: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
4480: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
4490: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
44a0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
44b0: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
44c0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
44d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
44e0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
44f0: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
4500: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
4510: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4520: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
4530: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
4540: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
4550: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
4560: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4570: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
4580: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
4590: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
45a0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
45b0: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
45c0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
45d0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
45e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
45f0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23  eturn 0;.  }.}.#
4600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  endif../*.** An 
4610: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
4620: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74  following object
4630: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f   is used to reco
4640: 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  rd information a
4650: 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70  bout.** how to p
4660: 72 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49  rocess the DISTI
4670: 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20  NCT keyword, to 
4680: 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67  simplify passing
4690: 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   that informatio
46a0: 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65  n.** into the se
46b0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
46c0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65  routine..*/.type
46d0: 64 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69  def struct Disti
46e0: 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43  nctCtx DistinctC
46f0: 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69  tx;.struct Disti
4700: 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73  nctCtx {.  u8 is
4710: 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  Tnct;      /* Tr
4720: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
4730: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
4740: 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54  esent */.  u8 eT
4750: 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e  nctType;   /* On
4760: 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44  e of the WHERE_D
4770: 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74  ISTINCT_* operat
4780: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62  ors */.  int tab
4790: 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65  Tnct;    /* Ephe
47a0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64  meral table used
47b0: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
47c0: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
47d0: 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a  t addrTnct;   /*
47e0: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
47f0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63  penEphemeral opc
4800: 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20  ode for tabTnct 
4810: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.};../*.** Thi
4820: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
4830: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
4840: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
4850: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
4860: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
4870: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e  .** If srcTab an
4880: 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f  d nColumn are bo
4890: 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  th zero, then th
48a0: 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  e pEList express
48b0: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
48c0: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
48d0: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
48e0: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
48f0: 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68   nColumn>0.** th
4900: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
4910: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
4920: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
4930: 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65   only to get the
4940: 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f  .** datatypes fo
4950: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
4960: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
4970: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
4980: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4990: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
49b0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
49d0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
49e0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
49f0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
4a00: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
4a10: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
4a20: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
4a30: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
4a40: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
4a50: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
4a60: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
4a70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
4a80: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
4a90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
4aa0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
4ab0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
4ac0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
4ad0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
4ae0: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
4af0: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
4b00: 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
4b10: 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a  x *pDistinct, /*
4b20: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
4b30: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
4b40: 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  cess DISTINCT */
4b50: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
4b60: 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f  Dest,      /* Ho
4b70: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
4b80: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
4b90: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
4ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
4bb0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
4bc0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
4bd0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4bf0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
4c00: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
4c10: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
4c20: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c30: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c40: 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74  i;.  int hasDist
4c50: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
4c60: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
4c70: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
4c80: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
4c90: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
4ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
4cb0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
4cc0: 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a  ing result set *
4cd0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  /.  int eDest = 
4ce0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20  pDest->eDest;   
4cf0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
4d00: 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a  e of results */.
4d10: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
4d20: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a  est->iSDParm; /*
4d30: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
4d40: 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  to disposal meth
4d50: 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73  od */.  int nRes
4d60: 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  ultCol;         
4d70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4d80: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
4d90: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
4da0: 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
4db0: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
4dc0: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
4dd0: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
4de0: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
4df0: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
4e00: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
4e10: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
4e20: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
4e30: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
4e40: 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  ){.    codeOffse
4e50: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
4e60: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
4e70: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
4e80: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
4e90: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4ea0: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4eb0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74  lse{.    nResult
4ed0: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
4ee0: 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  xpr;.  }.  if( p
4ef0: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
4f00: 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  {.    pDest->iSd
4f10: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
4f20: 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  m+1;.    pDest->
4f30: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
4f40: 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ol;.    pParse->
4f50: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
4f60: 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20  ol;.  }else{ .  
4f70: 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
4f80: 3e 6e 53 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43  >nSdst==nResultC
4f90: 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52  ol );.  }.  regR
4fa0: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
4fb0: 53 64 73 74 3b 0a 20 20 69 66 28 20 6e 43 6f 6c  Sdst;.  if( nCol
4fc0: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72  umn>0 ){.    for
4fd0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
4fe0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
4ff0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5000: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
5010: 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c  Tab, i, regResul
5020: 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  t+i);.    }.  }e
5030: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
5040: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
5050: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
5060: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
5070: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
5080: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
5090: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
50a0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
50b0: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
50c0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
50d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50e0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
50f0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
5100: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74   (eDest==SRT_Out
5130: 70 75 74 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c  put)?SQLITE_ECEL
5140: 5f 44 55 50 3a 30 29 3b 0a 20 20 7d 0a 20 20 6e  _DUP:0);.  }.  n
5150: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
5160: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
5170: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5180: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
5190: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
51a0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
51b0: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
51c0: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
51d0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
51e0: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
51f0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
5200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
5210: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
5220: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
5230: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5240: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
5250: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73  nColumn );.    s
5260: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
5270: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
5280: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
5290: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
52a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
52b0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
52c0: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
52d0: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
52e0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
52f0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
5300: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
5310: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
5320: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
5330: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
5340: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
5350: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
5360: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
5370: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
5380: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
5390: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
53a0: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
53b0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
53c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
53d0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20   nColumn;..     
53e0: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
53f0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
5400: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
5410: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
5420: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
5430: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
5440: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
5450: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
5460: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
5470: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
5480: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
5490: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
54a0: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
54b0: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
54c0: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
54d0: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
54e0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
54f0: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
5500: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
5510: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
5520: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5530: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5540: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5550: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
5560: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
5570: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
5580: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
5590: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
55a0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
55b0: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
55c0: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
55d0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
55e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
55f0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
5600: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
5610: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
5620: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5630: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
5640: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5650: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5660: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
5670: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
5680: 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29  f( i<nColumn-1 )
5690: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
56a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
56b0: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
56c0: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
56d0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
56e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5700: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5710: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
5720: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
5730: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
5740: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
5750: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5760: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
5770: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
5780: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
5790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
57a0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
57b0: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
57c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
57d0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
57e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
57f0: 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20  iJump );.       
5800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5810: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
5820: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
5830: 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20  v, nColumn-1);. 
5840: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5850: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
5860: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5870: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
5880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5890: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
58a0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
58b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
58c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
58d0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
58e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
58f0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
5900: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
5910: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
5920: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
5930: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
5940: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
5950: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
5960: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
5970: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5980: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5990: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
59a0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
59b0: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
59c0: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
59d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
59e0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
59f0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
5a00: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
5a10: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
5a20: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
5a30: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
5a40: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
5a50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5a60: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
5a70: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
5a80: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
5a90: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
5aa0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5ab0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
5ac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5ad0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5ae0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5af0: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
5b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5b10: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5b20: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
5b30: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5b40: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5b50: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5b60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5b70: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
5b80: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
5b90: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
5ba0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
5bb0: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
5bc0: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
5bd0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
5be0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
5bf0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
5c00: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
5c10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5c20: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
5c30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
5c50: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
5c60: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5c70: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
5c80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
5c90: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
5ca0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
5cb0: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
5cc0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
5cd0: 73 65 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65  se SRT_DistTable
5ce0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54  :.    case SRT_T
5cf0: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
5d00: 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20  RT_EphemTab: {. 
5d10: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
5d20: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
5d30: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74  pParse);.      t
5d40: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
5d50: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
5d60: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
5d70: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
5d80: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
5d90: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
5da0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
5db0: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
5dc0: 2c 20 72 31 29 3b 0a 23 69 66 6e 64 65 66 20 53  , r1);.#ifndef S
5dd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
5de0: 20 20 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d       if( eDest==
5df0: 53 52 54 5f 44 69 73 74 54 61 62 6c 65 20 29 7b  SRT_DistTable ){
5e00: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
5e10: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  he destination i
5e20: 73 20 44 69 73 74 54 61 62 6c 65 2c 20 74 68 65  s DistTable, the
5e30: 6e 20 63 75 72 73 6f 72 20 28 69 50 61 72 6d 2b  n cursor (iParm+
5e40: 31 29 20 69 73 20 6f 70 65 6e 0a 20 20 20 20 20  1) is open.     
5e50: 20 20 20 2a 2a 20 6f 6e 20 61 6e 20 65 70 68 65     ** on an ephe
5e60: 6d 65 72 61 6c 20 69 6e 64 65 78 2e 20 49 66 20  meral index. If 
5e70: 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
5e80: 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  is already prese
5e90: 6e 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  nt.        ** in
5ea0: 20 74 68 65 20 69 6e 64 65 78 2c 20 64 6f 20 6e   the index, do n
5eb0: 6f 74 20 77 72 69 74 65 20 69 74 20 74 6f 20 74  ot write it to t
5ec0: 68 65 20 6f 75 74 70 75 74 2e 20 49 66 20 6e 6f  he output. If no
5ed0: 74 2c 20 61 64 64 20 74 68 65 0a 20 20 20 20 20  t, add the.     
5ee0: 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 72 6f     ** current ro
5ef0: 77 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 61  w to the index a
5f00: 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  nd proceed with 
5f10: 77 72 69 74 69 6e 67 20 69 74 20 74 6f 20 74 68  writing it to th
5f20: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
5f30: 70 75 74 20 74 61 62 6c 65 20 61 73 20 77 65 6c  put table as wel
5f40: 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  l.  */.        i
5f50: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
5f60: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
5f70: 28 76 29 20 2b 20 34 3b 0a 20 20 20 20 20 20 20  (v) + 4;.       
5f80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5f90: 70 34 49 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e  p4Int(v, OP_Foun
5fa0: 64 2c 20 69 50 61 72 6d 2b 31 2c 20 61 64 64 72  d, iParm+1, addr
5fb0: 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , r1, 0);.      
5fc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5fd0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
5fe0: 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72 31  ert, iParm+1, r1
5ff0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
6000: 74 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t( pOrderBy==0 )
6010: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
6020: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
6030: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70  rBy ){.        p
6040: 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50  ushOntoSorter(pP
6050: 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
6060: 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65  p, r1);.      }e
6070: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
6080: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
6090: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
60a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
60b0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
60c0: 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d  _NewRowid, iParm
60d0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
60e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
60f0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69  (v, OP_Insert, i
6100: 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20  Parm, r1, r2);. 
6110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6120: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
6130: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
6140: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6150: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6160: 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
6170: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
6180: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6190: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
61a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
61b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
61c0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
61d0: 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
61e0: 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
61f0: 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
6200: 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
6210: 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
6220: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
6230: 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
6240: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
6250: 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
6260: 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
6270: 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
6280: 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
6290: 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
62a0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
62b0: 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20   nColumn==1 );. 
62c0: 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53       pDest->affS
62d0: 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20  dst =.          
62e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
62f0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
6300: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
6310: 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  r, pDest->affSds
6320: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  t);.      if( pO
6330: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
6340: 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c    /* At first gl
6350: 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74  ance you would t
6360: 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70  hink we could op
6370: 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20  timize out the. 
6380: 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20         ** ORDER 
6390: 42 59 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  BY in this case 
63a0: 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20  since the order 
63b0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
63c0: 65 20 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a  e set.        **
63d0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
63e0: 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d 69 67  .  But there mig
63f0: 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c  ht be a LIMIT cl
6400: 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20  ause, in which. 
6410: 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74         ** case t
6420: 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61  he order does ma
6430: 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  tter */.        
6440: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
6450: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
6460: 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a   p, regResult);.
6470: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6480: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
6490: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
64a0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
64b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
64c0: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
64d0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 31  ord, regResult,1
64e0: 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66  ,r1, &pDest->aff
64f0: 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
6500: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6510: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
6520: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
6530: 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  lt, 1);.        
6540: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6550: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
6560: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
6570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
6580: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6590: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
65a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
65b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
65c0: 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e  any row exist in
65d0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
65e0: 20 72 65 63 6f 72 64 20 74 68 61 74 20 66 61 63   record that fac
65f0: 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20  t and abort..   
6600: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
6610: 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20  _Exists: {.     
6620: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6630: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6640: 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20  , 1, iParm);.   
6650: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
6660: 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d  clause will term
6670: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66  inate the loop f
6680: 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62  or us */.      b
6690: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
66a0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
66b0: 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74   scalar select t
66c0: 68 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 61  hat is part of a
66d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  n expression, th
66e0: 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20  en.    ** store 
66f0: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74  the results in t
6700: 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d  he appropriate m
6710: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62  emory cell and b
6720: 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20  reak out.    ** 
6730: 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70  of the scan loop
6740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
6750: 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20  e SRT_Mem: {.   
6760: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
6770: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  mn==1 );.      i
6780: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
6790: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
67a0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
67b0: 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65  rderBy, p, regRe
67c0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
67d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
67e0: 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28  te3ExprCodeMove(
67f0: 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c  pParse, regResul
6800: 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20  t, iParm, 1);.  
6810: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
6820: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
6830: 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
6840: 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
6850: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
6860: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
6870: 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
6880: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20  E_OMIT_SUBQUERY 
6890: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20  */..    /* Send 
68a0: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 20  the data to the 
68b0: 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
68c0: 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75  n or to a subrou
68d0: 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20  tine.  In the.  
68e0: 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73    ** case of a s
68f0: 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73  ubroutine, the s
6900: 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66  ubroutine itself
6910: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
6920: 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69  for.    ** poppi
6930: 6e 67 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d  ng the data from
6940: 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20   the stack..    
6950: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
6960: 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63  Coroutine:.    c
6970: 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20  ase SRT_Output: 
6980: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
6990: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
69a0: 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20  outine );.      
69b0: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
69c0: 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20  =SRT_Output );. 
69d0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
69e0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
69f0: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
6a00: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
6a10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6a20: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
6a30: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
6a40: 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c  Result, nColumn,
6a50: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75   r1);.        pu
6a60: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
6a70: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
6a80: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73  , r1);.        s
6a90: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6aa0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
6ab0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6ac0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  ( eDest==SRT_Cor
6ad0: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  outine ){.      
6ae0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6af0: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
6b00: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29   pDest->iSDParm)
6b10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6b20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6b30: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
6b40: 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73  esultRow, regRes
6b50: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  ult, nColumn);. 
6b60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6b70: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
6b80: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
6b90: 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e  gResult, nColumn
6ba0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
6bc0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6bd0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
6be0: 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20  .    /* Discard 
6bf0: 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68  the results.  Th
6c00: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 53  is is used for S
6c10: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
6c20: 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74   inside.    ** t
6c30: 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49  he body of a TRI
6c40: 47 47 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f  GGER.  The purpo
6c50: 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63  se of such selec
6c60: 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20  ts is to call.  
6c70: 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65    ** user-define
6c80: 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  d functions that
6c90: 20 68 61 76 65 20 73 69 64 65 20 65 66 66 65 63   have side effec
6ca0: 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63  ts.  We do not c
6cb0: 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74  are.    ** about
6cc0: 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 73 75   the actual resu
6cd0: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
6ce0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
6cf0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
6d00: 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52  ssert( eDest==SR
6d10: 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20  T_Discard );.   
6d20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6d30: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
6d40: 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64   Jump to the end
6d50: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20   of the loop if 
6d60: 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61  the LIMIT is rea
6d70: 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69  ched.  Except, i
6d80: 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  f.  ** there is 
6d90: 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69  a sorter, in whi
6da0: 63 68 20 63 61 73 65 20 74 68 65 20 73 6f 72 74  ch case the sort
6db0: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c  er has already l
6dc0: 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  imited.  ** the 
6dd0: 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20  output for us.. 
6de0: 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
6df0: 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d  By==0 && p->iLim
6e00: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
6e10: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6e20: 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69  P_IfZero, p->iLi
6e30: 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29  mit, iBreak, -1)
6e40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
6e50: 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66  llocate a KeyInf
6e60: 6f 20 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69  o object suffici
6e70: 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  ent for an index
6e80: 20 6f 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e   of N key column
6e90: 73 20 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61  s and.** X extra
6ea0: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79   columns..*/.Key
6eb0: 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79  Info *sqlite3Key
6ec0: 49 6e 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65  InfoAlloc(sqlite
6ed0: 33 20 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e  3 *db, int N, in
6ee0: 74 20 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20  t X){.  KeyInfo 
6ef0: 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  *p = sqlite3DbMa
6f00: 6c 6c 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20  llocZero(0, .   
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f20: 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
6f30: 2b 20 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28  + (N+X)*(sizeof(
6f40: 43 6f 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20  CollSeq*)+1));. 
6f50: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
6f60: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
6f70: 38 2a 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58  8*)&p->aColl[N+X
6f80: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64  ];.    p->nField
6f90: 20 3d 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70   = (u16)N;.    p
6fa0: 2d 3e 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36  ->nXField = (u16
6fb0: 29 58 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d  )X;.    p->enc =
6fc0: 20 45 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d   ENC(db);.    p-
6fd0: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d  >db = db;.    p-
6fe0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  >nRef = 1;.  }el
6ff0: 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  se{.    db->mall
7000: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
7010: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
7020: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
7030: 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  e a KeyInfo obje
7040: 63 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ct.*/.void sqlit
7050: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b  e3KeyInfoUnref(K
7060: 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66  eyInfo *p){.  if
7070: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
7080: 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  t( p->nRef>0 );.
7090: 20 20 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20      p->nRef--;. 
70a0: 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
70b0: 30 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  0 ) sqlite3DbFre
70c0: 65 28 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(0, p);.  }.}..
70d0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77  /*.** Make a new
70e0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65   pointer to a Ke
70f0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a  yInfo object.*/.
7100: 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
7110: 4b 65 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e  KeyInfoRef(KeyIn
7120: 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  fo *p){.  if( p 
7130: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7140: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
7150: 70 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  p->nRef++;.  }. 
7160: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69   return p;.}..#i
7170: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7180: 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  G./*.** Return T
7190: 52 55 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f  RUE if a KeyInfo
71a0: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63   object can be c
71b0: 68 61 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49  hange.  The KeyI
71c0: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61  nfo object.** ca
71d0: 6e 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65  n only be change
71e0: 64 20 69 66 20 74 68 69 73 20 69 73 20 6a 75 73  d if this is jus
71f0: 74 20 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72  t a single refer
7200: 65 6e 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65  ence to the obje
7210: 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ct..**.** This r
7220: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
7230: 6e 6c 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73  nly inside of as
7240: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
7250: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
7260: 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
7270: 62 6c 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ble(KeyInfo *p){
7280: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d   return p->nRef=
7290: 3d 31 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  =1; }.#endif /* 
72a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
72b0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20  ./*.** Given an 
72c0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c  expression list,
72d0: 20 67 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49   generate a KeyI
72e0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
72f0: 61 74 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68  at records.** th
7300: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
7310: 65 6e 63 65 20 66 6f 72 20 65 61 63 68 20 65 78  ence for each ex
7320: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74  pression in that
7330: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7340: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45  ..**.** If the E
7350: 78 70 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52  xprList is an OR
7360: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
7370: 42 59 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  BY clause then t
7380: 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20  he resulting.** 
7390: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
73a0: 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
73b0: 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e   for initializin
73c0: 67 20 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65  g a virtual inde
73d0: 78 20 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  x to.** implemen
73e0: 74 20 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20  t that clause.  
73f0: 49 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20  If the ExprList 
7400: 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  is the result se
7410: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a  t of a SELECT.**
7420: 20 74 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66   then the KeyInf
7430: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
7440: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
7450: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
7460: 72 74 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74  rtual.** index t
7470: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49  o implement a DI
7480: 53 54 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a  STINCT test..**.
7490: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
74a0: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
74b0: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
74c0: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54   from malloc.  T
74d0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
74e0: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
74f0: 73 69 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67  sible for seeing
7500: 20 74 68 61 74 20 74 68 69 73 20 73 74 72 75 63   that this struc
7510: 74 75 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c  ture is eventual
7520: 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a  ly.** freed..*/.
7530: 73 74 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a  static KeyInfo *
7540: 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c  keyInfoFromExprL
7550: 69 73 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ist(Parse *pPars
7560: 65 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  e, ExprList *pLi
7570: 73 74 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72  st){.  int nExpr
7580: 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e  ;.  KeyInfo *pIn
7590: 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  fo;.  struct Exp
75a0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
75b0: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
75c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
75d0: 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72   int i;..  nExpr
75e0: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
75f0: 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74  .  pInfo = sqlit
7600: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
7610: 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20  b, nExpr, 1);.  
7620: 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20  if( pInfo ){.   
7630: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7640: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
7650: 6c 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20  le(pInfo) );.   
7660: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
7670: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70  pList->a; i<nExp
7680: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
7690: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
76a0: 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43  *pColl;.      pC
76b0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
76c0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
76d0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a   pItem->pExpr);.
76e0: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
76f0: 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70   ) pColl = db->p
7700: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
7710: 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  pInfo->aColl[i] 
7720: 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  = pColl;.      p
7730: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
7740: 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72  [i] = pItem->sor
7750: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
7760: 7d 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f  }.  return pInfo
7770: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
7780: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
7790: 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e  D_SELECT./*.** N
77a0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ame of the conne
77b0: 63 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ction operator, 
77c0: 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d  used for error m
77d0: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
77e0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  ic const char *s
77f0: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20  electOpName(int 
7800: 69 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  id){.  char *z;.
7810: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
7820: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
7830: 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f         z = "UNIO
7840: 4e 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b  N ALL";   break;
7850: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
7860: 45 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54  ERSECT: z = "INT
7870: 45 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b  ERSECT";   break
7880: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  ;.    case TK_EX
7890: 43 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58  CEPT:    z = "EX
78a0: 43 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61  CEPT";      brea
78b0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
78c0: 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55            z = "U
78d0: 4e 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65  NION";       bre
78e0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
78f0: 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
7900: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
7910: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
7920: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7930: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
7940: 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50  * Unless an "EXP
7950: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22  LAIN QUERY PLAN"
7960: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e   command is bein
7970: 67 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69  g processed, thi
7980: 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  s function.** is
7990: 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77   a no-op. Otherw
79a0: 69 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73  ise, it adds a s
79b0: 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74  ingle row of out
79c0: 70 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72  put to the EQP r
79d0: 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20  esult,.** where 
79e0: 74 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f  the caption is o
79f0: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a  f the form:.**.*
7a00: 2a 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d  *   "USE TEMP B-
7a10: 54 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a  TREE FOR xxx".**
7a20: 0a 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73  .** where xxx is
7a30: 20 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43   one of "DISTINC
7a40: 54 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f  T", "ORDER BY" o
7a50: 72 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78  r "GROUP BY". Ex
7a60: 61 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69  actly which.** i
7a70: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
7a80: 74 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d  the zUsage argum
7a90: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
7aa0: 6f 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54  oid explainTempT
7ab0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
7ac0: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
7ad0: 7a 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70  zUsage){.  if( p
7ae0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
7af0: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
7b00: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
7b10: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
7b20: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
7b30: 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55  f(pParse->db, "U
7b40: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
7b50: 4f 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b  OR %s", zUsage);
7b60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7b70: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
7b80: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
7b90: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
7ba0: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
7bb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
7bc0: 73 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e  ssign expression
7bd0: 20 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20   b to lvalue a. 
7be0: 41 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c  A second, no-op,
7bf0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73   version of this
7c00: 20 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f   macro.** is pro
7c10: 76 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54  vided when SQLIT
7c20: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
7c30: 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20  s defined. This 
7c40: 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a  allows the code.
7c50: 2a 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ** in sqlite3Sel
7c60: 65 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20  ect() to assign 
7c70: 76 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74  values to struct
7c80: 75 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61  ure member varia
7c90: 62 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c  bles that.** onl
7ca0: 79 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54  y exist if SQLIT
7cb0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69  E_OMIT_EXPLAIN i
7cc0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69  s not defined wi
7cd0: 74 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20  thout polluting 
7ce0: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68  the.** code with
7cf0: 20 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69   #ifndef directi
7d00: 76 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65  ves..*/.# define
7d10: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
7d20: 65 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a  er(a, b) a = b..
7d30: 23 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76  #else./* No-op v
7d40: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65  ersions of the e
7d50: 78 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63  xplainXXX() func
7d60: 74 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73  tions and macros
7d70: 2e 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78  . */.# define ex
7d80: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79  plainTempTable(y
7d90: 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70  ,z).# define exp
7da0: 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79  lainSetInteger(y
7db0: 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ,z).#endif..#if 
7dc0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
7dd0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26  OMIT_EXPLAIN) &&
7de0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7df0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
7e00: 45 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c  ELECT)./*.** Unl
7e10: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
7e20: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
7e30: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
7e40: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
7e50: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
7e60: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
7e70: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
7e80: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
7e90: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
7ea0: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
7eb0: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65  aption is of one
7ec0: 20 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d   of the two form
7ed0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50  s:.**.**   "COMP
7ee0: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
7ef0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
7f00: 20 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d   (op)".**   "COM
7f10: 50 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45  POSITE SUBQUERIE
7f20: 53 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62  S iSub1 and iSub
7f30: 32 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54  2 USING TEMP B-T
7f40: 52 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20  REE (op)".**.** 
7f50: 77 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20  where iSub1 and 
7f60: 69 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e  iSub2 are the in
7f70: 74 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73  tegers passed as
7f80: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
7f90: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70  ng.** function p
7fa0: 61 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f  arameters, and o
7fb0: 70 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65  p is the text re
7fc0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
7fd0: 74 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a  the parameter.**
7fe0: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   of the same nam
7ff0: 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  e. The parameter
8000: 20 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e   "op" must be on
8010: 65 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54  e of TK_UNION, T
8020: 4b 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f  K_EXCEPT,.** TK_
8030: 49 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f  INTERSECT or TK_
8040: 41 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66  ALL. The first f
8050: 6f 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61  orm is used if a
8060: 72 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20  rgument bUseTmp 
8070: 69 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72  is .** false, or
8080: 20 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   the second form
8090: 20 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a   if it is true..
80a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
80b0: 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28  xplainComposite(
80c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
80d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
80e0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
80f0: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  ext */.  int op,
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
8120: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
8130: 45 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20  EXCEPT etc. */. 
8140: 20 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20   int iSub1,     
8150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8160: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
8170: 31 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32  1 */.  int iSub2
8180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8190: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
81a0: 72 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74  ry id 2 */.  int
81b0: 20 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20   bUseTmp        
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
81d0: 54 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74  True if a temp t
81e0: 61 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f  able was used */
81f0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70  .){.  assert( op
8200: 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70  ==TK_UNION || op
8210: 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
8220: 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
8230: 7c 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b  || op==TK_ALL );
8240: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
8250: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
8260: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
8270: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
8280: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
8290: 65 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20  e3MPrintf(.     
82a0: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22     pParse->db, "
82b0: 43 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52  COMPOUND SUBQUER
82c0: 49 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73  IES %d AND %d %s
82d0: 28 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53  (%s)", iSub1, iS
82e0: 75 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73  ub2,.        bUs
82f0: 65 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50  eTmp?"USING TEMP
8300: 20 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65   B-TREE ":"", se
8310: 6c 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20  lectOpName(op). 
8320: 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
8330: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
8340: 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
8350: 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
8360: 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e   0, zMsg, P4_DYN
8370: 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  AMIC);.  }.}.#el
8380: 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73  se./* No-op vers
8390: 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c  ions of the expl
83a0: 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ainXXX() functio
83b0: 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a  ns and macros. *
83c0: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
83d0: 69 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c  inComposite(v,w,
83e0: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f  x,y,z).#endif../
83f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65  *.** If the inne
8400: 72 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72  r loop was gener
8410: 61 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e  ated using a non
8420: 2d 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61  -null pOrderBy a
8430: 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e  rgument,.** then
8440: 20 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72   the results wer
8450: 65 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f  e placed in a so
8460: 72 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65  rter.  After the
8470: 20 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61   loop is termina
8480: 74 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74  ted.** we need t
8490: 6f 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72  o run the sorter
84a0: 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20   and output the 
84b0: 72 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f  results.  The fo
84c0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69  llowing.** routi
84d0: 6e 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65  ne generates the
84e0: 20 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20   code needed to 
84f0: 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74  do that..*/.stat
8500: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
8510: 53 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73  SortTail(.  Pars
8520: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8530: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8540: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
8550: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
8560: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
8570: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  */.  Vdbe *v,   
8580: 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
8590: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
85a0: 73 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20  s VDBE */.  int 
85b0: 6e 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a  nColumn,      /*
85c0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
85d0: 6e 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20  ns of data */.  
85e0: 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
85f0: 74 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73  t /* Write the s
8600: 6f 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65  orted results he
8610: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
8620: 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ddrBreak = sqlit
8630: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
8640: 76 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  v);     /* Jump 
8650: 68 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f  here to exit loo
8660: 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
8670: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
8680: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
8690: 29 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  );  /* Jump here
86a0: 20 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20   for next cycle 
86b0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20  */.  int addr;. 
86c0: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74   int iTab;.  int
86d0: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a   pseudoTab = 0;.
86e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
86f0: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
8700: 42 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74  By;..  int eDest
8710: 20 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b   = pDest->eDest;
8720: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
8730: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 0a  Dest->iSDParm;..
8740: 20 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20    int regRow;.  
8750: 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20  int regRowid;.. 
8760: 20 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79   iTab = pOrderBy
8770: 2d 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65  ->iECursor;.  re
8780: 67 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65  gRow = sqlite3Ge
8790: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
87a0: 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53  ;.  if( eDest==S
87b0: 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65  RT_Output || eDe
87c0: 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st==SRT_Coroutin
87d0: 65 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54  e ){.    pseudoT
87e0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
87f0: 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  b++;.    sqlite3
8800: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8810: 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65  _OpenPseudo, pse
8820: 75 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20  udoTab, regRow, 
8830: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65  nColumn);.    re
8840: 67 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65  gRowid = 0;.  }e
8850: 6c 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69  lse{.    regRowi
8860: 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
8870: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
8880: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46   }.  if( p->selF
8890: 6c 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72  lags & SF_UseSor
88a0: 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ter ){.    int r
88b0: 65 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50  egSortOut = ++pP
88c0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
88d0: 69 6e 74 20 70 74 61 62 32 20 3d 20 70 50 61 72  int ptab2 = pPar
88e0: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
88f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8900: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75  3(v, OP_OpenPseu
8910: 64 6f 2c 20 70 74 61 62 32 2c 20 72 65 67 53 6f  do, ptab2, regSo
8920: 72 74 4f 75 74 2c 20 70 4f 72 64 65 72 42 79 2d  rtOut, pOrderBy-
8930: 3e 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 61  >nExpr+2);.    a
8940: 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  ddr = 1 + sqlite
8950: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8960: 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54  P_SorterSort, iT
8970: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
8980: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
8990: 2c 20 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75  , p, addrContinu
89a0: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  e);.    sqlite3V
89b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
89c0: 53 6f 72 74 65 72 44 61 74 61 2c 20 69 54 61 62  SorterData, iTab
89d0: 2c 20 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20  , regSortOut);. 
89e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
89f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
8a00: 6e 2c 20 70 74 61 62 32 2c 20 70 4f 72 64 65 72  n, ptab2, pOrder
8a10: 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67  By->nExpr+1, reg
8a20: 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Row);.    sqlite
8a30: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8a40: 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
8a50: 48 45 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  HE);.  }else{.  
8a60: 20 20 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c    addr = 1 + sql
8a70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
8a80: 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c  , OP_Sort, iTab,
8a90: 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20   addrBreak);.   
8aa0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
8ab0: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
8ac0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8ad0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
8ae0: 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65  umn, iTab, pOrde
8af0: 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
8b00: 67 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 77 69  gRow);.  }.  swi
8b10: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
8b20: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
8b30: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
8b40: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
8b50: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
8b60: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
8b70: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
8b80: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
8b90: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
8ba0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8bb0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
8bc0: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
8bd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8be0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
8bf0: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
8c00: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
8c10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8c20: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
8c30: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
8c40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8c50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8c60: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
8c70: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
8c80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
8c90: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
8ca0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8cb0: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
8cc0: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31  ecord, regRow, 1
8cd0: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cf0: 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53      &pDest->affS
8d00: 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
8d10: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
8d20: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
8d30: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29  arse, regRow, 1)
8d40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8d50: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8d60: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
8d70: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
8d80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8d90: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
8da0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
8db0: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
8dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8dd0: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
8de0: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c  , regRow, iParm,
8df0: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
8e00: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
8e10: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
8e20: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
8e30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8e40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
8e50: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
8e60: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73  int i;.      ass
8e70: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
8e80: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
8e90: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
8ea0: 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ; .      testcas
8eb0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  e( eDest==SRT_Ou
8ec0: 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65  tput );.      te
8ed0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
8ee0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
8ef0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
8f00: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
8f10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8f20: 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69  regRow!=pDest->i
8f30: 53 64 73 74 2b 69 20 29 3b 0a 20 20 20 20 20 20  Sdst+i );.      
8f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8f50: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
8f60: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20  , pseudoTab, i, 
8f70: 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69 29 3b  pDest->iSdst+i);
8f80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
8f90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
8fa0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
8fb0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45  P5(v, OPFLAG_CLE
8fc0: 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20  ARCACHE);.      
8fd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8fe0: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8ff0: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
9000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9010: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
9020: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64  tRow, pDest->iSd
9030: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
9040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9050: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
9060: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
9070: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
9080: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
9090: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
90a0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
90b0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
90c0: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
90d0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
90e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
90f0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
9100: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29  (pParse, regRow)
9110: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
9120: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
9130: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20  , regRowid);..  
9140: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
9150: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
9160: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
9170: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
9180: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
9190: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
91a0: 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  F_UseSorter ){. 
91b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
91c0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
91d0: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
91e0: 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
91f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9200: 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
9210: 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a  Tab, addr);.  }.
9220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
9230: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
9240: 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65  rBreak);.  if( e
9250: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
9260: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43   || eDest==SRT_C
9270: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
9280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9290: 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  2(v, OP_Close, p
92a0: 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20  seudoTab, 0);.  
92b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
92c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
92d0: 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
92e0: 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61 74  ng the 'declarat
92f0: 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65  ion type' of the
9300: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
9310: 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67  Expr. The string
9320: 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64 20   may be treated 
9330: 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68 65  as static by the
9340: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
9350: 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d  lso try to estim
9360: 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ate the size of 
9370: 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  the returned val
9380: 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ue and return th
9390: 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  at.** result in 
93a0: 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a  *pEstWidth..**.*
93b0: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
93c0: 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65 78  n type is the ex
93d0: 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65 66  act datatype def
93e0: 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65  inition extracte
93f0: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72  d from the.** or
9400: 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41  iginal CREATE TA
9410: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66  BLE statement if
9420: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9430: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65  is a column. The
9440: 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  .** declaration 
9450: 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44  type for a ROWID
9460: 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45   field is INTEGE
9470: 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20  R. Exactly when 
9480: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
9490: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
94a0: 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63   column can be c
94b0: 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72  omplex in the pr
94c0: 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65  esence of subque
94d0: 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73  ries. The.** res
94e0: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
94f0: 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65  on in all of the
9500: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43   following SELEC
9510: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
9520: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61  .** considered a
9530: 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20   column by this 
9540: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
9550: 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f    SELECT col FRO
9560: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
9570: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
9580: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
9590: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
95a0: 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20   FROM tbl);.**  
95b0: 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d   SELECT abc FROM
95c0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20   (SELECT col AS 
95d0: 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a  abc FROM tbl);.*
95e0: 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72  * .** The declar
95f0: 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61  ation type for a
9600: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74  ny expression ot
9610: 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d  her than a colum
9620: 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  n is NULL..**.**
9630: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
9640: 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36 20  s either 3 or 6 
9650: 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e  parameters depen
9660: 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
9670: 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51  or not.** the SQ
9680: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
9690: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70  MN_METADATA comp
96a0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
96b0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64  is used..*/.#ifd
96c0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
96d0: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
96e0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
96f0: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
9700: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
9710: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74  (A,B,C,D,E,F).st
9720: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9730: 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28  *columnTypeImpl(
9740: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
9750: 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45  pNC, .  Expr *pE
9760: 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  xpr,.  const cha
9770: 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20  r **pzOrigDb,.  
9780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f  const char **pzO
9790: 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20  rigTab,.  const 
97a0: 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c  char **pzOrigCol
97b0: 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64 74  ,.  u8 *pEstWidt
97c0: 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73  h.){.  char cons
97d0: 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a  t *zOrigDb = 0;.
97e0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f    char const *zO
97f0: 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68  rigTab = 0;.  ch
9800: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43  ar const *zOrigC
9810: 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a  ol = 0;.#else /*
9820: 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c   if !defined(SQL
9830: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
9840: 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23  N_METADATA) */.#
9850: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
9860: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
9870: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
9880: 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e  ,B,F).static con
9890: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
98a0: 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43  ypeImpl(.  NameC
98b0: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20  ontext *pNC, .  
98c0: 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75  Expr *pExpr,.  u
98d0: 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a  8 *pEstWidth.){.
98e0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
98f0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
9900: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
9910: 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  ) */.  char cons
9920: 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  t *zType = 0;.  
9930: 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57  int j;.  u8 estW
9940: 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28  idth = 1;..  if(
9950: 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29   NEVER(pExpr==0)
9960: 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   || pNC->pSrcLis
9970: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
9980: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
9990: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
99a0: 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a   TK_AGG_COLUMN:.
99b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
99c0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  MN: {.      /* T
99d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
99e0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74   a column. Locat
99f0: 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20  e the table the 
9a00: 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a  column is being.
9a10: 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74        ** extract
9a20: 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43  ed from in NameC
9a30: 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e  ontext.pSrcList.
9a40: 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20   This table may 
9a50: 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a  be real.      **
9a60: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20   database table 
9a70: 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20  or a subquery.. 
9a80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61       */.      Ta
9a90: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
9aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
9ab0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c  le structure col
9ac0: 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64  umn is extracted
9ad0: 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53   from */.      S
9ae0: 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20  elect *pS = 0;  
9af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
9b00: 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lect the column 
9b10: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
9b20: 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  m */.      int i
9b30: 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  Col = pExpr->iCo
9b40: 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20  lumn;  /* Index 
9b50: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61  of column in pTa
9b60: 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63  b */.      testc
9b70: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
9b80: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b  TK_AGG_COLUMN );
9b90: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
9ba0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43   pExpr->op==TK_C
9bb0: 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77  OLUMN );.      w
9bc0: 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54  hile( pNC && !pT
9bd0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72  ab ){.        Sr
9be0: 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20  cList *pTabList 
9bf0: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
9c00: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
9c10: 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ;j<pTabList->nSr
9c20: 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61  c && pTabList->a
9c30: 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78  [j].iCursor!=pEx
9c40: 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b  pr->iTable;j++);
9c50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
9c60: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b  TabList->nSrc ){
9c70: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
9c80: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
9c90: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  .pTab;.         
9ca0: 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e   pS = pTabList->
9cb0: 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[j].pSelect;.  
9cc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9cd0: 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43         pNC = pNC
9ce0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
9cf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
9d00: 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b    if( pTab==0 ){
9d10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f  .        /* At o
9d20: 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75  ne time, code su
9d30: 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65  ch as "SELECT ne
9d40: 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72  w.x" within a tr
9d50: 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20  igger would.    
9d60: 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69      ** cause thi
9d70: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72  s condition to r
9d80: 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c  un.  Since then,
9d90: 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63   we have restruc
9da0: 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20  tured how.      
9db0: 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64    ** trigger cod
9dc0: 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  e is generated a
9dd0: 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69  nd so this condi
9de0: 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  tion is no longe
9df0: 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  r .        ** po
9e00: 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c  ssible. However,
9e10: 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65   it can still be
9e20: 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d   true for statem
9e30: 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20  ents like.      
9e40: 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
9e50: 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ng:.        **. 
9e60: 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41         **   CREA
9e70: 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20  TE TABLE t1(col 
9e80: 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20  INTEGER);.      
9e90: 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53    **   SELECT (S
9ea0: 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52  ELECT t1.col) FR
9eb0: 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  OM FROM t1;.    
9ec0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
9ed0: 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70  * when columnTyp
9ee0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
9ef0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9f00: 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20  "t1.col" in the 
9f10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d  .        ** sub-
9f20: 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20  select. In this 
9f30: 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f  case, set the co
9f40: 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c  lumn type to NUL
9f50: 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20  L, even.        
9f60: 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f  ** though it sho
9f70: 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49  uld really be "I
9f80: 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20  NTEGER"..       
9f90: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
9fa0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  his is not a pro
9fb0: 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c  blem, as the col
9fc0: 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e  umn type of "t1.
9fd0: 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20  col" is never.  
9fe0: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57        ** used. W
9ff0: 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29  hen columnType()
a000: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68   is called on th
a010: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20  e expression .  
a020: 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43        ** "(SELEC
a030: 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20  T t1.col)", the 
a040: 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20  correct type is 
a050: 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68  returned (see th
a060: 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20  e TK_SELECT.    
a070: 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65      ** branch be
a080: 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  low.  */.       
a090: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
a0a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
a0b0: 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54  Tab && pExpr->pT
a0c0: 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20  ab==pTab );.    
a0d0: 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20    if( pS ){.    
a0e0: 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c      /* The "tabl
a0f0: 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  e" is actually a
a100: 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61   sub-select or a
a110: 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f   view in the FRO
a120: 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20  M clause.       
a130: 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43   ** of the SELEC
a140: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74  T statement. Ret
a150: 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74  urn the declarat
a160: 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69  ion type and ori
a170: 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  gin.        ** d
a180: 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75  ata for the resu
a190: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66  lt-set column of
a1a0: 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e   the sub-select.
a1b0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
a1c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
a1d0: 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70  && ALWAYS(iCol<p
a1e0: 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  S->pEList->nExpr
a1f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
a200: 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73  * If iCol is les
a210: 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
a220: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
a230: 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20   requests the.  
a240: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64          ** rowid
a250: 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65   of the sub-sele
a260: 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73  ct or view. This
a270: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c   expression is l
a280: 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20  egal (see .     
a290: 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73       ** test cas
a2a0: 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69  e misc2.2.2) - i
a2b0: 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74  t always evaluat
a2c0: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20  es to NULL..    
a2d0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a2e0: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
a2f0: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78  NC;.          Ex
a300: 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69  pr *p = pS->pELi
a310: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
a320: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  r;.          sNC
a330: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
a340: 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  pSrc;.          
a350: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b  sNC.pNext = pNC;
a360: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
a370: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
a380: 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  rse;.          z
a390: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
a3a0: 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67  e(&sNC, p,&zOrig
a3b0: 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f  Db,&zOrigTab,&zO
a3c0: 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74  rigCol, &estWidt
a3d0: 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  h); .        }. 
a3e0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
a3f0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
a400: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 61          /* A rea
a410: 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  l table */.     
a420: 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20 29     assert( !pS )
a430: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
a440: 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54  ol<0 ) iCol = pT
a450: 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20  ab->iPKey;.     
a460: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
a470: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
a480: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
a490: 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53 51  ol) );.#ifdef SQ
a4a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
a4b0: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
a4c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
a4d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
a4e0: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
a4f0: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43 6f           zOrigCo
a500: 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20 20  l = "rowid";.   
a510: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a520: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
a530: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a540: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
a550: 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62 2d  zOrigCol = pTab-
a560: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
a570: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74  e;.          est
a580: 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43  Width = pTab->aC
a590: 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a  ol[iCol].szEst;.
a5a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a5b0: 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54 61    zOrigTab = pTa
a5c0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
a5d0: 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72 73    if( pNC->pPars
a5e0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
a5f0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
a600: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 4e  SchemaToIndex(pN
a610: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  C->pParse->db, p
a620: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
a630: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44 62           zOrigDb
a640: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e   = pNC->pParse->
a650: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
a660: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  me;.        }.#e
a670: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
a680: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
a690: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54      zType = "INT
a6a0: 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20 7d  EGER";.        }
a6b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a6c0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
a6d0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
a6e0: 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64            estWid
a6f0: 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  th = pTab->aCol[
a700: 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20  iCol].szEst;.   
a710: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
a720: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a730: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
a740: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
a750: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
a760: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
a770: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
a780: 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65 6c  ion is a sub-sel
a790: 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ect. Return the 
a7a0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
a7b0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f 72   and.      ** or
a7c0: 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74 68  igin info for th
a7d0: 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20  e single column 
a7e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
a7f0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a  t of the SELECT.
a800: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
a810: 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nt..      */.   
a820: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
a830: 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  NC;.      Select
a840: 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78 2e   *pS = pExpr->x.
a850: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 45  pSelect;.      E
a860: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
a870: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
a880: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 45  .      assert( E
a890: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
a8a0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
a8b0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
a8c0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e  .pSrcList = pS->
a8d0: 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43 2e  pSrc;.      sNC.
a8e0: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
a8f0: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
a900: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
a910: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
a920: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
a930: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
a940: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 26  ab, &zOrigCol, &
a950: 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20 20  estWidth); .    
a960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a970: 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64 65  endif.  }..#ifde
a980: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
a990: 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20  COLUMN_METADATA 
a9a0: 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44 62   .  if( pzOrigDb
a9b0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
a9c0: 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a 4f  pzOrigTab && pzO
a9d0: 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a 70  rigCol );.    *p
a9e0: 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67 44  zOrigDb = zOrigD
a9f0: 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54 61  b;.    *pzOrigTa
aa00: 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20 20  b = zOrigTab;.  
aa10: 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a    *pzOrigCol = z
aa20: 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e  OrigCol;.  }.#en
aa30: 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57 69  dif.  if( pEstWi
aa40: 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74 68  dth ) *pEstWidth
aa50: 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20 72   = estWidth;.  r
aa60: 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a  eturn zType;.}..
aa70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
aa80: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65  ode that will te
aa90: 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65 20  ll the VDBE the 
aaa0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
aab0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
aac0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
aad0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
aae0: 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e  d generateColumn
aaf0: 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20 2a  Types(.  Parse *
ab00: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
ab10: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
ab20: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
ab30: 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  bList,  /* List 
ab40: 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45  of tables */.  E
ab50: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
ab60: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
ab70: 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72  s defining the r
ab80: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a  esult set */.){.
ab90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
aba0: 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 56  MIT_DECLTYPE.  V
abb0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
abc0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
abd0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
abe0: 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  NC;.  sNC.pSrcLi
abf0: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
ac00: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
ac10: 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  arse;.  for(i=0;
ac20: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
ac30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
ac40: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
ac50: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63 6f  i].pExpr;.    co
ac60: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
ac70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
ac80: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
ac90: 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74 20  ADATA.    const 
aca0: 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d 20  char *zOrigDb = 
acb0: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
acc0: 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b  r *zOrigTab = 0;
acd0: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ace0: 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a 20  *zOrigCol = 0;. 
acf0: 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d     zType = colum
ad00: 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 26  nType(&sNC, p, &
ad10: 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67 54  zOrigDb, &zOrigT
ad20: 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20 30  ab, &zOrigCol, 0
ad30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
ad40: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
ad50: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
ad60: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
ad70: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
ad80: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
ad90: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
ada0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
adb0: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
adc0: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
add0: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
ade0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
adf0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ae00: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ae10: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
ae20: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
ae30: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
ae40: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
ae50: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
ae60: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
ae70: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
ae80: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
ae90: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
aea0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
aeb0: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
aec0: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
aed0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
aee0: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
aef0: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 2c  sNC, p, 0, 0, 0,
af00: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
af10: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
af20: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
af30: 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54  AME_DECLTYPE, zT
af40: 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  ype, SQLITE_TRAN
af50: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64  SIENT);.  }.#end
af60: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
af70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
af80: 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  YPE) */.}../*.**
af90: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
afa0: 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74 68  hat will tell th
afb0: 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65 73  e VDBE the names
afc0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69   of columns.** i
afd0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
afe0: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
aff0: 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
b000: 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61 7a  rovide the.** az
b010: 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e 20  Col[] values in 
b020: 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  the callback..*/
b030: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e  .static void gen
b040: 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
b050: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
b060: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  e,      /* Parse
b070: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
b080: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
b090: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  ,  /* List of ta
b0a0: 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  bles */.  ExprLi
b0b0: 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f 2a  st *pEList    /*
b0c0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65 66   Expressions def
b0d0: 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  ining the result
b0e0: 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62   set */.){.  Vdb
b0f0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
b100: 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Vdbe;.  int i, j
b110: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
b120: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
b130: 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20 73  int fullNames, s
b140: 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e  hortNames;..#ifn
b150: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b160: 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66 20  EXPLAIN.  /* If 
b170: 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41  this is an EXPLA
b180: 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73 74  IN, skip this st
b190: 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  ep */.  if( pPar
b1a0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20  se->explain ){. 
b1b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
b1c0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
b1d0: 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74  rse->colNamesSet
b1e0: 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29 20   || NEVER(v==0) 
b1f0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
b200: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
b210: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
b220: 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e  Set = 1;.  fullN
b230: 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61 67  ames = (db->flag
b240: 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43  s & SQLITE_FullC
b250: 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20 73  olNames)!=0;.  s
b260: 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62 2d  hortNames = (db-
b270: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
b280: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d  ShortColNames)!=
b290: 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  0;.  sqlite3Vdbe
b2a0: 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70 45  SetNumCols(v, pE
b2b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
b2c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
b2d0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
b2e0: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
b2f0: 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69   p = pEList->a[i
b300: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
b310: 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 63   NEVER(p==0) ) c
b320: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
b330: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
b340: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ame ){.      cha
b350: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69 73  r *zName = pELis
b360: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[i].zName;. 
b370: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b380: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
b390: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
b3a0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Name, SQLITE_TRA
b3b0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65 6c  NSIENT);.    }el
b3c0: 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d 54  se if( (p->op==T
b3d0: 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f  K_COLUMN || p->o
b3e0: 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
b3f0: 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29 7b  ) && pTabList ){
b400: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
b410: 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  ab;.      char *
b420: 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  zCol;.      int 
b430: 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d  iCol = p->iColum
b440: 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  n;.      for(j=0
b450: 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62 4c  ; ALWAYS(j<pTabL
b460: 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29  ist->nSrc); j++)
b470: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
b480: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75  abList->a[j].iCu
b490: 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65 20  rsor==p->iTable 
b4a0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
b4b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
b4c0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
b4d0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
b4e0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
b4f0: 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 69  Tab;.      if( i
b500: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
b510: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
b520: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d    assert( iCol==
b530: 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26  -1 || (iCol>=0 &
b540: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
b550: 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l) );.      if( 
b560: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
b570: 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22    zCol = "rowid"
b580: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
b590: 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54         zCol = pT
b5a0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
b5b0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
b5c0: 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e 61      if( !shortNa
b5d0: 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d 65  mes && !fullName
b5e0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
b5f0: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
b600: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
b610: 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20 20  _NAME, .        
b620: 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74 72      sqlite3DbStr
b630: 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
b640: 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51 4c  a[i].zSpan), SQL
b650: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
b660: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 75      }else if( fu
b670: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
b680: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
b690: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d   0;.        zNam
b6a0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
b6b0: 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
b6c0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
b6d0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
b6e0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
b6f0: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
b700: 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c  NAME, zName, SQL
b710: 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ITE_DYNAMIC);.  
b720: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b730: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
b740: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
b750: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f  OLNAME_NAME, zCo
b760: 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  l, SQLITE_TRANSI
b770: 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ENT);.      }.  
b780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
b790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
b7a0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  EList->a[i].zSpa
b7b0: 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d 3d  n;.      z = z==
b7c0: 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  0 ? sqlite3MPrin
b7d0: 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25 64  tf(db, "column%d
b7e0: 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74 65  ", i+1) : sqlite
b7f0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 29  3DbStrDup(db, z)
b800: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b810: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
b820: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
b830: 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41  , z, SQLITE_DYNA
b840: 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  MIC);.    }.  }.
b850: 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
b860: 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70 54  Types(pParse, pT
b870: 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b  abList, pEList);
b880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
b890: 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  a an expression 
b8a0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 72  list (which is r
b8b0: 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f  eally the list o
b8c0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  f expressions.**
b8d0: 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72   that form the r
b8e0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53  esult set of a S
b8f0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29  ELECT statement)
b900: 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72   compute appropr
b910: 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  iate.** column n
b920: 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65  ames for a table
b930: 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64   that would hold
b940: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
b950: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  list..**.** All 
b960: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c  column names wil
b970: 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a  l be unique..**.
b980: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  ** Only the colu
b990: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d  mn names are com
b9a0: 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a  puted.  Column.z
b9b0: 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f  Type, Column.zCo
b9c0: 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  ll,.** and other
b9d0: 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d   fields of Colum
b9e0: 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  n are zeroed..**
b9f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
ba00: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
ba10: 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c    If a memory al
ba20: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f  location error o
ba30: 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20  ccurs,.** store 
ba40: 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61  NULL in *paCol a
ba50: 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61  nd 0 in *pnCol a
ba60: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
ba70: 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69  _NOMEM..*/.stati
ba80: 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75  c int selectColu
ba90: 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  mnsFromExprList(
baa0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
bab0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
bac0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
bad0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
bae0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78  ist,       /* Ex
baf0: 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69  pr list from whi
bb00: 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c  ch to derive col
bb10: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
bb20: 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20  16 *pnCol,      
bb30: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
bb40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
bb50: 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20  lumns here */.  
bb60: 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20  Column **paCol  
bb70: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
bb80: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
bb90: 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  list here */.){.
bba0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
bbb0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
bbc0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
bbd0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  tion */.  int i,
bbe0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
bbf0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bc00: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
bc10: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
bc20: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
bc30: 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74   added to make t
bc40: 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a  he name unique *
bc50: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  /.  Column *aCol
bc60: 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  , *pCol;        
bc70: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
bc80: 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ver result colum
bc90: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ns */.  int nCol
bca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bcb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bcc0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
bcd0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
bce0: 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20  Expr *p;        
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
bd00: 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20  xpression for a 
bd10: 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f  single result co
bd20: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
bd30: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
bd40: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
bd50: 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  name */.  int nN
bd60: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
bd70: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
bd80: 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d   name in zName[]
bd90: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73   */..  if( pELis
bda0: 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20  t ){.    nCol = 
bdb0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
bdc0: 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65     aCol = sqlite
bdd0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
bde0: 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d  , sizeof(aCol[0]
bdf0: 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73  )*nCol);.    tes
be00: 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29  tcase( aCol==0 )
be10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
be20: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f  Col = 0;.    aCo
be30: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e  l = 0;.  }.  *pn
be40: 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70  Col = nCol;.  *p
be50: 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20  aCol = aCol;..  
be60: 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43  for(i=0, pCol=aC
be70: 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c  ol; i<nCol; i++,
be80: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a   pCol++){.    /*
be90: 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69   Get an appropri
bea0: 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  ate name for the
beb0: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20   column.    */. 
bec0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
bed0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
bee0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
bef0: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
bf00: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
bf10: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
bf20: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
bf30: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
bf40: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
bf50: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
bf60: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
bf70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
bf80: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
bf90: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
bfa0: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
bfb0: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
bfc0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
bfd0: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
bfe0: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
bff0: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
c000: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
c010: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
c020: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
c030: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
c040: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
c050: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
c060: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
c070: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
c080: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
c090: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
c0a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c0b0: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
c0c0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
c0d0: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
c0e0: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
c0f0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
c100: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
c110: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
c120: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
c130: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
c140: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
c150: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
c160: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
c170: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
c180: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
c190: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
c1a0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
c1b0: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
c1c0: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
c1d0: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
c1e0: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
c1f0: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
c200: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
c210: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
c220: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
c230: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
c240: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
c250: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
c260: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
c270: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
c280: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
c290: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
c2a0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
c2b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
c2c0: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
c2d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
c2e0: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
c2f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
c300: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
c310: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
c320: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
c330: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
c340: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c350: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c360: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
c370: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c380: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
c390: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
c3a0: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
c3b0: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
c3c0: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
c3d0: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
c3e0: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
c3f0: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
c400: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
c410: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
c420: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c430: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
c440: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
c450: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
c460: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
c470: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
c480: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
c490: 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65    char *zNewName
c4a0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  ;.        int k;
c4b0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e  .        for(k=n
c4c0: 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73  Name-1; k>1 && s
c4d0: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e  qlite3Isdigit(zN
c4e0: 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a  ame[k]); k--){}.
c4f0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d          if( zNam
c500: 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d  e[k]==':' ) nNam
c510: 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a  e = k;.        z
c520: 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
c530: 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d  .        zNewNam
c540: 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
c550: 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20  tf(db, "%s:%d", 
c560: 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20  zName, ++cnt);. 
c570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
c580: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
c590: 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  .        zName =
c5a0: 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20   zNewName;.     
c5b0: 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20     j = -1;.     
c5c0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
c5d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
c5e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d  .    }.    pCol-
c5f0: 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  >zName = zName;.
c600: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61    }.  if( db->ma
c610: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
c620: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20    for(j=0; j<i; 
c630: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  j++){.      sqli
c640: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 43  te3DbFree(db, aC
c650: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol[j].zName);.  
c660: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
c670: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b  bFree(db, aCol);
c680: 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b  .    *paCol = 0;
c690: 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b  .    *pnCol = 0;
c6a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
c6b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
c6c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c6d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
c6e0: 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
c6f0: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  n information to
c700: 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62   a column list b
c710: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c  ased on.** a SEL
c720: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
c730: 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  * .** The column
c740: 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79   list presumably
c750: 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63   came from selec
c760: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d  tColumnNamesFrom
c770: 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54  ExprList()..** T
c780: 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68  he column list h
c790: 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e  as only names, n
c7a0: 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c  ot types or coll
c7b0: 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a  ations.  This.**
c7c0: 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68   routine goes th
c7d0: 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20 74  rough and adds t
c7e0: 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c  he types and col
c7f0: 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54  lations..**.** T
c800: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75  his routine requ
c810: 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64  ires that all id
c820: 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68 65  entifiers in the
c830: 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65   SELECT.** state
c840: 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64  ment be resolved
c850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c860: 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e   selectAddColumn
c870: 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e  TypeAndCollation
c880: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c890: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
c8a0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f  sing contexts */
c8b0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
c8c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
c8d0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f  column type info
c8e0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
c8f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63  table */.  Selec
c900: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
c910: 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20   /* SELECT used 
c920: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70  to determine typ
c930: 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e  es and collation
c940: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
c950: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
c960: 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  db;.  NameContex
c970: 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20  t sNC;.  Column 
c980: 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71  *pCol;.  CollSeq
c990: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
c9a0: 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73  ;.  Expr *p;.  s
c9b0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c9c0: 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a  tem *a;.  u64 sz
c9d0: 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  All = 0;..  asse
c9e0: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
c9f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
ca00: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
ca10: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
ca20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
ca30: 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63  ab->nCol==pSelec
ca40: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
ca50: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
ca60: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
ca70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ca80: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65   return;.  memse
ca90: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
caa0: 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70  f(sNC));.  sNC.p
cab0: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
cac0: 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70  t->pSrc;.  a = p
cad0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
cae0: 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43  a;.  for(i=0, pC
caf0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
cb00: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
cb10: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70  , pCol++){.    p
cb20: 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20   = a[i].pExpr;. 
cb30: 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d     pCol->zType =
cb40: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
cb50: 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28  (db, columnType(
cb60: 26 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26  &sNC, p,0,0,0, &
cb70: 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20  pCol->szEst));. 
cb80: 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c     szAll += pCol
cb90: 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f  ->szEst;.    pCo
cba0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
cbb0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
cbc0: 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43  y(p);.    if( pC
cbd0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20  ol->affinity==0 
cbe0: 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ) pCol->affinity
cbf0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
cc00: 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20  NE;.    pColl = 
cc10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
cc20: 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  eq(pParse, p);. 
cc30: 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a     if( pColl ){.
cc40: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c        pCol->zCol
cc50: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  l = sqlite3DbStr
cc60: 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a  Dup(db, pColl->z
cc70: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Name);.    }.  }
cc80: 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  .  pTab->szTabRo
cc90: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
cca0: 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f  t(szAll*4);.}../
ccb0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c  *.** Given a SEL
ccc0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67  ECT statement, g
ccd0: 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65 20  enerate a Table 
cce0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
ccf0: 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20  escribes.** the 
cd00: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
cd10: 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61  at SELECT..*/.Ta
cd20: 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75  ble *sqlite3Resu
cd30: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61  ltSetOfSelect(Pa
cd40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
cd50: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
cd60: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
cd70: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
cd80: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
cd90: 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73  savedFlags;..  s
cda0: 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e  avedFlags = db->
cdb0: 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61  flags;.  db->fla
cdc0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75  gs &= ~SQLITE_Fu
cdd0: 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62  llColNames;.  db
cde0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
cdf0: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b  E_ShortColNames;
ce00: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
ce10: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53 65  Prep(pParse, pSe
ce20: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
ce30: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
ce40: 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65  eturn 0;.  while
ce50: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
ce60: 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53  r ) pSelect = pS
ce70: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
ce80: 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76   db->flags = sav
ce90: 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20  edFlags;.  pTab 
cea0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
ceb0: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
cec0: 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28  (Table) );.  if(
ced0: 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
cee0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
cef0: 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52 65  /* The sqlite3Re
cf00: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
cf10: 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e  ) is only used n
cf20: 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20   contexts where 
cf30: 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69  lookaside.  ** i
cf40: 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
cf50: 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b  assert( db->look
cf60: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d  aside.bEnabled==
cf70: 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65  0 );.  pTab->nRe
cf80: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a  f = 1;.  pTab->z
cf90: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62  Name = 0;.  pTab
cfa0: 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38  ->nRowEst = 1048
cfb0: 35 37 36 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c  576;.  selectCol
cfc0: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
cfd0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
cfe0: 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
cff0: 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
d000: 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64  ol);.  selectAdd
d010: 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c  ColumnTypeAndCol
d020: 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  lation(pParse, p
d030: 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Tab, pSelect);. 
d040: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
d050: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
d060: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
d070: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
d080: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
d090: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d0a0: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
d0b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
d0c0: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
d0d0: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
d0e0: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
d0f0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
d100: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
d110: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
d120: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
d130: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
d140: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
d150: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
d160: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
d170: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d180: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
d190: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
d1a0: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
d1b0: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
d1c0: 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
d1d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
d1e0: 45 0a 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20  E.    if( v ){. 
d1f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d200: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61  AddOp0(v, OP_Tra
d210: 63 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ce);.    }.#endi
d220: 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76  f.  }.  return v
d230: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ;.}.../*.** Comp
d240: 75 74 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61  ute the iLimit a
d250: 6e 64 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64  nd iOffset field
d260: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
d270: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
d280: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
d290: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20  et expressions. 
d2a0: 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66   pLimit and pOff
d2b0: 73 65 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70  set hold the exp
d2c0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
d2d0: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f   appear in the o
d2e0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
d2f0: 65 6d 65 6e 74 20 61 66 74 65 72 20 74 68 65 20  ement after the 
d300: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
d310: 0a 2a 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f  .** keywords.  O
d320: 72 20 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20  r NULL if those 
d330: 6b 65 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69  keywords are omi
d340: 74 74 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64  tted. iLimit and
d350: 20 69 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65   iOffset .** are
d360: 20 74 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d   the integer mem
d370: 6f 72 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d  ory register num
d380: 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72  bers for counter
d390: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
d3a0: 65 20 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20  e .** the limit 
d3b0: 61 6e 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20  and offset.  If 
d3c0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
d3d0: 74 20 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c  t and/or offset,
d3e0: 20 74 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74   then .** iLimit
d3f0: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65   and iOffset are
d400: 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a   negative..**.**
d410: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
d420: 61 6e 67 65 73 20 74 68 65 20 76 61 6c 75 65 73  anges the values
d430: 20 6f 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69   of iLimit and i
d440: 4f 66 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a  Offset only if.*
d450: 2a 20 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66  * a limit or off
d460: 73 65 74 20 69 73 20 64 65 66 69 6e 65 64 20 62  set is defined b
d470: 79 20 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66  y pLimit and pOf
d480: 66 73 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e  fset.  iLimit an
d490: 64 0a 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f  d.** iOffset sho
d4a0: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 72  uld have been pr
d4b0: 65 73 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69  eset to appropri
d4c0: 61 74 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  ate default valu
d4d0: 65 73 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62  es.** (usually b
d4e0: 75 74 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31  ut not always -1
d4f0: 29 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  ) prior to calli
d500: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
d510: 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d  .** Only if pLim
d520: 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74  it!=0 or pOffset
d530: 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74  !=0 do the limit
d540: 20 72 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a   registers get.*
d550: 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68  * redefined.  Th
d560: 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72  e UNION ALL oper
d570: 61 74 6f 72 20 75 73 65 73 20 74 68 69 73 20 70  ator uses this p
d580: 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65  roperty to force
d590: 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66  .** the reuse of
d5a0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20   the same limit 
d5b0: 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67 69 73  and offset regis
d5c0: 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74  ters across mult
d5d0: 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73  iple.** SELECT s
d5e0: 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  tatements..*/.st
d5f0: 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74  atic void comput
d600: 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
d610: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
d620: 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42  elect *p, int iB
d630: 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76  reak){.  Vdbe *v
d640: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d   = 0;.  int iLim
d650: 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f  it = 0;.  int iO
d660: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64  ffset;.  int add
d670: 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  r1, n;.  if( p->
d680: 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b  iLimit ) return;
d690: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49  ..  /* .  ** "LI
d6a0: 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73  MIT -1" always s
d6b0: 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20  hows all rows.  
d6c0: 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20  There is some.  
d6d0: 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61  ** controversy a
d6e0: 62 6f 75 74 20 77 68 61 74 20 74 68 65 20 63 6f  bout what the co
d6f0: 72 72 65 63 74 20 62 65 68 61 76 69 6f 72 20 73  rrect behavior s
d700: 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54  hould be..  ** T
d710: 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
d720: 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70  mentation interp
d730: 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74  rets "LIMIT 0" t
d740: 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72  o mean.  ** no r
d750: 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ows..  */.  sqli
d760: 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
d770: 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  r(pParse);.  ass
d780: 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d  ert( p->pOffset=
d790: 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21  =0 || p->pLimit!
d7a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
d7b0: 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e  Limit ){.    p->
d7c0: 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20  iLimit = iLimit 
d7d0: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d7e0: 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ;.    v = sqlite
d7f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
d800: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
d810: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20  v==0) ) return; 
d820: 20 2f 2a 20 56 44 42 45 20 73 68 6f 75 6c 64 20   /* VDBE should 
d830: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
d840: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
d850: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
d860: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
d870: 4c 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20  Limit, &n) ){.  
d880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d890: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
d8a0: 67 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b  ger, n, iLimit);
d8b0: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
d8c0: 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f  nt((v, "LIMIT co
d8d0: 75 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20  unter"));.      
d8e0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
d8f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d900: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
d910: 2c 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , 0, iBreak);.  
d920: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e      }else if( n>
d930: 3d 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74  =0 && p->nSelect
d940: 52 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20  Row>(u64)n ){.  
d950: 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74        p->nSelect
d960: 52 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d  Row = n;.      }
d970: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d980: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d990: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69  e(pParse, p->pLi
d9a0: 6d 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  mit, iLimit);.  
d9b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d9c0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp1(v, OP_Must
d9d0: 42 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a  BeInt, iLimit);.
d9e0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
d9f0: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
da00: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
da10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
da20: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69  (v, OP_IfZero, i
da30: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a  Limit, iBreak);.
da40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
da50: 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
da60: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69    p->iOffset = i
da70: 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73  Offset = ++pPars
da80: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70  e->nMem;.      p
da90: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20  Parse->nMem++;  
daa0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20   /* Allocate an 
dab0: 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20 66  extra register f
dac0: 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20  or limit+offset 
dad0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
dae0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
daf0: 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66   p->pOffset, iOf
db00: 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  fset);.      sql
db10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
db20: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
db30: 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20  iOffset);.      
db40: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
db50: 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22  "OFFSET counter"
db60: 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20  ));.      addr1 
db70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
db80: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
db90: 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20   iOffset);.     
dba0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
dbb0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
dbc0: 2c 20 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20  , 0, iOffset);. 
dbd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
dbe0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
dbf0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
dc00: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
dc10: 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69  P_Add, iLimit, i
dc20: 4f 66 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b  Offset, iOffset+
dc30: 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
dc40: 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54  mment((v, "LIMIT
dc50: 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20  +OFFSET"));.    
dc60: 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65    addr1 = sqlite
dc70: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
dc80: 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29  P_IfPos, iLimit)
dc90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dca0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
dcb0: 49 6e 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66  Integer, -1, iOf
dcc0: 66 73 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73  fset+1);.      s
dcd0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
dce0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20  re(v, addr1);.  
dcf0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
dd00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
dd10: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f  OMPOUND_SELECT./
dd20: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
dd30: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c  appropriate coll
dd40: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
dd50: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
dd60: 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20  olumn of.** the 
dd70: 72 65 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74  result set for t
dd80: 68 65 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65  he compound-sele
dd90: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22  ct statement "p"
dda0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
ddb0: 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  f.** the column 
ddc0: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63  has no default c
ddd0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
dde0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c  e..**.** The col
ddf0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
de00: 66 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64  for the compound
de10: 20 73 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e   select is taken
de20: 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66   from the.** lef
de30: 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74  t-most term of t
de40: 68 65 20 73 65 6c 65 63 74 20 74 68 61 74 20 68  he select that h
de50: 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  as a collating s
de60: 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74  equence..*/.stat
de70: 69 63 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74  ic CollSeq *mult
de80: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50  iSelectCollSeq(P
de90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
dea0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f  lect *p, int iCo
deb0: 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l){.  CollSeq *p
dec0: 52 65 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  Ret;.  if( p->pP
ded0: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74  rior ){.    pRet
dee0: 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
def0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
df00: 3e 70 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a  >pPrior, iCol);.
df10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65    }else{.    pRe
df20: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  t = 0;.  }.  ass
df30: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a  ert( iCol>=0 );.
df40: 20 20 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26    if( pRet==0 &&
df50: 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d   iCol<p->pEList-
df60: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52  >nExpr ){.    pR
df70: 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  et = sqlite3Expr
df80: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
df90: 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f  p->pEList->a[iCo
dfa0: 6c 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20  l].pExpr);.  }. 
dfb0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
dfc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
dfd0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
dfe0: 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  ELECT */../* For
dff0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
e000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c  /.static int mul
e010: 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28  tiSelectOrderBy(
e020: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e030: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
e040: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e050: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
e060: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
e070: 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  ght-most of SELE
e080: 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20  CTs to be coded 
e090: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
e0a0: 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68  *pDest     /* Wh
e0b0: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75  at to do with qu
e0c0: 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
e0d0: 3b 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;...#ifndef SQLI
e0e0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
e0f0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68  _SELECT./*.** Th
e100: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
e110: 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
e120: 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
e130: 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77   form from.** tw
e140: 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61  o or more separa
e150: 74 65 20 71 75 65 72 69 65 73 20 75 73 69 6e 67  te queries using
e160: 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c   UNION, UNION AL
e170: 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a  L, EXCEPT, or.**
e180: 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a   INTERSECT.**.**
e190: 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74   "p" points to t
e1a0: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
e1b0: 20 74 68 65 20 74 77 6f 20 71 75 65 72 69 65 73   the two queries
e1c0: 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20  .  the query on 
e1d0: 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70  the.** left is p
e1e0: 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c  ->pPrior.  The l
e1f0: 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20  eft query could 
e200: 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75  also be a compou
e210: 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77  nd query.** in w
e220: 68 69 63 68 20 63 61 73 65 20 74 68 69 73 20 72  hich case this r
e230: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63  outine will be c
e240: 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c  alled recursivel
e250: 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  y. .**.** The re
e260: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74  sults of the tot
e270: 61 6c 20 71 75 65 72 79 20 61 72 65 20 74 6f 20  al query are to 
e280: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
e290: 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a  a destination.**
e2a0: 20 6f 66 20 74 79 70 65 20 65 44 65 73 74 20 77   of type eDest w
e2b0: 69 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 50  ith parameter iP
e2c0: 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  arm..**.** Examp
e2d0: 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20  le 1:  Consider 
e2e0: 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70  a three-way comp
e2f0: 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65  ound SQL stateme
e300: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  nt..**.**     SE
e310: 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55  LECT a FROM t1 U
e320: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52  NION SELECT b FR
e330: 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t2 UNION SELE
e340: 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a  CT c FROM t3.**.
e350: 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
e360: 74 20 69 73 20 70 61 72 73 65 64 20 75 70 20 61  t is parsed up a
e370: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
e380: 20 20 20 20 20 53 45 4c 45 43 54 20 63 20 46 52       SELECT c FR
e390: 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a  OM t3.**      |.
e3a0: 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20  **      `-----> 
e3b0: 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74   SELECT b FROM t
e3c0: 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  2.**            
e3d0: 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20      |.**        
e3e0: 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e          `------>
e3f0: 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20    SELECT a FROM 
e400: 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72  t1.**.** The arr
e410: 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61 67 72  ows in the diagr
e420: 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65 73 65  am above represe
e430: 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50  nt the Select.pP
e440: 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  rior pointer..**
e450: 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74   So if this rout
e460: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69  ine is called wi
e470: 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68  th p equal to th
e480: 65 20 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e  e t3 query, then
e490: 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20  .** pPrior will 
e4a0: 62 65 20 74 68 65 20 74 32 20 71 75 65 72 79 2e  be the t2 query.
e4b0: 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20    p->op will be 
e4c0: 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73  TK_UNION in this
e4d0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   case..**.** Not
e4e0: 69 63 65 20 74 68 61 74 20 62 65 63 61 75 73 65  ice that because
e4f0: 20 6f 66 20 74 68 65 20 77 61 79 20 53 51 4c 69   of the way SQLi
e500: 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75  te parses compou
e510: 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a  nd SELECTs, the.
e520: 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65  ** individual se
e530: 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f  lects always gro
e540: 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  up from left to 
e550: 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  right..*/.static
e560: 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
e570: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e580: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
e590: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
e5a0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
e5b0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
e5c0: 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
e5d0: 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
e5e0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
e5f0: 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
e600: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
e610: 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
e620: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e630: 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75  LITE_OK;   /* Su
e640: 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20  ccess code from 
e650: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
e660: 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72    Select *pPrior
e670: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68  ;       /* Anoth
e680: 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69  er SELECT immedi
e690: 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66  ately to our lef
e6a0: 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
e6d0: 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20   this VDBE */.  
e6e0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
e6f0: 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
e700: 74 69 76 65 20 64 61 74 61 20 64 65 73 74 69 6e  tive data destin
e710: 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63  ation */.  Selec
e720: 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20  t *pDelete = 0; 
e730: 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d   /* Chain of sim
e740: 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64  ple selects to d
e750: 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  elete */.  sqlit
e760: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
e770: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
e780: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64  nection */.#ifnd
e790: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
e7a0: 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
e7b0: 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
e7c0: 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
e7d0: 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
e7e0: 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
e7f0: 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
e800: 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
e810: 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
e820: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
e830: 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
e840: 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61   BY or LIMIT cla
e850: 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c  use on prior SEL
e860: 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a  ECTs.  Only.  **
e870: 20 74 68 65 20 6c 61 73 74 20 28 72 69 67 68 74   the last (right
e880: 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e  -most) SELECT in
e890: 20 74 68 65 20 73 65 72 69 65 73 20 6d 61 79 20   the series may 
e8a0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
e8b0: 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a   or LIMIT..  */.
e8c0: 20 20 61 73 73 65 72 74 28 20 70 20 26 26 20 70    assert( p && p
e8d0: 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20  ->pPrior );  /* 
e8e0: 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  Calling function
e8f0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73   guarantees this
e900: 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73 65 72   much */.  asser
e910: 74 28 20 70 2d 3e 70 52 65 63 75 72 73 65 3d 3d  t( p->pRecurse==
e920: 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41  0 || p->op==TK_A
e930: 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  LL || p->op==TK_
e940: 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20  UNION );.  db = 
e950: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50  pParse->db;.  pP
e960: 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
e970: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
e980: 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d  or->pRightmost!=
e990: 70 50 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65  pPrior );.  asse
e9a0: 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67  rt( pPrior->pRig
e9b0: 68 74 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68  htmost==p->pRigh
e9c0: 74 6d 6f 73 74 20 29 3b 0a 20 20 64 65 73 74 20  tmost );.  dest 
e9d0: 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20  = *pDest;.  if( 
e9e0: 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
e9f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
ea00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
ea10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
ea20: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65  should come afte
ea30: 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22  r %s not before"
ea40: 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70  ,.      selectOp
ea50: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
ea60: 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f    rc = 1;.    go
ea70: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
ea80: 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
ea90: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b  Prior->pLimit ){
eaa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
eab0: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d  rMsg(pParse,"LIM
eac0: 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64  IT clause should
ead0: 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e   come after %s n
eae0: 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20  ot before",.    
eaf0: 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70    selectOpName(p
eb00: 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->op));.    rc =
eb10: 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c   1;.    goto mul
eb20: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
eb30: 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65   }..  v = sqlite
eb40: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
eb50: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
eb60: 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45   );  /* The VDBE
eb70: 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65 64   already created
eb80: 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63   by calling func
eb90: 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72  tion */..  /* Cr
eba0: 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e 61  eate the destina
ebb0: 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  tion temporary t
ebc0: 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  able if necessar
ebd0: 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  y.  */.  if( des
ebe0: 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68  t.eDest==SRT_Eph
ebf0: 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  emTab ){.    ass
ec00: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
ec10: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
ec20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
ec30: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73  enEphemeral, des
ec40: 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45  t.iSDParm, p->pE
ec50: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
ec60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
ec70: 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
ec80: 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64  NORDERED);.    d
ec90: 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f  est.eDest = SRT_
eca0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Table;.  }..  /*
ecb0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53   Make sure all S
ecc0: 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73 74  ELECTs in the st
ecd0: 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65  atement have the
ece0: 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20   same number of 
ecf0: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e  elements.  ** in
ed00: 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73 65   their result se
ed10: 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ts..  */.  asser
ed20: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  t( p->pEList && 
ed30: 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29  pPrior->pEList )
ed40: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  ;.  if( p->pELis
ed50: 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72  t->nExpr!=pPrior
ed60: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
ed70: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65  ){.    if( p->se
ed80: 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75  lFlags & SF_Valu
ed90: 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  es ){.      sqli
eda0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
edb0: 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20  se, "all VALUES 
edc0: 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73 61  must have the sa
edd0: 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72  me number of ter
ede0: 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ms");.    }else{
edf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
ee00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
ee10: 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c  SELECTs to the l
ee20: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66  eft and right of
ee30: 20 25 73 22 0a 20 20 20 20 20 20 20 20 22 20 64   %s".        " d
ee40: 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73  o not have the s
ee50: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  ame number of re
ee60: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73  sult columns", s
ee70: 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
ee80: 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  p));.    }.    r
ee90: 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  c = 1;.    goto 
eea0: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
eeb0: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
eec0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20  QLITE_OMIT_CTE. 
eed0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
eee0: 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72 79   recursive query
eef0: 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
ef00: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
ef10: 59 20 6f 72 0a 20 20 2a 2a 20 4c 49 4d 49 54 20  Y or.  ** LIMIT 
ef20: 63 6c 61 75 73 65 2e 20 4e 65 69 74 68 65 72 20  clause. Neither 
ef30: 6f 66 20 74 68 65 73 65 20 61 72 65 20 73 75 70  of these are sup
ef40: 70 6f 72 74 65 64 2e 20 20 2a 2f 0a 20 20 61 73  ported.  */.  as
ef50: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
ef60: 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74  ==0 || p->pLimit
ef70: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65   );.  if( p->pRe
ef80: 63 75 72 73 65 20 26 26 20 28 70 2d 3e 70 4f 72  curse && (p->pOr
ef90: 64 65 72 42 79 20 7c 7c 20 70 2d 3e 70 4c 69 6d  derBy || p->pLim
efa0: 69 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  it) ){.    sqlit
efb0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
efc0: 65 2c 20 22 25 73 20 69 6e 20 61 20 72 65 63 75  e, "%s in a recu
efd0: 72 73 69 76 65 20 71 75 65 72 79 20 69 73 20 6e  rsive query is n
efe0: 6f 74 20 61 6c 6c 6f 77 65 64 22 2c 0a 20 20 20  ot allowed",.   
eff0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
f000: 20 3f 20 22 4f 52 44 45 52 20 42 59 22 20 3a 20   ? "ORDER BY" : 
f010: 22 4c 49 4d 49 54 22 0a 20 20 20 20 29 3b 0a 20  "LIMIT".    );. 
f020: 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
f030: 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20  lect_end;.  }.. 
f040: 20 69 66 28 20 70 2d 3e 70 52 65 63 75 72 73 65   if( p->pRecurse
f050: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c   ){.    int nCol
f060: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
f070: 78 70 72 3b 0a 20 20 20 20 69 6e 74 20 61 64 64  xpr;.    int add
f080: 72 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 61  rNext;.    int a
f090: 64 64 72 53 77 61 70 3b 0a 20 20 20 20 69 6e 74  ddrSwap;.    int
f0a0: 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 3b 0a   iCont, iBreak;.
f0b0: 20 20 20 20 69 6e 74 20 74 6d 70 31 2c 20 74 6d      int tmp1, tm
f0c0: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
f0d0: 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 75 73 65    /* Cursors use
f0e0: 64 20 74 6f 20 61 63 63 65 73 73 20 74 65 6d 70  d to access temp
f0f0: 6f 72 61 72 79 20 74 61 62 6c 65 73 20 2a 2f 0a  orary tables */.
f100: 20 20 20 20 69 6e 74 20 74 6d 70 33 20 3d 20 30      int tmp3 = 0
f110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f120: 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
f130: 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
f140: 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 20 20 69 6e   UNION */.    in
f150: 74 20 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t eDest = SRT_Ta
f160: 62 6c 65 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  ble;.    SelectD
f170: 65 73 74 20 74 6d 70 32 64 65 73 74 3b 0a 0a 20  est tmp2dest;.. 
f180: 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69     iBreak = sqli
f190: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
f1a0: 28 76 29 3b 0a 20 20 20 20 69 43 6f 6e 74 20 3d  (v);.    iCont =
f1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
f1c0: 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 74  Label(v);..    t
f1d0: 6d 70 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  mp1 = pParse->nT
f1e0: 61 62 2b 2b 3b 0a 20 20 20 20 74 6d 70 32 20 3d  ab++;.    tmp2 =
f1f0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
f200: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  .    if( p->op==
f210: 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20  TK_UNION ){.    
f220: 20 20 65 44 65 73 74 20 3d 20 53 52 54 5f 44 69    eDest = SRT_Di
f230: 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 74  stTable;.      t
f240: 6d 70 33 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  mp3 = pParse->nT
f250: 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ab++;.    }.    
f260: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
f270: 74 49 6e 69 74 28 26 74 6d 70 32 64 65 73 74 2c  tInit(&tmp2dest,
f280: 20 65 44 65 73 74 2c 20 74 6d 70 32 29 3b 0a 0a   eDest, tmp2);..
f290: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f2a0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
f2b0: 45 70 68 65 6d 65 72 61 6c 2c 20 74 6d 70 31 2c  Ephemeral, tmp1,
f2c0: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 73 71 6c 69   nCol);.    sqli
f2d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f2e0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
f2f0: 6c 2c 20 74 6d 70 32 2c 20 6e 43 6f 6c 29 3b 0a  l, tmp2, nCol);.
f300: 20 20 20 20 69 66 28 20 74 6d 70 33 20 29 7b 0a      if( tmp3 ){.
f310: 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
f320: 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69 74  nEphm[0] = sqlit
f330: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
f340: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
f350: 2c 20 74 6d 70 33 2c 20 30 29 3b 0a 20 20 20 20  , tmp3, 0);.    
f360: 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
f370: 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61   SF_UsesEphemera
f380: 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  l;.    }..    /*
f390: 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
f3a0: 74 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  ts of the initia
f3b0: 6c 20 53 45 4c 45 43 54 20 69 6e 20 74 6d 70 32  l SELECT in tmp2
f3c0: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
f3d0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
f3e0: 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 74 6d 70  se, pPrior, &tmp
f3f0: 32 64 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20  2dest);.    if( 
f400: 72 63 20 29 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  rc ) goto multi_
f410: 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
f420: 20 2f 2a 20 43 6c 65 61 72 20 74 6d 70 31 2e 20   /* Clear tmp1. 
f430: 54 68 65 6e 20 73 77 69 74 63 68 20 74 68 65 20  Then switch the 
f440: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 6d 70 31  contents of tmp1
f450: 20 61 6e 64 20 74 6d 70 32 2e 20 54 68 65 6e 20   and tmp2. Then 
f460: 72 65 74 75 72 6e 20 0a 20 20 20 20 2a 2a 20 74  return .    ** t
f470: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
f480: 6d 70 31 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  mp1 to the calle
f490: 72 2e 20 4f 72 2c 20 69 66 20 74 6d 70 31 20 69  r. Or, if tmp1 i
f4a0: 73 20 65 6d 70 74 79 20 61 74 20 74 68 69 73 0a  s empty at this.
f4b0: 20 20 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 74 68      ** point, th
f4c0: 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65 72  e recursive quer
f4d0: 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 2d  y has finished -
f4e0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 65 73 73   jump to address
f4f0: 20 69 42 72 65 61 6b 2e 20 20 2a 2f 0a 20 20 20   iBreak.  */.   
f500: 20 61 64 64 72 53 77 61 70 20 3d 20 73 71 6c 69   addrSwap = sqli
f510: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f520: 20 4f 50 5f 53 77 61 70 43 75 72 73 6f 72 73 2c   OP_SwapCursors,
f530: 20 74 6d 70 31 2c 20 74 6d 70 32 29 3b 0a 20 20   tmp1, tmp2);.  
f540: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f550: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
f560: 2c 20 74 6d 70 31 2c 20 69 42 72 65 61 6b 29 3b  , tmp1, iBreak);
f570: 0a 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20  .    addrNext = 
f580: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
f590: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
f5a0: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
f5b0: 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
f5c0: 69 73 74 2c 20 74 6d 70 31 2c 20 70 2d 3e 70 45  ist, tmp1, p->pE
f5d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20  List->nExpr,.   
f5e0: 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74       0, 0, &dest
f5f0: 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29  , iCont, iBreak)
f600: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f610: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
f620: 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 73 71 6c   iCont);.    sql
f630: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
f640: 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 6d 70 31 2c  , OP_Next, tmp1,
f650: 20 61 64 64 72 4e 65 78 74 29 3b 0a 0a 20 20 20   addrNext);..   
f660: 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
f670: 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
f680: 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75  . Store the resu
f690: 6c 74 73 20 69 6e 20 74 6d 70 32 2e 20 57 68 69  lts in tmp2. Whi
f6a0: 6c 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 53  le this.    ** S
f6b0: 45 4c 45 43 54 20 69 73 20 72 75 6e 6e 69 6e 67  ELECT is running
f6c0: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
f6d0: 66 20 74 6d 70 31 20 61 72 65 20 72 65 61 64 20  f tmp1 are read 
f6e0: 62 79 20 72 65 63 75 72 73 69 76 65 20 0a 20 20  by recursive .  
f6f0: 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20    ** references 
f700: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43  to the current C
f710: 54 45 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 70  TE.  */.    p->p
f720: 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
f730: 2d 3e 70 52 65 63 75 72 73 65 2d 3e 74 6e 75 6d  ->pRecurse->tnum
f740: 20 3d 20 74 6d 70 31 3b 0a 20 20 20 20 61 73 73   = tmp1;.    ass
f750: 65 72 74 28 20 28 70 2d 3e 70 52 65 63 75 72 73  ert( (p->pRecurs
f760: 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  e->tabFlags & TF
f770: 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20 29  _Recursive)==0 )
f780: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 63 75 72 73  ;.    p->pRecurs
f790: 65 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  e->tabFlags |= T
f7a0: 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20  F_Recursive;.   
f7b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
f7c0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
f7d0: 74 6d 70 32 64 65 73 74 29 3b 0a 20 20 20 20 70  tmp2dest);.    p
f7e0: 2d 3e 70 52 65 63 75 72 73 65 2d 3e 74 61 62 46  ->pRecurse->tabF
f7f0: 6c 61 67 73 20 26 3d 20 7e 54 46 5f 52 65 63 75  lags &= ~TF_Recu
f800: 72 73 69 76 65 3b 0a 20 20 20 20 61 73 73 65 72  rsive;.    asser
f810: 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20  t( p->pPrior==0 
f820: 29 3b 0a 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  );.    p->pPrior
f830: 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 69   = pPrior;.    i
f840: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 75 6c  f( rc ) goto mul
f850: 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  ti_select_end;..
f860: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f870: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
f880: 2c 20 30 2c 20 61 64 64 72 53 77 61 70 29 3b 0a  , 0, addrSwap);.
f890: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
f8a0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
f8b0: 42 72 65 61 6b 29 3b 0a 20 20 7d 65 6c 73 65 0a  Break);.  }else.
f8c0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d  #endif..  /* Com
f8d0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68  pound SELECTs th
f8e0: 61 74 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52  at have an ORDER
f8f0: 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 68   BY clause are h
f900: 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
f910: 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  y..  */.  if( p-
f920: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
f930: 20 72 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c   return multiSel
f940: 65 63 74 4f 72 64 65 72 42 79 28 70 50 61 72 73  ectOrderBy(pPars
f950: 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
f960: 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65  }else..  /* Gene
f970: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
f980: 65 20 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74  e left and right
f990: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f9a0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63  ts..  */.  switc
f9b0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
f9c0: 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20  case TK_ALL: {. 
f9d0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
f9e0: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  0;.      int nLi
f9f0: 6d 69 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  mit;.      asser
fa00: 74 28 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  t( !pPrior->pLim
fa10: 69 74 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69  it );.      pPri
fa20: 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e  or->iLimit = p->
fa30: 69 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50  iLimit;.      pP
fa40: 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20  rior->iOffset = 
fa50: 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20  p->iOffset;.    
fa60: 20 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74    pPrior->pLimit
fa70: 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
fa80: 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66      pPrior->pOff
fa90: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
faa0: 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
fab0: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
fac0: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
fad0: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
fae0: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
faf0: 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
fb00: 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
fb10: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
fb20: 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
fb30: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
fb40: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  c ){.        got
fb50: 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
fb60: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
fb70: 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
fb80: 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74  .      p->iLimit
fb90: 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69   = pPrior->iLimi
fba0: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66  t;.      p->iOff
fbb0: 73 65 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f  set = pPrior->iO
fbc0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28  ffset;.      if(
fbd0: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20   p->iLimit ){.  
fbe0: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
fbf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
fc00: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e  , OP_IfZero, p->
fc10: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20  iLimit);.       
fc20: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
fc30: 20 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20   "Jump ahead if 
fc40: 4c 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29  LIMIT reached"))
fc50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fc60: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
fc70: 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
fc80: 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
fc90: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
fca0: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
fcb0: 2c 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  , p, &dest);.   
fcc0: 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
fcd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
fce0: 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
fcf0: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
fd00: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
fd10: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c  r;.      p->nSel
fd20: 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
fd30: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
fd40: 20 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e      if( pPrior->
fd50: 70 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26  pLimit.       &&
fd60: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
fd70: 74 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c  teger(pPrior->pL
fd80: 69 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20  imit, &nLimit). 
fd90: 20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e        && nLimit>
fda0: 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
fdb0: 6f 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74  ow > (u64)nLimit
fdc0: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
fdd0: 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
fde0: 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = nLimit;.     
fdf0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64   }.      if( add
fe00: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  r ){.        sql
fe10: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
fe20: 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  (v, addr);.     
fe30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
fe40: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
fe50: 4b 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61  K_EXCEPT:.    ca
fe60: 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20  se TK_UNION: {. 
fe70: 20 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61       int unionTa
fe80: 62 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  b;    /* Cursor 
fe90: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65  number of the te
fea0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f  mporary table ho
feb0: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a  lding result */.
fec0: 20 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b        u8 op = 0;
fed0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
fee0: 20 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74   the SRT_ operat
fef0: 69 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f  ions to apply to
ff00: 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69   self */.      i
ff10: 6e 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20  nt priorOp;     
ff20: 2f 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72  /* The SRT_ oper
ff30: 61 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74  ation to apply t
ff40: 6f 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20  o prior selects 
ff50: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
ff60: 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b  Limit, *pOffset;
ff70: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73   /* Saved values
ff80: 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e   of p->nLimit an
ff90: 64 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a  d p->nOffset */.
ffa0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
ffb0: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
ffc0: 20 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20   uniondest;..   
ffd0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
ffe0: 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b  op==TK_EXCEPT );
fff0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10000 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
10010 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f   );.      priorO
10020 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20  p = SRT_Union;. 
10030 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44       if( dest.eD
10040 65 73 74 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20  est==priorOp && 
10050 41 4c 57 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69  ALWAYS(!p->pLimi
10060 74 20 26 26 21 70 2d 3e 70 4f 66 66 73 65 74 29  t &&!p->pOffset)
10070 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
10080 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
10090 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
100a0 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
100b0 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
100c0 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
100d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
100e0 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68  assert( p->pRigh
100f0 74 6d 6f 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20  tmost!=p );  /* 
10100 43 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  Can only happen 
10110 66 6f 72 20 6c 65 66 74 77 61 72 64 20 65 6c 65  for leftward ele
10120 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20 20 20  ments.          
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66             ** of
10150 20 61 20 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65   a 3-way or more
10160 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20   compound */.   
10170 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
10180 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
10190 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
101a0 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
101b0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
101c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
101d0 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
101e0 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
101f0 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
10200 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
10210 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44  onTab = dest.iSD
10220 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
10230 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
10240 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
10250 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
10260 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
10270 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
10280 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
10290 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
102a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
102b0 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
102c0 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
102d0 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
102e0 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
102f0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
10300 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10310 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
10320 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
10330 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
10340 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
10350 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
10360 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
10370 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
10380 20 20 20 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f       p->pRightmo
10390 73 74 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  st->selFlags |= 
103a0 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
103b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
103c0 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20  ( p->pEList );. 
103d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
103e0 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
103f0 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f   statements to o
10400 75 72 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f  ur left.      */
10410 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
10420 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79  pPrior->pOrderBy
10430 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
10440 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
10450 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f  &uniondest, prio
10460 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a  rOp, unionTab);.
10470 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
10480 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
10490 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
104a0 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
104b0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
104c0 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
104d0 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
104e0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
104f0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
10500 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
10510 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
10520 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
10530 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
10540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
10550 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43  f( p->op==TK_EXC
10560 45 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  EPT ){.        o
10570 70 20 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a  p = SRT_Except;.
10580 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
105a0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a  op==TK_UNION );.
105b0 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
105c0 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a  _Union;.      }.
105d0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
105e0 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69  = 0;.      pLimi
105f0 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
10600 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
10610 20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65   0;.      pOffse
10620 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
10630 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
10640 20 3d 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f   = 0;.      unio
10650 6e 64 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70  ndest.eDest = op
10660 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
10670 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
10680 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
10690 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
106a0 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
106b0 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e  t(pParse, p, &un
106c0 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
106d0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
106e0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
106f0 20 2f 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65   /* Query flatte
10700 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53  ning in sqlite3S
10710 65 6c 65 63 74 28 29 20 6d 69 67 68 74 20 72 65  elect() might re
10720 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79  fill p->pOrderBy
10730 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75  ..      ** Be su
10740 72 65 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e  re to delete p->
10750 70 4f 72 64 65 72 42 79 2c 20 74 68 65 72 65 66  pOrderBy, theref
10760 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  ore, to avoid a 
10770 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a  memory leak. */.
10780 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
10790 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
107a0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
107b0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
107c0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
107d0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
107e0 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64  r;.      p->pOrd
107f0 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
10800 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e  if( p->op==TK_UN
10810 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74  ION ) p->nSelect
10820 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e  Row += pPrior->n
10830 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
10840 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
10850 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
10860 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
10870 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20  it = pLimit;.   
10880 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
10890 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
108a0 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->iLimit = 0;.  
108b0 20 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d      p->iOffset =
108c0 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   0;..      /* Co
108d0 6e 76 65 72 74 20 74 68 65 20 64 61 74 61 20 69  nvert the data i
108e0 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
108f0 74 61 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65  table into whate
10900 76 65 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  ver form.      *
10910 2a 20 69 74 20 69 73 20 74 68 61 74 20 77 65 20  * it is that we 
10920 63 75 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a  currently need..
10930 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
10940 73 73 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d  ssert( unionTab=
10950 3d 64 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c  =dest.iSDParm ||
10960 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69   dest.eDest!=pri
10970 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66  orOp );.      if
10980 28 20 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72  ( dest.eDest!=pr
10990 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
109a0 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
109b0 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
109c0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
109d0 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  EList );.       
109e0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d   if( dest.eDest=
109f0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
10a00 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
10a10 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
10a20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46         while( pF
10a30 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70  irst->pPrior ) p
10a40 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e  First = pFirst->
10a50 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20  pPrior;.        
10a60 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
10a70 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
10a80 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
10a90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10aa0 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
10ab0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10ac0 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43  l(v);.        iC
10ad0 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ont = sqlite3Vdb
10ae0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
10af0 20 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69         computeLi
10b00 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
10b10 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b  rse, p, iBreak);
10b20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10b30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10b40 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61  _Rewind, unionTa
10b50 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  b, iBreak);.    
10b60 20 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c      iStart = sql
10b70 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
10b80 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20  ddr(v);.        
10b90 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
10ba0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45  pParse, p, p->pE
10bb0 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  List, unionTab, 
10bc0 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
10bd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10be0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
10bf0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
10c00 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
10c10 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
10c20 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29  eLabel(v, iCont)
10c30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10c40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10c50 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62  P_Next, unionTab
10c60 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  , iStart);.     
10c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
10c80 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42  solveLabel(v, iB
10c90 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 73  reak);.        s
10ca0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10cb0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e  (v, OP_Close, un
10cc0 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  ionTab, 0);.    
10cd0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10ce0 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
10cf0 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e 6f  lt: assert( p->o
10d00 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
10d10 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  ); {.      int t
10d20 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20 20  ab1, tab2;.     
10d30 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65   int iCont, iBre
10d40 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20  ak, iStart;.    
10d50 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
10d60 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  *pOffset;.      
10d70 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
10d80 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65 72  SelectDest inter
10d90 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20 20  sectdest;.      
10da0 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f  int r1;..      /
10db0 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20 64  * INTERSECT is d
10dc0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
10dd0 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20 69  e others since i
10de0 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20  t requires.     
10df0 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61 72   ** two temporar
10e00 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63 65  y tables.  Hence
10e10 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e 20   it has its own 
10e20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20 20  case.  Begin.   
10e30 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74     ** by allocat
10e40 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20 77  ing the tables w
10e50 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20  e will need..   
10e60 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62 31     */.      tab1
10e70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
10e80 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d 20  +;.      tab2 = 
10e90 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
10ea0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
10eb0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
10ec0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
10ed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
10ee0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
10ef0 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ral, tab1, 0);. 
10f00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
10f10 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
10f20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
10f30 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
10f40 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
10f50 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73  p->pRightmost->s
10f60 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
10f70 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20  esEphemeral;.   
10f80 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
10f90 4c 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f  List );..      /
10fa0 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43  * Code the SELEC
10fb0 54 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69  Ts to our left i
10fc0 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  nto temporary ta
10fd0 62 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20  ble "tab1"..    
10fe0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
10ff0 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
11000 28 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c  (&intersectdest,
11010 20 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31   SRT_Union, tab1
11020 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
11030 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
11040 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
11050 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
11060 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
11070 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
11080 72 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73  r, &intersectdes
11090 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
110a0 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
110b0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
110c0 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  d;.      }..    
110d0 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75    /* Code the cu
110e0 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74  rrent SELECT int
110f0 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  o temporary tabl
11100 65 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a  e "tab2".      *
11110 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  /.      addr = s
11120 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11130 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
11140 65 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a  eral, tab2, 0);.
11150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
11160 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d  >addrOpenEphm[1]
11170 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
11180 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11190 31 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  1] = addr;.     
111a0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
111b0 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70        pLimit = p
111c0 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  ->pLimit;.      
111d0 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  p->pLimit = 0;. 
111e0 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70       pOffset = p
111f0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
11200 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b   p->pOffset = 0;
11210 0a 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74  .      intersect
11220 64 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74  dest.iSDParm = t
11230 61 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ab2;.      expla
11240 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
11250 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
11260 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
11270 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
11280 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
11290 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
112a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
112b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
112c0 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
112d0 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
112e0 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
112f0 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  Prior;.      if(
11300 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70   p->nSelectRow>p
11310 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
11320 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
11330 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
11340 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
11350 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
11360 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
11370 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
11380 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
11390 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
113a0 66 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  fset;..      /* 
113b0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
113c0 20 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73   take the inters
113d0 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77  ection of the tw
113e0 6f 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  o temporary.    
113f0 20 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20    ** tables..   
11400 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
11410 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
11420 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
11430 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
11440 74 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c  t ){.        Sel
11450 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b  ect *pFirst = p;
11460 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
11470 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29  pFirst->pPrior )
11480 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74   pFirst = pFirst
11490 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
114a0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
114b0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
114c0 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
114d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
114e0 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
114f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
11500 3b 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20  ;.      iCont = 
11510 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
11520 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63  abel(v);.      c
11530 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73  omputeLimitRegis
11540 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20  ters(pParse, p, 
11550 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73  iBreak);.      s
11560 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
11570 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74  (v, OP_Rewind, t
11580 61 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ab1, iBreak);.  
11590 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
115a0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
115b0 65 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74  e);.      iStart
115c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
115d0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  dOp2(v, OP_RowKe
115e0 79 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20  y, tab1, r1);.  
115f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11600 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e  ddOp4Int(v, OP_N
11610 6f 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69  otFound, tab2, i
11620 43 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20  Cont, r1, 0);.  
11630 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
11640 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
11650 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c  , r1);.      sel
11660 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
11670 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
11680 74 2c 20 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69  t, tab1, p->pELi
11690 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
116a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
116b0 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69 43   0, 0, &dest, iC
116c0 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  ont, iBreak);.  
116d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
116e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
116f0 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Cont);.      sql
11700 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11710 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c  , OP_Next, tab1,
11720 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   iStart);.      
11730 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
11740 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
11750 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
11760 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11770 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30  P_Close, tab2, 0
11780 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11790 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
117a0 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20 30 29  _Close, tab1, 0)
117b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
117c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c     }.  }..  expl
117d0 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70 50 61  ainComposite(pPa
117e0 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62  rse, p->op, iSub
117f0 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21  1, iSub2, p->op!
11800 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20  =TK_ALL);..  /* 
11810 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e  Compute collatin
11820 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 64  g sequences used
11830 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   by .  ** tempor
11840 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65 64 65  ary tables neede
11850 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
11860 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
11870 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63 68 20  ct..  ** Attach 
11880 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
11890 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d  cture to all tem
118a0 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e 0a 20  porary tables.. 
118b0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 73 65   **.  ** This se
118c0 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62 79 20  ction is run by 
118d0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
118e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
118f0 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43  only..  ** SELEC
11900 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  T statements to 
11910 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79 73 20  the left always 
11920 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 2e 20  skip this part. 
11930 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   The right-most.
11940 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69 67 68    ** SELECT migh
11950 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68 69 73  t also skip this
11960 20 70 61 72 74 20 69 66 20 69 74 20 68 61 73 20   part if it has 
11970 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
11980 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74  se and.  ** no t
11990 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65 20 72  emp tables are r
119a0 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  equired..  */.  
119b0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
119c0 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72  & SF_UsesEphemer
119d0 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  al ){.    int i;
119e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
11a00 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b  counter */.    K
11a10 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
11a20 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
11a30 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
11a40 63 65 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ce for the resul
11a50 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c  t set */.    Sel
11a60 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20  ect *pLoop;     
11a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
11a80 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
11a90 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
11aa0 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  nts */.    CollS
11ab0 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20  eq **apColl;    
11ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
11ad0 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20  looping through 
11ae0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
11af0 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  ] */.    int nCo
11b00 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
11b10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11b20 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72   of columns in r
11b30 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
11b40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 69    assert( p->pRi
11b50 67 68 74 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20  ghtmost==p );.  
11b60 20 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69    nCol = p->pELi
11b70 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70  st->nExpr;.    p
11b80 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
11b90 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62  3KeyInfoAlloc(db
11ba0 2c 20 6e 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20  , nCol, 1);.    
11bb0 69 66 28 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b  if( !pKeyInfo ){
11bc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
11bd0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
11be0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
11bf0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
11c00 20 66 6f 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c   for(i=0, apColl
11c10 3d 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  =pKeyInfo->aColl
11c20 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61  ; i<nCol; i++, a
11c30 70 43 6f 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  pColl++){.      
11c40 2a 61 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53  *apColl = multiS
11c50 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61  electCollSeq(pPa
11c60 72 73 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20  rse, p, i);.    
11c70 20 20 69 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c    if( 0==*apColl
11c80 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 70 43   ){.        *apC
11c90 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
11ca0 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
11cb0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f   }..    for(pLoo
11cc0 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f  p=p; pLoop; pLoo
11cd0 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29  p=pLoop->pPrior)
11ce0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
11cf0 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<2; i++){.    
11d00 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 70      int addr = p
11d10 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
11d20 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  hm[i];.        i
11d30 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
11d40 20 20 20 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d         /* If [0]
11d50 20 69 73 20 75 6e 75 73 65 64 20 74 68 65 6e 20   is unused then 
11d60 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75 6e 75 73  [1] is also unus
11d70 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 0a 20  ed.  So we can. 
11d80 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61           ** alwa
11d90 79 73 20 73 61 66 65 6c 79 20 61 62 6f 72 74 20  ys safely abort 
11da0 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 66  as soon as the f
11db0 69 72 73 74 20 75 6e 75 73 65 64 20 73 6c 6f 74  irst unused slot
11dc0 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20   is found */.   
11dd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11de0 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70  Loop->addrOpenEp
11df0 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20  hm[1]<0 );.     
11e00 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11e10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
11e20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11e30 32 28 76 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29  2(v, addr, nCol)
11e40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11e50 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
11e60 20 61 64 64 72 2c 20 28 63 68 61 72 2a 29 73 71   addr, (char*)sq
11e70 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
11e80 70 4b 65 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20  pKeyInfo),.     
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ea0 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 4e 46         P4_KEYINF
11eb0 4f 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  O);.        pLoo
11ec0 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
11ed0 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  i] = -1;.      }
11ee0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
11ef0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
11f00 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d  KeyInfo);.  }..m
11f10 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a  ulti_select_end:
11f20 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20  .  pDest->iSdst 
11f30 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a 20 20  = dest.iSdst;.  
11f40 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64  pDest->nSdst = d
11f50 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c  est.nSdst;.  sql
11f60 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
11f70 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20  (db, pDelete);. 
11f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
11f90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11fa0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
11fb0 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ECT */../*.** Co
11fc0 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73 75 62  de an output sub
11fd0 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20 63 6f  routine for a co
11fe0 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
11ff0 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53  tation of a.** S
12000 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a  ELECT statment..
12010 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 20 74  **.** The data t
12020 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73 20 63  o be output is c
12030 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d  ontained in pIn-
12040 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65 20 61  >iSdst.  There a
12050 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74  re.** pIn->nSdst
12060 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f   columns to be o
12070 75 74 70 75 74 2e 20 20 70 44 65 73 74 20 69 73  utput.  pDest is
12080 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 75   where the outpu
12090 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
120a0 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65  ent..**.** regRe
120b0 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  turn is the numb
120c0 65 72 20 6f 66 20 74 68 65 20 72 65 67 69 73 74  er of the regist
120d0 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  er holding the s
120e0 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  ubroutine.** ret
120f0 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  urn address..**.
12100 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e 30 20  ** If regPrev>0 
12110 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 66  then it is the f
12120 69 72 73 74 20 72 65 67 69 73 74 65 72 20 69 6e  irst register in
12130 20 61 20 76 65 63 74 6f 72 20 74 68 61 74 0a 2a   a vector that.*
12140 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20 70 72  * records the pr
12150 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20  evious output.  
12160 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69 73 20  mem[regPrev] is 
12170 61 20 66 6c 61 67 20 74 68 61 74 20 69 73 20 66  a flag that is f
12180 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65 72 65  alse.** if there
12190 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70 72 65   has been no pre
121a0 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 49  vious output.  I
121b0 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65 6e  f regPrev>0 then
121c0 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65   code is.** gene
121d0 72 61 74 65 64 20 74 6f 20 73 75 70 70 72 65 73  rated to suppres
121e0 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20 20 70  s duplicates.  p
121f0 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65 64 20  KeyInfo is used 
12200 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a  for comparing.**
12210 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   keys..**.** If 
12220 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20  the LIMIT found 
12230 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20  in p->iLimit is 
12240 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d  reached, jump im
12250 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20  mediately to.** 
12260 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69  iBreak..*/.stati
12270 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65 4f 75  c int generateOu
12280 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 0a  tputSubroutine(.
12290 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
122a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
122b0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
122c0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
122d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
122e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
122f0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  t */.  SelectDes
12300 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20 20 2f  t *pIn,        /
12310 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75 70 70  * Coroutine supp
12320 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  lying data */.  
12330 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
12340 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65  t,      /* Where
12350 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64 61 74   to send the dat
12360 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65  a */.  int regRe
12370 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20 20 2f  turn,          /
12380 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61 64 64  * The return add
12390 72 65 73 73 20 72 65 67 69 73 74 65 72 20 2a 2f  ress register */
123a0 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 2c 20  .  int regPrev, 
123b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
123c0 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20 72 65  evious result re
123d0 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71  gister.  No uniq
123e0 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f 0a 20  ueness if 0 */. 
123f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
12400 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  fo,      /* For 
12410 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68 20 70  comparing with p
12420 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f  revious entry */
12430 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20 20  .  int iBreak   
12440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75             /* Ju
12450 6d 70 20 68 65 72 65 20 69 66 20 77 65 20 68 69  mp here if we hi
12460 74 20 74 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29  t the LIMIT */.)
12470 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
12480 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
12490 6e 74 20 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  nt iContinue;.  
124a0 69 6e 74 20 61 64 64 72 3b 0a 0a 20 20 61 64 64  int addr;..  add
124b0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
124c0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
124d0 20 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c   iContinue = sql
124e0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
124f0 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  l(v);..  /* Supp
12500 72 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 20  ress duplicates 
12510 66 6f 72 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50  for UNION, EXCEP
12520 54 2c 20 61 6e 64 20 49 4e 54 45 52 53 45 43 54  T, and INTERSECT
12530 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67   .  */.  if( reg
12540 50 72 65 76 20 29 7b 0a 20 20 20 20 69 6e 74 20  Prev ){.    int 
12550 6a 31 2c 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d  j1, j2;.    j1 =
12560 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12570 70 31 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20  p1(v, OP_IfNot, 
12580 72 65 67 50 72 65 76 29 3b 0a 20 20 20 20 6a 32  regPrev);.    j2
12590 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
125a0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
125b0 72 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  re, pIn->iSdst, 
125c0 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e  regPrev+1, pIn->
125d0 6e 53 64 73 74 2c 0a 20 20 20 20 20 20 20 20 20  nSdst,.         
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125f0 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69       (char*)sqli
12600 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
12610 65 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49  eyInfo), P4_KEYI
12620 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  NFO);.    sqlite
12630 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
12640 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43  P_Jump, j2+2, iC
12650 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a  ontinue, j2+2);.
12660 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
12670 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
12680 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12690 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp3(v, OP_Copy
126a0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65  , pIn->iSdst, re
126b0 67 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53  gPrev+1, pIn->nS
126c0 64 73 74 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  dst-1);.    sqli
126d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
126e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
126f0 72 65 67 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20  regPrev);.  }.  
12700 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
12710 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
12720 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53  eturn 0;..  /* S
12730 75 70 70 72 65 73 73 20 74 68 65 20 66 69 72 73  uppress the firs
12740 74 20 4f 46 46 53 45 54 20 65 6e 74 72 69 65 73  t OFFSET entries
12750 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
12760 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 20 20  OFFSET clause.  
12770 2a 2f 0a 20 20 63 6f 64 65 4f 66 66 73 65 74 28  */.  codeOffset(
12780 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75 65 29  v, p, iContinue)
12790 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44 65  ;..  switch( pDe
127a0 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20 20  st->eDest ){.   
127b0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72 65   /* Store the re
127c0 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73 69  sult as data usi
127d0 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79 2e  ng a unique key.
127e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
127f0 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
12800 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
12810 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
12820 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
12830 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
12840 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
12850 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
12860 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 74  pParse);.      t
12870 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e  estcase( pDest->
12880 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65  eDest==SRT_Table
12890 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
128a0 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74  se( pDest->eDest
128b0 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
128c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
128d0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
128e0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d  MakeRecord, pIn-
128f0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
12900 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  st, r1);.      s
12910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12920 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c  (v, OP_NewRowid,
12930 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c   pDest->iSDParm,
12940 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
12950 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
12960 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65 73   OP_Insert, pDes
12970 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c 20  t->iSDParm, r1, 
12980 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r2);.      sqlit
12990 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
129a0 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
129b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
129c0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
129d0 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
129e0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
129f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
12a00 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
12a10 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
12a20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
12a30 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77  UERY.    /* If w
12a40 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61  e are creating a
12a50 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70   set for an "exp
12a60 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
12a70 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20  )" construct,.  
12a80 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
12a90 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67  should be a sing
12aa0 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73  le item on the s
12ab0 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69  tack.  Write thi
12ac0 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e  s.    ** item in
12ad0 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65  to the set table
12ae0 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61   with bogus data
12af0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
12b00 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
12b10 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20     int r1;.     
12b20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53   assert( pIn->nS
12b30 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  dst==1 );.      
12b40 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
12b50 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74   .         sqlit
12b60 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
12b70 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  y(p->pEList->a[0
12b80 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d 3e  ].pExpr, pDest->
12b90 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20 20  affSdst);.      
12ba0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
12bb0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
12bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12bd0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61  eAddOp4(v, OP_Ma
12be0 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e 69  keRecord, pIn->i
12bf0 53 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70 44  Sdst, 1, r1, &pD
12c00 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29 3b  est->affSdst,1);
12c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
12c20 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
12c30 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49  hange(pParse, pI
12c40 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20 20  n->iSdst, 1);.  
12c50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12c60 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
12c70 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53  nsert, pDest->iS
12c80 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20  DParm, r1);.    
12c90 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12ca0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12cb0 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
12cc0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20 20  ;.    }..#if 0  
12cd0 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73 20  /* Never occurs 
12ce0 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 71  on an ORDER BY q
12cf0 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  uery */.    /* I
12d00 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
12d10 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
12d20 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
12d30 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
12d40 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
12d50 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
12d60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12d70 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
12d80 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69 53  er, 1, pDest->iS
12d90 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  DParm);.      /*
12da0 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
12db0 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
12dc0 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
12dd0 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
12de0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
12df0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
12e00 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
12e10 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
12e20 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
12e30 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
12e40 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
12e50 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
12e60 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
12e70 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
12e80 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
12e90 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
12ea0 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
12eb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
12ec0 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20  ->nSdst==1 );.  
12ed0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
12ee0 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
12ef0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  pIn->iSdst, pDes
12f00 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b 0a  t->iSDParm, 1);.
12f10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
12f20 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a  IT clause will j
12f30 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  ump out of the l
12f40 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  oop for us */.  
12f50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
12f60 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
12f70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
12f80 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20 20  UBQUERY */..    
12f90 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 61  /* The results a
12fa0 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
12fb0 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
12fc0 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61 72  ters.    ** star
12fd0 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e 69  ting at pDest->i
12fe0 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20  Sdst.  Then the 
12ff0 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c 64  co-routine yield
13000 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
13010 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  se SRT_Coroutine
13020 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44  : {.      if( pD
13030 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29 7b  est->iSdst==0 ){
13040 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
13050 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33 47  iSdst = sqlite3G
13060 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
13070 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b  se, pIn->nSdst);
13080 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e  .        pDest->
13090 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53 64  nSdst = pIn->nSd
130a0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
130b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
130c0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70 49  eMove(pParse, pI
130d0 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d  n->iSdst, pDest-
130e0 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e 6e  >iSdst, pDest->n
130f0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
13100 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
13110 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73  , OP_Yield, pDes
13120 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20  t->iSDParm);.   
13130 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13140 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65 20  .    /* If none 
13150 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74 68  of the above, th
13160 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64 65  en the result de
13170 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20 62  stination must b
13180 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75 74  e.    ** SRT_Out
13190 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  put.  This routi
131a0 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c  ne is never call
131b0 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
131c0 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e 61  r.    ** destina
131d0 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  tion other than 
131e0 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65 64  the ones handled
131f0 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f 75   above or SRT_Ou
13200 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tput..    **.   
13210 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74 70   ** For SRT_Outp
13220 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65 20  ut, results are 
13230 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71 75  stored in a sequ
13240 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72  ence of register
13250 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65 6e  s.  .    ** Then
13260 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
13270 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65 64  w opcode is used
13280 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74 65   to cause sqlite
13290 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20 20  3_step() to.    
132a0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e 65  ** return the ne
132b0 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  xt row of result
132c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
132d0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73  ault: {.      as
132e0 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44 65  sert( pDest->eDe
132f0 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
13300 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13310 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
13320 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d 3e  ResultRow, pIn->
13330 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73  iSdst, pIn->nSds
13340 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
13350 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
13360 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
13370 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
13380 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
13390 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
133a0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74  ..  /* Jump to t
133b0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f  he end of the lo
133c0 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20  op if the LIMIT 
133d0 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a 2f  is reached..  */
133e0 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74  .  if( p->iLimit
133f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
13400 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13410 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
13420 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a  t, iBreak, -1);.
13430 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
13440 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  te the subroutin
13450 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  e return.  */.  
13460 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
13470 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
13480 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  inue);.  sqlite3
13490 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
134a0 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74 75  _Return, regRetu
134b0 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 61  rn);..  return a
134c0 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ddr;.}../*.** Al
134d0 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f 75  ternative compou
134e0 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20 67  nd select code g
134f0 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61 73  enerator for cas
13500 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a 2a  es when there.**
13510 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
13520 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 65  clause..**.** We
13530 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79 20   assume a query 
13540 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
13550 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
13560 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f 70    <selectA>  <op
13570 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63 74  erator>  <select
13580 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f 72  B>  ORDER BY <or
13590 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a 2a  derbylist>.**.**
135a0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 6f   <operator> is o
135b0 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c 2c  ne of UNION ALL,
135c0 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
135d0 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20 54  or INTERSECT.  T
135e0 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74 6f  he idea.** is to
135f0 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c 65   code both <sele
13600 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63 74  ctA> and <select
13610 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  B> with the ORDE
13620 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a 2a  R BY clause as.*
13630 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20 20  * co-routines.  
13640 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f 2d  Then run the co-
13650 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72 61  routines in para
13660 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20 74  llel and merge t
13670 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e  he results.** in
13680 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 20  to the output.  
13690 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
136a0 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e 65  he two coroutine
136b0 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63 74  s (called select
136c0 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74 42  A and.** selectB
136d0 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73 75  ) there are 7 su
136e0 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a 2a  broutines:.**.**
136f0 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f 76      outA:    Mov
13700 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20  e the output of 
13710 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72 6f  the selectA coro
13720 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20 6f  utine into the o
13730 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  utput.**        
13740 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d 70       of the comp
13750 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a 2a  ound query..**.*
13760 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d 6f  *    outB:    Mo
13770 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
13780 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f 72   the selectB cor
13790 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
137a0 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
137b0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
137c0 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28 4f  pound query.  (O
137d0 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66 6f  nly generated fo
137e0 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20 20  r UNION and.**  
137f0 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e             UNION
13800 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61 6e   ALL.  EXCEPT an
13810 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65 76  d INSERTSECT nev
13820 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77 20  er output a row 
13830 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
13840 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c 79      appears only
13850 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20 20   in B.).**.**   
13860 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65 64   AltB:    Called
13870 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
13880 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
13890 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c 42  routines and A<B
138a0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42 3a  ..**.**    AeqB:
138b0 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20      Called when 
138c0 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72  there is data fr
138d0 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e  om both coroutin
138e0 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a 0a  es and A==B..**.
138f0 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20 43  **    AgtB:    C
13900 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
13910 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f   is data from bo
13920 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  th coroutines an
13930 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  d A>B..**.**    
13940 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64 20  EofA:    Called 
13950 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68  when data is exh
13960 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65  austed from sele
13970 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45 6f  ctA..**.**    Eo
13980 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68  fB:    Called wh
13990 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61 75  en data is exhau
139a0 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63 74  sted from select
139b0 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  B..**.** The imp
139c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
139d0 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20 73  he latter five s
139e0 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65 6e  ubroutines depen
139f0 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20 3c  d on which .** <
13a00 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73 65  operator> is use
13a10 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d:.**.**.**     
13a20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c          UNION AL
13a30 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20  L         UNION 
13a40 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45 50             EXCEP
13a50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45 52  T          INTER
13a60 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 20  SECT.**         
13a70 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20   -------------  
13a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a90 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
13aa0 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -  -------------
13ab0 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a 20  ----.**   AltB: 
13ac0 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
13ad0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
13ae0 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41       outA, nextA
13af0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a 2a           nextA.*
13b00 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20 6f  *.**   AeqB:   o
13b10 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
13b20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20     nextA        
13b30 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20       nextA      
13b40 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a 2a     outA, nextA.*
13b50 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20 6f  *.**   AgtB:   o
13b60 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20  utB, nextB      
13b70 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
13b80 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20 20       nextB      
13b90 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a 2a        nextB.**.*
13ba0 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74 42  *   EofA:   outB
13bb0 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75 74  , nextB      out
13bc0 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20 20  B, nextB        
13bd0 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20 20    halt          
13be0 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20 20     halt.**.**   
13bf0 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  EofB:   outA, ne
13c00 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
13c10 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
13c20 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 68   nextA         h
13c30 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  alt.**.** In the
13c40 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e 64   AltB, AeqB, and
13c50 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e 65   AgtB subroutine
13c60 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20 66  s, an EOF on A f
13c70 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a 2a  ollowing nextA.*
13c80 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d 65  * causes an imme
13c90 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f  diate jump to Eo
13ca0 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f 6e  fA and an EOF on
13cb0 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   B following nex
13cc0 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e 20  tB causes.** an 
13cd0 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
13ce0 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e 20  o EofB.  Within 
13cf0 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20 61  EofA and EofB, a
13d00 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79 20  nd EOF on entry 
13d10 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  or.** following 
13d20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20 6a  nextX causes a j
13d30 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
13d40 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72 6f  f the select pro
13d50 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 44  cessing..**.** D
13d60 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61 6c  uplicate removal
13d70 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20 45   in the UNION, E
13d80 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45 52  XCEPT, and INTER
13d90 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68 61  SECT cases is ha
13da0 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e 20  ndled.** within 
13db0 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
13dc0 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67 50  utine.  The regP
13dd0 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65 74  rev register set
13de0 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76 69   holds the previ
13df0 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74 20  ously.** output 
13e00 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61 72  value.  A compar
13e10 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67 61  ison is made aga
13e20 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65 20  inst this value 
13e30 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
13e40 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66 20  * is skipped if 
13e50 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74 73  the next results
13e60 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73 61   would be the sa
13e70 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  me as the previo
13e80 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  us..**.** The im
13e90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c 61  plementation pla
13ea0 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  n is to implemen
13eb0 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74  t the two corout
13ec0 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a 2a  ines and seven.*
13ed0 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66 69  * subroutines fi
13ee0 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74 68  rst, then put th
13ef0 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63 20  e control logic 
13f00 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20 20  at the bottom.  
13f10 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  Like this:.**.**
13f20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 49            goto I
13f30 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a 20  nit.**     coA: 
13f40 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c 65  coroutine for le
13f50 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a 20  ft query (A).** 
13f60 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74 69      coB: corouti
13f70 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75 65  ne for right que
13f80 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75 74  ry (B).**    out
13f90 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  A: output one ro
13fa0 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75 74  w of A.**    out
13fb0 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f  B: output one ro
13fc0 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61 6e  w of B (UNION an
13fd0 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c 79  d UNION ALL only
13fe0 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e 2e  ).**    EofA: ..
13ff0 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e 2e  ..**    EofB: ..
14000 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e 2e  ..**    AltB: ..
14010 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e 2e  ..**    AeqB: ..
14020 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e 2e  ..**    AgtB: ..
14030 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69 6e  ..**    Init: in
14040 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74 69  itialize corouti
14050 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  ne registers.** 
14060 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63           yield c
14070 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  oA.**          i
14080 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45 6f  f eof(A) goto Eo
14090 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  fA.**          y
140a0 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20 20  ield coB.**     
140b0 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20 67       if eof(B) g
140c0 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20 43  oto EofB.**    C
140d0 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c 20  mpr: Compare A, 
140e0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a 75  B.**          Ju
140f0 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  mp AltB, AeqB, A
14100 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a 20  gtB.**     End: 
14110 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6c  ....**.** We cal
14120 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41 67  l AltB, AeqB, Ag
14130 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45 6f  tB, EofA, and Eo
14140 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73 22  fB "subroutines"
14150 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e 6f   but they are no
14160 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63 61  t.** actually ca
14170 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75 62  lled using Gosub
14180 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f 74   and they do not
14190 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20 61   Return.  EofA a
141a0 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a 20  nd EofB loop.** 
141b0 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20 69  until all data i
141c0 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65 6e  s exhausted then
141d0 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65 6e   jump to the "en
141e0 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c 20  d" labe.  AltB, 
141f0 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67 74  AeqB,.** and Agt
14200 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65 72  B jump to either
14210 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f 66   L2 or to one of
14220 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a 2a   EofA or EofB..*
14230 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
14240 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
14250 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e 74  ELECT.static int
14260 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
14270 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  rBy(.  Parse *pP
14280 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
14290 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
142a0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
142b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
142c0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20  e right-most of 
142d0 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f  SELECTs to be co
142e0 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ded */.  SelectD
142f0 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f  est *pDest     /
14300 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
14310 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20  h query results 
14320 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
14330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14340 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
14350 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
14360 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
14370 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
14380 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
14390 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
143a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
143b0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
143c0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
143d0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
143e0 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tA;     /* Desti
143f0 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
14400 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c 65  tine A */.  Sele
14410 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20 20  ctDest destB;   
14420 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e    /* Destination
14430 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 42   for coroutine B
14440 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64   */.  int regAdd
14450 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  rA;         /* A
14460 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
14470 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f 72  for select-A cor
14480 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
14490 72 65 67 45 6f 66 41 3b 20 20 20 20 20 20 20 20  regEofA;        
144a0 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64    /* Flag to ind
144b0 69 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63  icate when selec
144c0 74 2d 41 20 69 73 20 63 6f 6d 70 6c 65 74 65 20  t-A is complete 
144d0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64 64 72  */.  int regAddr
144e0 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  B;         /* Ad
144f0 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66  dress register f
14500 6f 72 20 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f  or select-B coro
14510 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
14520 65 67 45 6f 66 42 3b 20 20 20 20 20 20 20 20 20  egEofB;         
14530 20 2f 2a 20 46 6c 61 67 20 74 6f 20 69 6e 64 69   /* Flag to indi
14540 63 61 74 65 20 77 68 65 6e 20 73 65 6c 65 63 74  cate when select
14550 2d 42 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a  -B is complete *
14560 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
14570 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctA;      /* Add
14580 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
14590 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-A coroutine *
145a0 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65  /.  int addrSele
145b0 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ctB;      /* Add
145c0 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ress of the sele
145d0 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
145e0 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b  /.  int regOutA;
145f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
14600 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
14610 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  r the output-A s
14620 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
14630 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20  nt regOutB;     
14640 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
14650 72 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65  register for the
14660 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75   output-B subrou
14670 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
14680 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20  drOutA;         
14690 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
146a0 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f  e output-A subro
146b0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
146c0 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20  ddrOutB = 0;    
146d0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
146e0 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
146f0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
14700 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20  addrEofA;       
14710 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
14720 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68  the select-A-exh
14730 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e  austed subroutin
14740 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  e */.  int addrE
14750 6f 66 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ofB;         /* 
14760 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73  Address of the s
14770 65 6c 65 63 74 2d 42 2d 65 78 68 61 75 73 74 65  elect-B-exhauste
14780 64 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  d subroutine */.
14790 20 20 69 6e 74 20 61 64 64 72 41 6c 74 42 3b 20    int addrAltB; 
147a0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
147b0 73 73 20 6f 66 20 74 68 65 20 41 3c 42 20 73 75  ss of the A<B su
147c0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
147d0 74 20 61 64 64 72 41 65 71 42 3b 20 20 20 20 20  t addrAeqB;     
147e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
147f0 66 20 74 68 65 20 41 3d 3d 42 20 73 75 62 72 6f  f the A==B subro
14800 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
14810 64 64 72 41 67 74 42 3b 20 20 20 20 20 20 20 20  ddrAgtB;        
14820 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
14830 68 65 20 41 3e 42 20 73 75 62 72 6f 75 74 69 6e  he A>B subroutin
14840 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  e */.  int regLi
14850 6d 69 74 41 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitA;        /* 
14860 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
14870 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
14880 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 42 3b 20   int regLimitB; 
14890 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20         /* Limit 
148a0 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
148b0 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72  ect-A */.  int r
148c0 65 67 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  egPrev;         
148d0 20 2f 2a 20 41 20 72 61 6e 67 65 20 6f 66 20 72   /* A range of r
148e0 65 67 69 73 74 65 72 73 20 74 6f 20 68 6f 6c 64  egisters to hold
148f0 20 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74   previous output
14900 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4c   */.  int savedL
14910 69 6d 69 74 3b 20 20 20 20 20 20 20 2f 2a 20 53  imit;       /* S
14920 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
14930 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  >iLimit */.  int
14940 20 73 61 76 65 64 4f 66 66 73 65 74 3b 20 20 20   savedOffset;   
14950 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
14960 65 20 6f 66 20 70 2d 3e 69 4f 66 66 73 65 74 20  e of p->iOffset 
14970 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 43 6d  */.  int labelCm
14980 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 61  pr;        /* La
14990 62 65 6c 20 66 6f 72 20 74 68 65 20 73 74 61 72  bel for the star
149a0 74 20 6f 66 20 74 68 65 20 6d 65 72 67 65 20 61  t of the merge a
149b0 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 69 6e  lgorithm */.  in
149c0 74 20 6c 61 62 65 6c 45 6e 64 3b 20 20 20 20 20  t labelEnd;     
149d0 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
149e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
149f0 6f 76 65 72 61 6c 6c 20 53 45 4c 45 43 54 20 73  overall SELECT s
14a00 74 6d 74 20 2a 2f 0a 20 20 69 6e 74 20 6a 31 3b  tmt */.  int j1;
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14a20 2a 20 4a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  * Jump instructi
14a30 6f 6e 73 20 74 68 61 74 20 67 65 74 20 72 65 74  ons that get ret
14a40 61 72 67 65 74 74 65 64 20 2a 2f 0a 20 20 69 6e  argetted */.  in
14a50 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20  t op;           
14a60 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
14a70 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49 4f 4e 2c 20  _ALL, TK_UNION, 
14a80 54 4b 5f 45 58 43 45 50 54 2c 20 54 4b 5f 49 4e  TK_EXCEPT, TK_IN
14a90 54 45 52 53 45 43 54 20 2a 2f 0a 20 20 4b 65 79  TERSECT */.  Key
14aa0 49 6e 66 6f 20 2a 70 4b 65 79 44 75 70 20 3d 20  Info *pKeyDup = 
14ab0 30 3b 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e  0; /* Comparison
14ac0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
14ad0 20 64 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76   duplicate remov
14ae0 61 6c 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  al */.  KeyInfo 
14af0 2a 70 4b 65 79 4d 65 72 67 65 3b 20 20 20 2f 2a  *pKeyMerge;   /*
14b00 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
14b10 72 6d 61 74 69 6f 6e 20 66 6f 72 20 6d 65 72 67  rmation for merg
14b20 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 73 71  ing rows */.  sq
14b30 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
14b40 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
14b50 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
14b60 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
14b70 42 79 3b 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By;   /* The ORD
14b80 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
14b90 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 20    int nOrderBy; 
14ba0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14bb0 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
14bc0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
14bd0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65 72  e */.  int *aPer
14be0 6d 75 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  mute;        /* 
14bf0 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 4f 52 44  Mapping from ORD
14c00 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f 20 72  ER BY terms to r
14c10 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
14c20 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  s */.#ifndef SQL
14c30 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
14c40 0a 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20  .  int iSub1;   
14c50 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20           /* EQP 
14c60 69 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  id of left-hand 
14c70 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  query */.  int i
14c80 53 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20  Sub2;           
14c90 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69   /* EQP id of ri
14ca0 67 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  ght-hand query *
14cb0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
14cc0 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 21  rt( p->pOrderBy!
14cd0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
14ce0 70 4b 65 79 44 75 70 3d 3d 30 20 29 3b 20 2f 2a  pKeyDup==0 ); /*
14cf0 20 22 4d 61 6e 61 67 65 64 22 20 63 6f 64 65 20   "Managed" code 
14d00 6e 65 65 64 73 20 74 68 69 73 2e 20 20 54 69 63  needs this.  Tic
14d10 6b 65 74 20 23 33 33 38 32 2e 20 2a 2f 0a 20 20  ket #3382. */.  
14d20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
14d30 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
14d40 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
14d50 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  v!=0 );       /*
14d60 20 41 6c 72 65 61 64 79 20 74 68 72 6f 77 6e 20   Already thrown 
14d70 74 68 65 20 65 72 72 6f 72 20 69 66 20 56 44 42  the error if VDB
14d80 45 20 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a  E alloc failed *
14d90 2f 0a 20 20 6c 61 62 65 6c 45 6e 64 20 3d 20 73  /.  labelEnd = s
14da0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
14db0 62 65 6c 28 76 29 3b 0a 20 20 6c 61 62 65 6c 43  bel(v);.  labelC
14dc0 6d 70 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  mpr = sqlite3Vdb
14dd0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
14de0 0a 20 20 2f 2a 20 50 61 74 63 68 20 75 70 20 74  .  /* Patch up t
14df0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
14e00 73 65 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 70  se.  */.  op = p
14e10 2d 3e 6f 70 3b 20 20 0a 20 20 70 50 72 69 6f 72  ->op;  .  pPrior
14e20 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
14e30 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 2d 3e  assert( pPrior->
14e40 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20  pOrderBy==0 );. 
14e50 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
14e60 4f 72 64 65 72 42 79 3b 0a 20 20 61 73 73 65 72  OrderBy;.  asser
14e70 74 28 20 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  t( pOrderBy );. 
14e80 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
14e90 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20  erBy->nExpr;..  
14ea0 2f 2a 20 46 6f 72 20 6f 70 65 72 61 74 6f 72 73  /* For operators
14eb0 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f   other than UNIO
14ec0 4e 20 41 4c 4c 20 77 65 20 68 61 76 65 20 74 6f  N ALL we have to
14ed0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a   make sure that.
14ee0 20 20 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42    ** the ORDER B
14ef0 59 20 63 6c 61 75 73 65 20 63 6f 76 65 72 73 20  Y clause covers 
14f00 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
14f10 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 41  e result set.  A
14f20 64 64 0a 20 20 2a 2a 20 74 65 72 6d 73 20 74 6f  dd.  ** terms to
14f30 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
14f40 61 75 73 65 20 61 73 20 6e 65 63 65 73 73 61 72  ause as necessar
14f50 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  y..  */.  if( op
14f60 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  !=TK_ALL ){.    
14f70 66 6f 72 28 69 3d 31 3b 20 64 62 2d 3e 6d 61 6c  for(i=1; db->mal
14f80 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
14f90 69 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  i<=p->pEList->nE
14fa0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
14fb0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
14fc0 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
14fd0 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
14fe0 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
14ff0 6a 3c 6e 4f 72 64 65 72 42 79 3b 20 6a 2b 2b 2c  j<nOrderBy; j++,
15000 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
15010 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
15020 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
15030 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
15040 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
15050 72 64 65 72 42 79 43 6f 6c 3d 3d 69 20 29 20 62  rderByCol==i ) b
15060 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15070 20 20 20 20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65      if( j==nOrde
15080 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 45  rBy ){.        E
15090 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
150a0 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
150b0 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
150c0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
150d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
150e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70  NOMEM;.        p
150f0 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
15100 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
15110 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
15120 65 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70  e = i;.        p
15130 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
15140 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
15150 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
15160 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  , pNew);.       
15170 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 20   if( pOrderBy ) 
15180 70 4f 72 64 65 72 42 79 2d 3e 61 5b 6e 4f 72 64  pOrderBy->a[nOrd
15190 65 72 42 79 2b 2b 5d 2e 75 2e 78 2e 69 4f 72 64  erBy++].u.x.iOrd
151a0 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69  erByCol = (u16)i
151b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
151c0 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
151d0 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
151e0 20 70 65 72 6d 75 74 61 74 69 6f 6e 20 61 6e 64   permutation and
151f0 20 6b 65 79 69 6e 66 6f 20 74 68 61 74 20 69 73   keyinfo that is
15200 20 75 73 65 64 20 77 69 74 68 0a 20 20 2a 2a 20   used with.  ** 
15210 74 68 65 20 70 65 72 6d 75 74 61 74 69 6f 6e 20  the permutation 
15220 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
15230 65 20 69 66 20 74 68 65 20 6e 65 78 74 0a 20 20  e if the next.  
15240 2a 2a 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74  ** row of result
15250 73 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 65 6c  s comes from sel
15260 65 63 74 41 20 6f 72 20 73 65 6c 65 63 74 42 2e  ectA or selectB.
15270 20 20 41 6c 73 6f 20 61 64 64 20 65 78 70 6c 69    Also add expli
15280 63 69 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  cit.  ** collati
15290 6f 6e 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ons to the ORDER
152a0 20 42 59 20 63 6c 61 75 73 65 20 74 65 72 6d 73   BY clause terms
152b0 20 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68   so that when th
152c0 65 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 2a  e subqueries.  *
152d0 2a 20 74 6f 20 74 68 65 20 72 69 67 68 74 20 61  * to the right a
152e0 6e 64 20 74 68 65 20 6c 65 66 74 20 61 72 65 20  nd the left are 
152f0 65 76 61 6c 75 61 74 65 64 2c 20 74 68 65 79 20  evaluated, they 
15300 75 73 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  use the correct.
15310 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a    ** collation..
15320 20 20 2a 2f 0a 20 20 61 50 65 72 6d 75 74 65 20    */.  aPermute 
15330 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
15340 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28  cRaw(db, sizeof(
15350 69 6e 74 29 2a 6e 4f 72 64 65 72 42 79 29 3b 0a  int)*nOrderBy);.
15360 20 20 69 66 28 20 61 50 65 72 6d 75 74 65 20 29    if( aPermute )
15370 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
15380 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
15390 6d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  m;.    for(i=0, 
153a0 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
153b0 61 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  a; i<nOrderBy; i
153c0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
153d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
153e0 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
153f0 6f 6c 3e 30 0a 20 20 20 20 20 20 20 20 20 20 26  ol>0.          &
15400 26 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  & pItem->u.x.iOr
15410 64 65 72 42 79 43 6f 6c 3c 3d 70 2d 3e 70 45 4c  derByCol<=p->pEL
15420 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20  ist->nExpr );.  
15430 20 20 20 20 61 50 65 72 6d 75 74 65 5b 69 5d 20      aPermute[i] 
15440 3d 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  = pItem->u.x.iOr
15450 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b 0a 20 20  derByCol - 1;.  
15460 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d 65 72 67    }.    pKeyMerg
15470 65 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  e = sqlite3KeyIn
15480 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64  foAlloc(db, nOrd
15490 65 72 42 79 2c 20 31 29 3b 0a 20 20 20 20 69 66  erBy, 1);.    if
154a0 28 20 70 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20  ( pKeyMerge ){. 
154b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
154c0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
154d0 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
154e0 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  *pColl;.        
154f0 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70 4f  Expr *pTerm = pO
15500 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
15510 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  pr;.        if( 
15520 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45  pTerm->flags & E
15530 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20  P_Collate ){.   
15540 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
15550 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
15560 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 29  q(pParse, pTerm)
15570 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
15580 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
15590 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
155a0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
155b0 20 61 50 65 72 6d 75 74 65 5b 69 5d 29 3b 0a 20   aPermute[i]);. 
155c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f           if( pCo
155d0 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20  ll==0 ) pColl = 
155e0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
155f0 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42           pOrderB
15600 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 0a  y->a[i].pExpr =.
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15620 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
15630 74 65 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c  teString(pParse,
15640 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a   pTerm, pColl->z
15650 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Name);.        }
15660 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15670 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
15680 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 4d  sWriteable(pKeyM
15690 65 72 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  erge) );.       
156a0 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c   pKeyMerge->aCol
156b0 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20  l[i] = pColl;.  
156c0 20 20 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d        pKeyMerge-
156d0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
156e0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
156f0 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
15700 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
15710 7b 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20  {.    pKeyMerge 
15720 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
15730 65 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45  eattach the ORDE
15740 52 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74  R BY clause to t
15750 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  he query..  */. 
15760 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70   p->pOrderBy = p
15770 4f 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f  OrderBy;.  pPrio
15780 72 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71  r->pOrderBy = sq
15790 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
157a0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72  (pParse->db, pOr
157b0 64 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a  derBy, 0);..  /*
157c0 20 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67   Allocate a rang
157d0 65 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72  e of temporary r
157e0 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
157f0 20 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a   KeyInfo needed.
15800 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67    ** for the log
15810 69 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20  ic that removes 
15820 64 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74  duplicate result
15830 20 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20   rows when the. 
15840 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20   ** operator is 
15850 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f  UNION, EXCEPT, o
15860 72 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74  r INTERSECT (but
15870 20 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e   not UNION ALL).
15880 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d  .  */.  if( op==
15890 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
158a0 67 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c  gPrev = 0;.  }el
158b0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70  se{.    int nExp
158c0 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r = p->pEList->n
158d0 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
158e0 28 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70  ( nOrderBy>=nExp
158f0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
15900 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67  ailed );.    reg
15910 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
15920 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
15930 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72  e->nMem += nExpr
15940 2b 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +1;.    sqlite3V
15950 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15960 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50  Integer, 0, regP
15970 72 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75  rev);.    pKeyDu
15980 70 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  p = sqlite3KeyIn
15990 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70  foAlloc(db, nExp
159a0 72 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 1);.    if( p
159b0 4b 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20  KeyDup ){.      
159c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
159d0 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
159e0 65 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20  e(pKeyDup) );.  
159f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
15a00 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
15a10 20 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f      pKeyDup->aCo
15a20 6c 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c  ll[i] = multiSel
15a30 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ectCollSeq(pPars
15a40 65 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20  e, p, i);.      
15a50 20 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74    pKeyDup->aSort
15a60 4f 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  Order[i] = 0;.  
15a70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15a80 20 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20   .  /* Separate 
15a90 74 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65  the left and the
15aa0 20 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f   right query fro
15ab0 6d 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20  m one another.  
15ac0 2a 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  */.  p->pPrior =
15ad0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73   0;.  sqlite3Res
15ae0 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
15af0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
15b00 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
15b10 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  );.  if( pPrior-
15b20 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20  >pPrior==0 ){.  
15b30 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
15b40 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
15b50 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72  rse, pPrior, pPr
15b60 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  ior->pOrderBy, "
15b70 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20  ORDER");.  }..  
15b80 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
15b90 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a  imit registers *
15ba0 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  /.  computeLimit
15bb0 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
15bc0 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  , p, labelEnd);.
15bd0 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20    if( p->iLimit 
15be0 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  && op==TK_ALL ){
15bf0 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d  .    regLimitA =
15c00 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15c10 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d  .    regLimitB =
15c20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15c30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15c40 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
15c50 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20  y, p->iOffset ? 
15c60 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70  p->iOffset+1 : p
15c70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20  ->iLimit,.      
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c              regL
15ca0 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  imitA);.    sqli
15cb0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15cc0 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d   OP_Copy, regLim
15cd0 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b  itA, regLimitB);
15ce0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
15cf0 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d  gLimitA = regLim
15d00 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  itB = 0;.  }.  s
15d10 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
15d20 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
15d30 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  .  p->pLimit = 0
15d40 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
15d50 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
15d60 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66  fset);.  p->pOff
15d70 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41  set = 0;..  regA
15d80 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  ddrA = ++pParse-
15d90 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 41  >nMem;.  regEofA
15da0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
15db0 6d 3b 0a 20 20 72 65 67 41 64 64 72 42 20 3d 20  m;.  regAddrB = 
15dc0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
15dd0 20 20 72 65 67 45 6f 66 42 20 3d 20 2b 2b 70 50    regEofB = ++pP
15de0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
15df0 67 4f 75 74 41 20 3d 20 2b 2b 70 50 61 72 73 65  gOutA = ++pParse
15e00 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
15e10 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  B = ++pParse->nM
15e20 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  em;.  sqlite3Sel
15e30 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
15e40 74 41 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tA, SRT_Coroutin
15e50 65 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20 20  e, regAddrA);.  
15e60 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
15e70 74 49 6e 69 74 28 26 64 65 73 74 42 2c 20 53 52  tInit(&destB, SR
15e80 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
15e90 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 4a 75  AddrB);..  /* Ju
15ea0 6d 70 20 70 61 73 74 20 74 68 65 20 76 61 72 69  mp past the vari
15eb0 6f 75 73 20 73 75 62 72 6f 75 74 69 6e 65 73 20  ous subroutines 
15ec0 61 6e 64 20 63 6f 72 6f 75 74 69 6e 65 73 20 74  and coroutines t
15ed0 6f 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a 20  o the main.  ** 
15ee0 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  merge loop.  */.
15ef0 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
15f00 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
15f10 6f 74 6f 29 3b 0a 20 20 61 64 64 72 53 65 6c 65  oto);.  addrSele
15f20 63 74 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ctA = sqlite3Vdb
15f30 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15f40 0a 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ...  /* Generate
15f50 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
15f60 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
15f70 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
15f80 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f   the.  ** left o
15f90 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f  f the compound o
15fa0 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41  perator - the "A
15fb0 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  " select..  */. 
15fc0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
15fd0 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f  ((v, "Begin coro
15fe0 75 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53  utine for left S
15ff0 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69  ELECT"));.  pPri
16000 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67  or->iLimit = reg
16010 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69  LimitA;.  explai
16020 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
16030 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
16040 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c  SelectId);.  sql
16050 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
16060 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
16070 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
16080 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
16090 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f 66  teger, 1, regEof
160a0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
160b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
160c0 65 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a  eld, regAddrA);.
160d0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
160e0 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f 75  t((v, "End corou
160f0 74 69 6e 65 20 66 6f 72 20 6c 65 66 74 20 53 45  tine for left SE
16100 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a 20 47  LECT"));..  /* G
16110 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74  enerate a corout
16120 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ine to evaluate 
16130 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
16140 6d 65 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68  ment on .  ** th
16150 65 20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42  e right - the "B
16160 22 20 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20  " select.  */.  
16170 61 64 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71  addrSelectB = sq
16180 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16190 41 64 64 72 28 76 29 3b 0a 20 20 56 64 62 65 4e  Addr(v);.  VdbeN
161a0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
161b0 42 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20  Begin coroutine 
161c0 66 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54  for right SELECT
161d0 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69  "));.  savedLimi
161e0 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
161f0 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70   savedOffset = p
16200 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e  ->iOffset;.  p->
16210 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69  iLimit = regLimi
16220 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74  tB;.  p->iOffset
16230 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69   = 0;  .  explai
16240 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
16250 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
16260 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c  SelectId);.  sql
16270 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
16280 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20  e, p, &destB);. 
16290 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76   p->iLimit = sav
162a0 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f  edLimit;.  p->iO
162b0 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66  ffset = savedOff
162c0 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  set;.  sqlite3Vd
162d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
162e0 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67 45 6f  nteger, 1, regEo
162f0 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fB);.  sqlite3Vd
16300 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59  beAddOp1(v, OP_Y
16310 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b  ield, regAddrB);
16320 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
16330 6e 74 28 28 76 2c 20 22 45 6e 64 20 63 6f 72 6f  nt((v, "End coro
16340 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
16350 53 45 4c 45 43 54 22 29 29 3b 0a 0a 20 20 2f 2a  SELECT"));..  /*
16360 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
16370 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
16380 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
16390 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
163a0 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
163b0 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
163c0 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
163d0 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
163e0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
163f0 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
16400 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
16410 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
16420 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
16430 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
16440 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
16450 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
16460 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
16470 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
16480 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
16490 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
164a0 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
164b0 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
164c0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
164d0 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
164e0 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
164f0 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
16500 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
16510 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
16520 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
16530 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
16540 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
16550 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
16560 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
16570 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
16580 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
16590 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165b0 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
165c0 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
165d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
165e0 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
165f0 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  belEnd);.  }.  s
16600 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
16610 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20  ef(pKeyDup);..  
16620 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
16630 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
16640 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
16650 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
16660 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
16670 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
16680 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
16690 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65  ins..  */.  Vdbe
166a0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
166b0 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
166c0 65 22 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  e"));.  if( op==
166d0 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
166e0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
166f0 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
16700 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16710 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
16720 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65   labelEnd);.  }e
16730 6c 73 65 7b 20 20 0a 20 20 20 20 61 64 64 72 45  lse{  .    addrE
16740 6f 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ofA = sqlite3Vdb
16750 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66  eAddOp2(v, OP_If
16760 2c 20 72 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c  , regEofB, label
16770 45 6e 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  End);.    sqlite
16780 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16790 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42  P_Gosub, regOutB
167a0 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 20  , addrOutB);.   
167b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
167c0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
167d0 72 65 67 41 64 64 72 42 29 3b 0a 20 20 20 20 73  regAddrB);.    s
167e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
167f0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
16800 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70  addrEofA);.    p
16810 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
16820 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
16830 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  ow;.  }..  /* Ge
16840 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
16850 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
16860 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
16870 20 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61   select B.  ** a
16880 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
16890 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
168a0 6c 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a  lect A remains..
168b0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
168c0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20  K_INTERSECT ){. 
168d0 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64     addrEofB = ad
168e0 64 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20  drEofA;.    if( 
168f0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20  p->nSelectRow > 
16900 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
16910 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52  ow ) p->nSelectR
16920 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  ow = pPrior->nSe
16930 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65  lectRow;.  }else
16940 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70  {  .    VdbeNoop
16950 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66  Comment((v, "eof
16960 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
16970 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d  ;.    addrEofB =
16980 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16990 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
169a0 45 6f 66 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b  EofA, labelEnd);
169b0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
169c0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
169d0 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
169e0 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
169f0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16a00 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
16a10 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drA);.    sqlite
16a20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16a30 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45  P_Goto, 0, addrE
16a40 6f 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ofB);.  }..  /* 
16a50 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16a60 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65   handle the case
16a70 20 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56   of A<B.  */.  V
16a80 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
16a90 76 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f  v, "A-lt-B subro
16aa0 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72  utine"));.  addr
16ab0 41 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  AltB = sqlite3Vd
16ac0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
16ad0 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61  osub, regOutA, a
16ae0 64 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69  ddrOutA);.  sqli
16af0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16b00 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
16b10 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  drA);.  sqlite3V
16b20 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16b30 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64  If, regEofA, add
16b40 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65  rEofA);.  sqlite
16b50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16b60 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c  P_Goto, 0, label
16b70 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Cmpr);..  /* Gen
16b80 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
16b90 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
16ba0 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28   A==B.  */.  if(
16bb0 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20   op==TK_ALL ){. 
16bc0 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61 64     addrAeqB = ad
16bd0 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20  drAltB;.  }else 
16be0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
16bf0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
16c00 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
16c10 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b  .    addrAltB++;
16c20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64  .  }else{.    Vd
16c30 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
16c40 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72 6f 75  , "A-eq-B subrou
16c50 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64 64  tine"));.    add
16c60 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71 6c 69  rAeqB =.    sqli
16c70 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16c80 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
16c90 64 72 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  drA);.    sqlite
16ca0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16cb0 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 61  P_If, regEofA, a
16cc0 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 73 71  ddrEofA);.    sq
16cd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16ce0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
16cf0 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a  abelCmpr);.  }..
16d00 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
16d10 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
16d20 20 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a   case of A>B.  *
16d30 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
16d40 65 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20  ent((v, "A-gt-B 
16d50 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
16d60 20 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69   addrAgtB = sqli
16d70 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
16d80 64 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d  dr(v);.  if( op=
16d90 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
16da0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73  K_UNION ){.    s
16db0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16dc0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65  (v, OP_Gosub, re
16dd0 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29  gOutB, addrOutB)
16de0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
16df0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16e00 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 29  Yield, regAddrB)
16e10 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16e20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp2(v, OP_If, 
16e30 72 65 67 45 6f 66 42 2c 20 61 64 64 72 45 6f 66  regEofB, addrEof
16e40 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
16e50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
16e60 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
16e70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
16e80 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  de runs once to 
16e90 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79  initialize every
16ea0 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71  thing..  */.  sq
16eb0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
16ec0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69  e(v, j1);.  sqli
16ed0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16ee0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
16ef0 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  regEofA);.  sqli
16f00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16f10 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
16f20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69  regEofB);.  sqli
16f30 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16f40 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 41 64   OP_Gosub, regAd
16f50 64 72 41 2c 20 61 64 64 72 53 65 6c 65 63 74 41  drA, addrSelectA
16f60 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16f70 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
16f80 75 62 2c 20 72 65 67 41 64 64 72 42 2c 20 61 64  ub, regAddrB, ad
16f90 64 72 53 65 6c 65 63 74 42 29 3b 0a 20 20 73 71  drSelectB);.  sq
16fa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16fb0 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
16fc0 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20  A, addrEofA);.  
16fd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16fe0 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45  2(v, OP_If, regE
16ff0 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  ofB, addrEofB);.
17000 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  .  /* Implement 
17010 74 68 65 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c  the main merge l
17020 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  oop.  */.  sqlit
17030 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
17040 65 6c 28 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29  el(v, labelCmpr)
17050 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
17060 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d  ddOp4(v, OP_Perm
17070 75 74 61 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30  utation, 0, 0, 0
17080 2c 20 28 63 68 61 72 2a 29 61 50 65 72 6d 75 74  , (char*)aPermut
17090 65 2c 20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b  e, P4_INTARRAY);
170a0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
170b0 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61  dOp4(v, OP_Compa
170c0 72 65 2c 20 64 65 73 74 41 2e 69 53 64 73 74 2c  re, destA.iSdst,
170d0 20 64 65 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f   destB.iSdst, nO
170e0 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17100 20 28 63 68 61 72 2a 29 70 4b 65 79 4d 65 72 67   (char*)pKeyMerg
17110 65 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  e, P4_KEYINFO);.
17120 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
17130 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
17140 50 45 52 4d 55 54 45 29 3b 0a 20 20 73 71 6c 69  PERMUTE);.  sqli
17150 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
17160 20 4f 50 5f 4a 75 6d 70 2c 20 61 64 64 72 41 6c   OP_Jump, addrAl
17170 74 42 2c 20 61 64 64 72 41 65 71 42 2c 20 61 64  tB, addrAeqB, ad
17180 64 72 41 67 74 42 29 3b 0a 0a 20 20 2f 2a 20 4a  drAgtB);..  /* J
17190 75 6d 70 20 74 6f 20 74 68 65 20 74 68 69 73 20  ump to the this 
171a0 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
171b0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
171c0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  query..  */.  sq
171d0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
171e0 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 45 6e  Label(v, labelEn
171f0 64 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  d);..  /* Set th
17200 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
17210 75 74 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ut columns.  */.
17220 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
17230 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
17240 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46  {.    Select *pF
17250 69 72 73 74 20 3d 20 70 50 72 69 6f 72 3b 0a 20  irst = pPrior;. 
17260 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74     while( pFirst
17270 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73  ->pPrior ) pFirs
17280 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69  t = pFirst->pPri
17290 6f 72 3b 0a 20 20 20 20 67 65 6e 65 72 61 74 65  or;.    generate
172a0 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72  ColumnNames(pPar
172b0 73 65 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70  se, 0, pFirst->p
172c0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f  EList);.  }..  /
172d0 2a 20 52 65 61 73 73 65 6d 62 6c 79 20 74 68 65  * Reassembly the
172e0 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20   compound query 
172f0 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
17300 62 65 20 66 72 65 65 64 20 63 6f 72 72 65 63 74  be freed correct
17310 6c 79 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63  ly.  ** by the c
17320 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
17330 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
17340 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  or ){.    sqlite
17350 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
17360 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
17370 7d 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  }.  p->pPrior = 
17380 70 50 72 69 6f 72 3b 0a 0a 20 20 2f 2a 2a 2a 20  pPrior;..  /*** 
17390 54 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62  TBD:  Insert sub
173a0 72 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f  routine calls to
173b0 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f   close cursors o
173c0 6e 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a  n incomplete.  *
173d0 2a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a  *** subqueries *
173e0 2a 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f  ***/.  explainCo
173f0 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20  mposite(pParse, 
17400 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53  p->op, iSub1, iS
17410 75 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  ub2, 0);.  retur
17420 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
17430 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
17440 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
17450 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65  SUBQUERY) || !de
17460 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
17470 54 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61  T_VIEW)./* Forwa
17480 72 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20  rd Declarations 
17490 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
174a0 75 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c  ubstExprList(sql
174b0 69 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a  ite3*, ExprList*
174c0 2c 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a  , int, ExprList*
174d0 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  );.static void s
174e0 75 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74  ubstSelect(sqlit
174f0 65 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69  e3*, Select *, i
17500 6e 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b  nt, ExprList *);
17510 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72  ../*.** Scan thr
17520 6f 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73  ough the express
17530 69 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c  ion pExpr.  Repl
17540 61 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65  ace every refere
17550 6e 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75  nce to.** a colu
17560 6d 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62  mn in table numb
17570 65 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61  er iTable with a
17580 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
17590 6c 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79  lumn-th.** entry
175a0 20 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75   in pEList.  (Bu
175b0 74 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63  t leave referenc
175c0 65 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20  es to the ROWID 
175d0 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61  column .** uncha
175e0 6e 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69  nged.).**.** Thi
175f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72  s routine is par
17600 74 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e  t of the flatten
17610 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20  ing procedure.  
17620 41 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68  A subquery.** wh
17630 6f 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  ose result set i
17640 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c  s defined by pEL
17650 69 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65  ist appears as e
17660 6e 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46  ntry in the.** F
17670 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
17680 53 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74  SELECT such that
17690 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
176a0 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61   assigned to tha
176b0 74 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65  t.** FORM clause
176c0 20 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65   entry is iTable
176d0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
176e0 6d 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61  make the necessa
176f0 72 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ry .** changes t
17700 6f 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20  o pExpr so that 
17710 69 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74  it refers direct
17720 6c 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65  ly to the source
17730 20 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65   table.** of the
17740 20 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72   subquery rather
17750 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
17760 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e  of the subquery.
17770 0a 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20  .*/.static Expr 
17780 2a 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71  *substExpr(.  sq
17790 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
177a0 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
177b0 6f 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69  oc errors to thi
177c0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  s connection */.
177d0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
177e0 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e        /* Expr in
177f0 20 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74   which substitut
17800 69 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20  ion occurs */.  
17810 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
17820 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
17830 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
17840 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
17850 4c 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74  List    /* Subst
17860 69 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e  itute expression
17870 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45  s */.){.  if( pE
17880 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
17890 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
178a0 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
178b0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d   pExpr->iTable==
178c0 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66  iTable ){.    if
178d0 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
178e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  <0 ){.      pExp
178f0 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b  r->op = TK_NULL;
17900 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17910 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
17920 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
17930 73 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  st!=0 && pExpr->
17940 69 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e  iColumn<pEList->
17950 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
17960 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
17970 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
17980 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
17990 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
179a0 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
179b0 4c 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69  List->a[pExpr->i
179c0 43 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30  Column].pExpr, 0
179d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
179e0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
179f0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78  Expr);.      pEx
17a00 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
17a10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45  .  }else{.    pE
17a20 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62  xpr->pLeft = sub
17a30 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
17a40 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c  ->pLeft, iTable,
17a50 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45   pEList);.    pE
17a60 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75  xpr->pRight = su
17a70 62 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70  bstExpr(db, pExp
17a80 72 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c  r->pRight, iTabl
17a90 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  e, pEList);.    
17aa0 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
17ab0 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
17ac0 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
17ad0 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
17ae0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  , pExpr->x.pSele
17af0 63 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ct, iTable, pELi
17b00 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
17b10 20 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c        substExprL
17b20 69 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78  ist(db, pExpr->x
17b30 2e 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20  .pList, iTable, 
17b40 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20  pEList);.    }. 
17b50 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70   }.  return pExp
17b60 72 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  r;.}.static void
17b70 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a   substExprList(.
17b80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
17b90 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
17ba0 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
17bb0 65 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ere */.  ExprLis
17bc0 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a  t *pList,     /*
17bd0 20 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e   List to scan an
17be0 64 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  d in which to ma
17bf0 6b 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a  ke substitutes *
17c00 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
17c10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
17c20 65 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75  e to be substitu
17c30 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
17c40 74 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a  t *pEList     /*
17c50 20 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75   Substitute valu
17c60 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
17c70 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
17c80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
17c90 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
17ca0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
17cb0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
17cc0 72 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  r = substExpr(db
17cd0 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
17ce0 78 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  xpr, iTable, pEL
17cf0 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  ist);.  }.}.stat
17d00 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
17d10 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ect(.  sqlite3 *
17d20 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52  db,         /* R
17d30 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
17d40 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ors here */.  Se
17d50 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
17d60 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61     /* SELECT sta
17d70 74 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20  tement in which 
17d80 74 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75  to make substitu
17d90 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tions */.  int i
17da0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
17db0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72  /* Table to be r
17dc0 65 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70  eplaced */.  Exp
17dd0 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
17de0 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
17df0 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53  values */.){.  S
17e00 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20  rcList *pSrc;.  
17e10 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
17e20 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
17e30 74 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20  t i;.  if( !p ) 
17e40 72 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45  return;.  substE
17e50 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
17e60 45 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  EList, iTable, p
17e70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45  EList);.  substE
17e80 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70  xprList(db, p->p
17e90 47 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c  GroupBy, iTable,
17ea0 20 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73   pEList);.  subs
17eb0 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d  tExprList(db, p-
17ec0 3e 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c  >pOrderBy, iTabl
17ed0 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d  e, pEList);.  p-
17ee0 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74  >pHaving = subst
17ef0 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76  Expr(db, p->pHav
17f00 69 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ing, iTable, pEL
17f10 69 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72  ist);.  p->pWher
17f20 65 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  e = substExpr(db
17f30 2c 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61  , p->pWhere, iTa
17f40 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
17f50 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20  substSelect(db, 
17f60 70 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c  p->pPrior, iTabl
17f70 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53  e, pEList);.  pS
17f80 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
17f90 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 20  assert( pSrc ); 
17fa0 20 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45   /* Even for (SE
17fb0 4c 45 43 54 20 31 29 20 77 65 20 68 61 76 65 3a  LECT 1) we have:
17fc0 20 70 53 72 63 21 3d 30 20 62 75 74 20 70 53 72   pSrc!=0 but pSr
17fd0 63 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20  c->nSrc==0 */.  
17fe0 69 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 29  if( ALWAYS(pSrc)
17ff0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53   ){.    for(i=pS
18000 72 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d  rc->nSrc, pItem=
18010 70 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  pSrc->a; i>0; i-
18020 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
18030 20 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64     substSelect(d
18040 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
18050 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
18060 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
18070 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
18080 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
18090 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
180a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
180b0 5f 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21  _VIEW) */..#if !
180c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
180d0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
180e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
180f0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a  _OMIT_VIEW)./*.*
18100 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
18110 74 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74  ttempts to flatt
18120 65 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73  en subqueries as
18130 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f   a performance o
18140 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20  ptimization..** 
18150 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
18160 75 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b  urns 1 if it mak
18170 65 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30  es changes and 0
18180 20 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e   if no flattenin
18190 67 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  g occurs..**.** 
181a0 54 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  To understand th
181b0 65 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61  e concept of fla
181c0 74 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65  ttening, conside
181d0 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  r the following.
181e0 2a 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  ** query:.**.** 
181f0 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f      SELECT a FRO
18200 4d 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53  M (SELECT x+y AS
18210 20 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   a FROM t1 WHERE
18220 20 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e   z<100) WHERE a>
18230 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  5.**.** The defa
18240 75 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65  ult way of imple
18250 6d 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65  menting this que
18260 72 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65  ry is to execute
18270 20 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79   the.** subquery
18280 20 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65   first and store
18290 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20   the results in 
182a0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
182b0 65 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74  e, then.** run t
182c0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f  he outer query o
182d0 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79  n that temporary
182e0 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65   table.  This re
182f0 71 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61  quires two.** pa
18300 73 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61  sses over the da
18310 74 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65  ta.  Furthermore
18320 2c 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65  , because the te
18330 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a  mporary table.**
18340 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c   has no indices,
18350 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
18360 65 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71  e on the outer q
18370 75 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a  uery cannot be.*
18380 2a 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a  * optimized..**.
18390 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
183a0 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72  attempts to rewr
183b0 69 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68  ite queries such
183c0 20 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e   as the above in
183d0 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66  to.** a single f
183e0 6c 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65  lat select, like
183f0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
18400 20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61   SELECT x+y AS a
18410 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a   FROM t1 WHERE z
18420 3c 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a  <100 AND a>5.**.
18430 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
18440 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73  rated for this s
18450 69 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76  impification giv
18460 65 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75  es the same resu
18470 6c 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68  lt.** but only h
18480 61 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64  as to scan the d
18490 61 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62  ata once.  And b
184a0 65 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d  ecause indices m
184b0 69 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f  ight .** exist o
184c0 6e 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20  n the table t1, 
184d0 61 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20  a complete scan 
184e0 6f 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68  of the data migh
184f0 74 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e  t be.** avoided.
18500 0a 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e  .**.** Flattenin
18510 67 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70  g is only attemp
18520 74 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  ted if all of th
18530 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
18540 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  true:.**.**   (1
18550 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
18560 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75  and the outer qu
18570 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20  ery do not both 
18580 75 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a  use aggregates..
18590 2a 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65  **.**   (2)  The
185a0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
185b0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
185c0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
185d0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a   is not a join..
185e0 2a 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65  **.**   (3)  The
185f0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
18600 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
18610 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
18620 65 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20  er join.**      
18630 20 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69    (Originally ti
18640 63 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65  cket #306.  Stre
18650 6e 67 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b  ngthened by tick
18660 65 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20  et #3300).**.** 
18670 20 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75    (4)  The subqu
18680 65 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49  ery is not DISTI
18690 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29  NCT..**.**  (**)
186a0 20 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72    At one point r
186b0 65 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20  estrictions (4) 
186c0 61 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64 20  and (5) defined 
186d0 61 20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54  a subset of DIST
186e0 49 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73  INCT.**        s
186f0 75 62 2d 71 75 65 72 69 65 73 20 74 68 61 74 20  ub-queries that 
18700 77 65 72 65 20 65 78 63 6c 75 64 65 64 20 66 72  were excluded fr
18710 6f 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  om this optimiza
18720 74 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f  tion. Restrictio
18730 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29  n .**        (4)
18740 20 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20   has since been 
18750 65 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c  expanded to excl
18760 75 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54  ude all DISTINCT
18770 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a   subqueries..**.
18780 2a 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75  **   (6)  The su
18790 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
187a0 75 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f  use aggregates o
187b0 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
187c0 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
187d0 20 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a     DISTINCT..**.
187e0 2a 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75  **   (7)  The su
187f0 62 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f  bquery has a FRO
18800 4d 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a  M clause.  TODO:
18810 20 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73    For subqueries
18820 20 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20   without.**     
18830 20 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65     A FROM clause
18840 2c 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e  , consider addin
18850 67 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77  g a FROM close w
18860 69 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a  ith the special.
18870 2a 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20  **        table 
18880 73 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74  sqlite_once that
18890 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73   consists of a s
188a0 69 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69  ingle row contai
188b0 6e 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20  ning a.**       
188c0 20 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a   single NULL..**
188d0 0a 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73  .**   (8)  The s
188e0 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
188f0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
18900 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73  e outer query is
18910 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a   not a join..**.
18920 2a 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75  **   (9)  The su
18930 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
18940 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
18950 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65   outer query doe
18960 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20  s not use.**    
18970 20 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a      aggregates..
18980 2a 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65  **.**  (10)  The
18990 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
189a0 6f 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65  ot use aggregate
189b0 73 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  s or the outer q
189c0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
189d0 20 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49          use LIMI
189e0 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20  T..**.**  (11)  
189f0 54 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64  The subquery and
18a00 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18a10 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76   do not both hav
18a20 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
18a30 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  es..**.**  (**) 
18a40 20 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64   Not implemented
18a50 2e 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f  .  Subsumed into
18a60 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29   restriction (3)
18a70 2e 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c  .  Was previousl
18a80 79 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65  y.**        a se
18a90 70 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69  parate restricti
18aa0 6f 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d  on deriving from
18ab0 20 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a   ticket #350..**
18ac0 0a 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73  .**  (13)  The s
18ad0 75 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65  ubquery and oute
18ae0 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62  r query do not b
18af0 6f 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a  oth use LIMIT..*
18b00 2a 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20  *.**  (14)  The 
18b10 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
18b20 74 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a  t use OFFSET..**
18b30 0a 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f  .**  (15)  The o
18b40 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
18b50 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  t part of a comp
18b60 6f 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74  ound select or t
18b70 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62  he.**        sub
18b80 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68  query does not h
18b90 61 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75  ave a LIMIT clau
18ba0 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53  se..**        (S
18bb0 65 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20  ee ticket #2339 
18bc0 61 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38  and ticket [02a8
18bd0 65 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20  e81d44])..**.** 
18be0 20 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72   (16)  The outer
18bf0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e   query is not an
18c00 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68   aggregate or th
18c10 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a  e subquery does.
18c20 2a 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f  **        not co
18c30 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20  ntain ORDER BY. 
18c40 20 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20   (Ticket #2942) 
18c50 20 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f   This used to no
18c60 74 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20  t matter.**     
18c70 20 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72     until we intr
18c80 6f 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70  oduced the group
18c90 5f 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69  _concat() functi
18ca0 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37  on.  .**.**  (17
18cb0 29 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79  )  The sub-query
18cc0 20 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75   is not a compou
18cd0 6e 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74  nd select, or it
18ce0 20 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20   is a UNION ALL 
18cf0 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f  .**        compo
18d00 75 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20  und clause made 
18d10 75 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e  up entirely of n
18d20 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65  on-aggregate que
18d30 72 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20  ries, and .**   
18d40 20 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20       the parent 
18d50 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  query:.**.**    
18d60 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69        * is not i
18d70 74 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20  tself part of a 
18d80 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
18d90 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69  .**          * i
18da0 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61  s not an aggrega
18db0 74 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71  te or DISTINCT q
18dc0 75 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20  uery, and.**    
18dd0 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
18de0 20 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   join.**.**     
18df0 20 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e     The parent an
18e00 64 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20  d sub-query may 
18e10 63 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c  contain WHERE cl
18e20 61 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74  auses. Subject t
18e30 6f 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65  o.**        rule
18e40 73 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64  s (11), (13) and
18e50 20 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20   (14), they may 
18e60 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44  also contain ORD
18e70 45 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20  ER BY,.**       
18e80 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
18e90 54 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20  T clauses.  The 
18ea0 73 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20  subquery cannot 
18eb0 75 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64  use any compound
18ec0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
18ed0 74 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55  tor other than U
18ee0 4e 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65  NION ALL because
18ef0 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63   all the other c
18f00 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20  ompound.**      
18f10 20 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65    operators have
18f20 20 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54   an implied DIST
18f30 49 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69  INCT which is di
18f40 73 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20  sallowed by.**  
18f50 20 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f        restrictio
18f60 6e 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  n (4)..**.**    
18f70 20 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63      Also, each c
18f80 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20  omponent of the 
18f90 73 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72  sub-query must r
18fa0 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e  eturn the same n
18fb0 75 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  umber.**        
18fc0 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
18fd0 73 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61  s. This is actua
18fe0 6c 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e  lly a requiremen
18ff0 74 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75  t for any compou
19000 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c  nd.**        SEL
19010 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ECT statement, b
19020 75 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20  ut all the code 
19030 68 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b  here does is mak
19040 65 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a  e sure that no.*
19050 2a 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69  *        such (i
19060 6c 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72  llegal) sub-quer
19070 79 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20  y is flattened. 
19080 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
19090 64 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20  detect the.**   
190a0 20 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f       syntax erro
190b0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64  r and return a d
190c0 65 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e  etailed message.
190d0 0a 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66  .**.**  (18)  If
190e0 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69   the sub-query i
190f0 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
19100 65 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65  ect, then all te
19110 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  rms of the.**   
19120 20 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c       ORDER by cl
19130 61 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65  ause of the pare
19140 6e 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c  nt must be simpl
19150 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
19160 0a 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d  .**        colum
19170 6e 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  ns of the sub-qu
19180 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29  ery..**.**  (19)
19190 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64    The subquery d
191a0 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49  oes not use LIMI
191b0 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71  T or the outer q
191c0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  uery does not.**
191d0 20 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57          have a W
191e0 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  HERE clause..**.
191f0 2a 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65  **  (20)  If the
19200 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20   sub-query is a 
19210 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c  compound select,
19220 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f   then it must no
19230 74 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  t use.**        
19240 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
19250 73 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37  se.  Ticket #377
19260 33 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c  3.  We could rel
19270 61 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  ax this constrai
19280 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d  nt.**        som
19290 65 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20  ewhat by saying 
192a0 74 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f  that the terms o
192b0 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
192c0 6c 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20  lause must.**   
192d0 20 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75       appear as u
192e0 6e 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74  nmodified result
192f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
19300 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75  outer query.  Bu
19310 74 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68  t we.**        h
19320 61 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69  ave other optimi
19330 7a 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20  zations in mind 
19340 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61  to deal with tha
19350 74 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  t case..**.**  (
19360 32 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72  21)  The subquer
19370 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
19380 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
19390 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a  r query is not.*
193a0 2a 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43  *        DISTINC
193b0 54 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20  T.  (See ticket 
193c0 5b 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a  [752e1646fc])..*
193d0 2a 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20  *.**  (22)  The 
193e0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
193f0 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e  a recursive CTE.
19400 0a 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68  .**.**  (23)  Th
19410 65 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20  e parent is not 
19420 61 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c  a recursive CTE,
19430 20 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65 72   or the sub-quer
19440 79 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20  y is not a.**   
19450 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75       compound qu
19460 65 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69  ery. This restri
19470 63 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65  ction is because
19480 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68   transforming th
19490 65 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65  e.**        pare
194a0 6e 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64  nt to a compound
194b0 20 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20   query confuses 
194c0 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61  the code that ha
194d0 6e 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  ndles.**        
194e0 72 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65  recursive querie
194f0 73 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  s in multiSelect
19500 28 29 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20  ()..**.**.** In 
19510 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68  this routine, th
19520 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20  e "p" parameter 
19530 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
19540 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e  the outer query.
19550 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79  .** The subquery
19560 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   is p->pSrc->a[i
19570 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73  From].  isAgg is
19580 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   true if the out
19590 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73  er query.** uses
195a0 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20   aggregates and 
195b0 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73  subqueryIsAgg is
195c0 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62   true if the sub
195d0 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65  query uses aggre
195e0 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gates..**.** If 
195f0 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f  flattening is no
19600 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69  t attempted, thi
19610 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
19620 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73  o-op and returns
19630 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65   0..** If flatte
19640 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65  ning is attempte
19650 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
19660 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20  eturns 1..**.** 
19670 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65  All of the expre
19680 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d  ssion analysis m
19690 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74  ust occur on bot
196a0 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  h the outer quer
196b0 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62  y and.** the sub
196c0 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69  query before thi
196d0 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a  s routine runs..
196e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
196f0 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20  attenSubquery(. 
19700 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
19710 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
19720 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
19730 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
19740 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74     /* The parent
19750 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54   or outer SELECT
19760 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
19770 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20  int iFrom,      
19780 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
19790 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   p->pSrc->a[] of
197a0 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75   the inner subqu
197b0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ery */.  int isA
197c0 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gg,           /*
197d0 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53   True if outer S
197e0 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65  ELECT uses aggre
197f0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a  gate functions *
19800 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79  /.  int subquery
19810 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65  IsAgg    /* True
19820 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79   if the subquery
19830 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20   uses aggregate 
19840 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  functions */.){.
19850 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
19860 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20  avedAuthContext 
19870 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
19880 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74  ontext;.  Select
19890 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c   *pParent;.  Sel
198a0 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20  ect *pSub;      
198b0 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75   /* The inner qu
198c0 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79  ery or "subquery
198d0 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  " */.  Select *p
198e0 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f  Sub1;      /* Po
198f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67  inter to the rig
19900 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e  htmost select in
19910 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20   sub-query */.  
19920 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20  SrcList *pSrc;  
19930 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
19940 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75  clause of the ou
19950 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53  ter query */.  S
19960 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b  rcList *pSubSrc;
19970 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
19980 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62  lause of the sub
19990 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c  query */.  ExprL
199a0 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f  ist *pList;    /
199b0 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74  * The result set
199c0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
199d0 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  ery */.  int iPa
199e0 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  rent;        /* 
199f0 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
19a00 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72  er of the pSub r
19a10 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74  esult set temp t
19a20 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
19a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19a40 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
19a50 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
19a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a70 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
19a80 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72   clause */.  str
19a90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19aa0 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a   *pSubitem;   /*
19ab0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   The subquery */
19ac0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
19ad0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
19ae0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
19af0 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  if flattening is
19b00 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74   permitted.  Ret
19b10 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20  urn 0 if not..  
19b20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  */.  assert( p!=
19b30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
19b40 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20  ->pPrior==0 );  
19b50 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61  /* Unable to fla
19b60 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75  tten compound qu
19b70 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f  eries */.  if( O
19b80 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
19b90 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51  led(db, SQLITE_Q
19ba0 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29  ueryFlattener) )
19bb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72   return 0;.  pSr
19bc0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
19bd0 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69  ssert( pSrc && i
19be0 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d  From>=0 && iFrom
19bf0 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20  <pSrc->nSrc );. 
19c00 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72   pSubitem = &pSr
19c10 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69  c->a[iFrom];.  i
19c20 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65  Parent = pSubite
19c30 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53  m->iCursor;.  pS
19c40 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70  ub = pSubitem->p
19c50 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74  Select;.  assert
19c60 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69  ( pSub!=0 );.  i
19c70 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71  f( isAgg && subq
19c80 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75  ueryIsAgg ) retu
19c90 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
19ca0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19cb0 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69  tion (1)  */.  i
19cc0 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67  f( subqueryIsAgg
19cd0 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31   && pSrc->nSrc>1
19ce0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
19cf0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19d00 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70  tion (2)  */.  p
19d10 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
19d20 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Src;.  assert( p
19d30 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50  SubSrc );.  /* P
19d40 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20  rior to version 
19d50 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49  3.1.2, when LIMI
19d60 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64  T and OFFSET had
19d70 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f   to be simple co
19d80 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f  nstants,.  ** no
19d90 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72  t arbitrary expr
19da0 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c  esssions, we all
19db0 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e  owed some combin
19dc0 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64  ing of LIMIT and
19dd0 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
19de0 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20  ause they could 
19df0 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63  be computed at c
19e00 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75  ompile-time.  Bu
19e10 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64  t when LIMIT and
19e20 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63   OFFSET.  ** bec
19e30 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78  ame arbitrary ex
19e40 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65  pressions, we we
19e50 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64  re forced to add
19e60 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31   restrictions (1
19e70 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29  3).  ** and (14)
19e80 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  . */.  if( pSub-
19e90 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c  >pLimit && p->pL
19ea0 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b  imit ) return 0;
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19ec0 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33   Restriction (13
19ed0 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d  ) */.  if( pSub-
19ee0 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72  >pOffset ) retur
19ef0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19f10 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34   Restriction (14
19f20 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 52  ) */.  if( p->pR
19f30 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75 62  ightmost && pSub
19f40 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
19f50 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f80 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
19f90 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
19fa0 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
19fb0 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
19fc0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
19fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
19fe0 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
19ff0 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1a000 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1a010 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
1a020 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1a030 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a  riction (5)  */.
1a040 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1a050 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
1a060 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
1a070 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1a080 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1a090 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
1a0a0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1a0b0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1a0c0 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
1a0d0 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1a0e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1a0f0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1a100 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
1a110 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
1a120 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
1a130 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
1a140 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a170 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1a180 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
1a190 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
1a1a0 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
1a1b0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1a1c0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1a1d0 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
1a1e0 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1a1f0 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
1a200 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1a210 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1a220 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
1a230 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1a240 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
1a250 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1a260 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1a270 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1a280 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
1a290 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1a2a0 2d 3e 70 52 65 63 75 72 73 65 20 29 20 72 65 74  ->pRecurse ) ret
1a2b0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a2d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
1a2e0 32 29 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  2)  */.  if( p->
1a2f0 70 52 65 63 75 72 73 65 20 26 26 20 70 53 75 62  pRecurse && pSub
1a300 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75 72  ->pPrior ) retur
1a310 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1a320 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1a330 32 33 29 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42  23)  */..  /* OB
1a340 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
1a350 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
1a360 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
1a370 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1a380 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1a390 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
1a3a0 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
1a3b0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1a3c0 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
1a3d0 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
1a3e0 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
1a3f0 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
1a400 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
1a410 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1a420 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
1a430 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1a440 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1a450 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1a460 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1a470 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1a480 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
1a490 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
1a4a0 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
1a4b0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
1a4c0 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
1a4d0 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
1a4e0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
1a4f0 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1a500 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1a510 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1a520 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
1a530 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
1a540 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
1a550 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1a560 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
1a570 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1a580 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1a590 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1a5a0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1a5b0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1a5c0 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
1a5d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1a5e0 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1a5f0 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1a600 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1a610 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1a620 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
1a630 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
1a640 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
1a650 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
1a660 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
1a670 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
1a680 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
1a690 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
1a6a0 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
1a6b0 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
1a6c0 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
1a6d0 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
1a6e0 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
1a6f0 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
1a700 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
1a710 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
1a720 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1a730 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
1a740 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
1a750 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
1a760 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
1a770 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
1a780 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1a790 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
1a7a0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
1a7b0 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
1a7c0 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
1a7d0 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a  if( (pSubitem->j
1a7e0 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1a7f0 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1a800 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1a810 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
1a820 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1a830 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1a840 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1a850 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1a860 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1a870 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1a880 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1a890 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1a8a0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1a8b0 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1a8c0 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1a8d0 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1a8e0 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1a8f0 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1a900 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1a910 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1a920 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1a930 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a940 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1a950 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
1a960 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
1a970 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1a980 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
1a990 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
1a9a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1a9b0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1a9c0 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
1a9d0 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
1a9e0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
1a9f0 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1aa00 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1aa10 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1aa20 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1aa30 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
1aa40 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1aa50 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1aa60 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1aa70 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
1aa80 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
1aa90 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
1aaa0 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  c!=0 );.      if
1aab0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1aac0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1aad0 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1aae0 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  !=0.       || (p
1aaf0 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
1ab00 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
1ab10 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  L) .       || pS
1ab20 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
1ab30 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  1.       || pSub
1ab40 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
1ab50 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
1ab60 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20  nExpr.      ){. 
1ab70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1ab80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1ab90 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
1aba0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
1abb0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1abc0 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f  striction 18. */
1abd0 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
1abe0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
1abf0 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
1ac00 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
1ac10 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
1ac20 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1ac30 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
1ac40 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
1ac50 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
1ac60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ac70 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66    }..  /***** If
1ac80 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1ac90 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
1aca0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
1acb0 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68  ****/..  /* Auth
1acc0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
1acd0 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
1ace0 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1acf0 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
1ad00 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
1ad10 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1ad20 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1ad30 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1ad40 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
1ad50 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
1ad60 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1ad70 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
1ad80 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
1ad90 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
1ada0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1adb0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1adc0 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
1add0 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
1ade0 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
1adf0 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
1ae00 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
1ae10 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
1ae20 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
1ae30 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
1ae40 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
1ae50 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
1ae60 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
1ae70 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
1ae80 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
1ae90 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1aea0 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
1aeb0 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
1aec0 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
1aed0 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
1aee0 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
1aef0 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
1af00 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
1af10 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
1af20 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
1af30 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
1af40 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
1af50 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
1af60 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
1af70 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
1af80 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
1af90 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
1afa0 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
1afb0 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
1afc0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
1afd0 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
1afe0 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
1aff0 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
1b000 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
1b010 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
1b020 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1b030 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1b040 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
1b050 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
1b060 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1b070 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1b080 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
1b090 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
1b0a0 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
1b0b0 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
1b0c0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
1b0d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1b0e0 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
1b0f0 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
1b100 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1b110 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1b120 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
1b130 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
1b140 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
1b150 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1b160 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
1b170 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
1b180 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
1b190 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
1b1a0 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
1b1b0 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
1b1c0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1b1d0 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
1b1e0 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
1b1f0 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
1b200 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1b210 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
1b220 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
1b230 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
1b240 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
1b250 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
1b260 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20  Limit;.    Expr 
1b270 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  *pOffset = p->pO
1b280 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63  ffset;.    Selec
1b290 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
1b2a0 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
1b2b0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1b2c0 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
1b2d0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1b2e0 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
1b2f0 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  0;.    p->pOffse
1b300 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
1b310 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
1b320 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20  up(db, p, 0);.  
1b330 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
1b340 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70  Offset;.    p->p
1b350 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
1b360 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1b370 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
1b380 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
1b390 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
1b3a0 4c 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68  LL;.    p->pRigh
1b3b0 74 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69  tmost = 0;.    i
1b3c0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1b3d0 20 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f      pNew = pPrio
1b3e0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1b3f0 20 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72      pNew->pPrior
1b400 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
1b410 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73   pNew->pRightmos
1b420 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
1b430 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65   p->pPrior = pNe
1b440 77 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  w;.    if( db->m
1b450 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1b460 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 1;.  }..  /
1b470 2a 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69  * Begin flatteni
1b480 6e 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20  ng the iFrom-th 
1b490 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
1b4a0 4d 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69  M clause .  ** i
1b4b0 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  n the outer quer
1b4c0 79 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d  y..  */.  pSub =
1b4d0 20 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65   pSub1 = pSubite
1b4e0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f  m->pSelect;..  /
1b4f0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61  * Delete the tra
1b500 6e 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72  nsient table str
1b510 75 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65  ucture associate
1b520 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
1b530 73 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20  subquery.  */.  
1b540 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b550 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74  , pSubitem->zDat
1b560 61 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  abase);.  sqlite
1b570 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62  3DbFree(db, pSub
1b580 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  item->zName);.  
1b590 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1b5a0 2c 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69  , pSubitem->zAli
1b5b0 61 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d  as);.  pSubitem-
1b5c0 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
1b5d0 20 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d    pSubitem->zNam
1b5e0 65 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65  e = 0;.  pSubite
1b5f0 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->zAlias = 0;. 
1b600 20 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65   pSubitem->pSele
1b610 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65  ct = 0;..  /* De
1b620 66 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  fer deleting the
1b630 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73   Table object as
1b640 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1b650 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20  e.  ** subquery 
1b660 75 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72  until code gener
1b670 61 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ation is.  ** co
1b680 6d 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68  mplete, since th
1b690 65 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78  ere may still ex
1b6a0 69 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e  ist Expr.pTab en
1b6b0 74 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20  tries that.  ** 
1b6c0 72 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62  refer to the sub
1b6d0 71 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72  query even after
1b6e0 20 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69   flattening.  Ti
1b6f0 63 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a  cket #3346..  **
1b700 0a 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e  .  ** pSubitem->
1b710 70 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e  pTab is always n
1b720 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20  on-NULL by test 
1b730 72 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64  restrictions and
1b740 20 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20   tests above..  
1b750 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  */.  if( ALWAYS(
1b760 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d  pSubitem->pTab!=
1b770 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  0) ){.    Table 
1b780 2a 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75  *pTabToDel = pSu
1b790 62 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bitem->pTab;.   
1b7a0 20 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e   if( pTabToDel->
1b7b0 6e 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nRef==1 ){.     
1b7c0 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1b7d0 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1b7e0 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1b7f0 3b 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65  ;.      pTabToDe
1b800 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d  l->pNextZombie =
1b810 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d   pToplevel->pZom
1b820 62 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54  bieTab;.      pT
1b830 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65  oplevel->pZombie
1b840 54 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b  Tab = pTabToDel;
1b850 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b860 20 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65    pTabToDel->nRe
1b870 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  f--;.    }.    p
1b880 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20  Subitem->pTab = 
1b890 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  0;.  }..  /* The
1b8a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20   following loop 
1b8b0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
1b8c0 63 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d  ch term in a com
1b8d0 70 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20  pound-subquery. 
1b8e0 20 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28   ** flattening (
1b8f0 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
1b900 76 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20  ve).  If we are 
1b910 64 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e  doing a differen
1b920 74 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66  t kind.  ** of f
1b930 6c 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c  lattening - a fl
1b940 61 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74  attening other t
1b950 68 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73  han a compound-s
1b960 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69  ubquery flatteni
1b970 6e 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ng -.  ** then t
1b980 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75  his loop only ru
1b990 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  ns once..  **.  
1b9a0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76  ** This loop mov
1b9b0 65 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52  es all of the FR
1b9c0 4f 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  OM elements of t
1b9d0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1b9e0 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52   the.  ** the FR
1b9f0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1ba00 20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42   outer query.  B
1ba10 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73  efore doing this
1ba20 2c 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20  , remember.  ** 
1ba30 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
1ba40 72 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  r for the origin
1ba50 61 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46  al outer query F
1ba60 52 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20  ROM element in. 
1ba70 20 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68   ** iParent.  Th
1ba80 65 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72  e iParent cursor
1ba90 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
1baa0 73 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74  sed.  Subsequent
1bab0 20 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   code.  ** will 
1bac0 73 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  scan expressions
1bad0 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61   looking for iPa
1bae0 72 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20  rent references 
1baf0 61 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a  and replace.  **
1bb00 20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65   those reference
1bb10 73 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f  s with expressio
1bb20 6e 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20  ns that resolve 
1bb30 74 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20  to the subquery 
1bb40 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e  FROM.  ** elemen
1bb50 74 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f  ts we are now co
1bb60 70 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20  pying in..  */. 
1bb70 20 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20   for(pParent=p; 
1bb80 70 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74  pParent; pParent
1bb90 3d 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72  =pParent->pPrior
1bba0 2c 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72  , pSub=pSub->pPr
1bbb0 69 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53  ior){.    int nS
1bbc0 75 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f  ubSrc;.    u8 jo
1bbd0 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  intype = 0;.    
1bbe0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
1bbf0 70 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f  pSrc;     /* FRO
1bc00 4d 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71  M clause of subq
1bc10 75 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62  uery */.    nSub
1bc20 53 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e  Src = pSubSrc->n
1bc30 53 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  Src;  /* Number 
1bc40 6f 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71  of terms in subq
1bc50 75 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65  uery FROM clause
1bc60 20 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70   */.    pSrc = p
1bc70 50 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20  Parent->pSrc;   
1bc80 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
1bc90 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1bca0 65 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20  ery */..    if( 
1bcb0 70 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73  pSrc ){.      as
1bcc0 73 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70  sert( pParent==p
1bcd0 20 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69   );  /* First ti
1bce0 6d 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c  me through the l
1bcf0 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69  oop */.      joi
1bd00 6e 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d  ntype = pSubitem
1bd10 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ->jointype;.    
1bd20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1bd30 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20  ert( pParent!=p 
1bd40 29 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73  );  /* 2nd and s
1bd50 75 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20  ubsequent times 
1bd60 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70  through the loop
1bd70 20 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d   */.      pSrc =
1bd80 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d   pParent->pSrc =
1bd90 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1bda0 70 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20  ppend(db, 0, 0, 
1bdb0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  0);.      if( pS
1bdc0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc==0 ){.       
1bdd0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
1bde0 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1bdf0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1be00 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1be10 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75  * The subquery u
1be20 73 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f  ses a single slo
1be30 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
1be40 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1be50 72 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20  r.    ** query. 
1be60 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79   If the subquery
1be70 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
1be80 6e 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74  ne element in it
1be90 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20  s FROM clause,. 
1bea0 20 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e     ** then expan
1beb0 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  d the outer quer
1bec0 79 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  y to make space 
1bed0 66 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61  for it to hold a
1bee0 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  ll elements.    
1bef0 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
1bf00 72 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry..    **.    *
1bf10 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1bf20 2a 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45  *.    **    SELE
1bf30 43 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20  CT * FROM tabA, 
1bf40 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  (SELECT * FROM s
1bf50 75 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42  ub1, sub2), tabB
1bf60 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1bf70 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
1bf80 68 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69  has 3 slots in i
1bf90 74 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ts FROM clause. 
1bfa0 20 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65   One slot of the
1bfb0 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
1bfc0 65 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20  ery (the middle 
1bfd0 73 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79  slot) is used by
1bfe0 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20   the subquery.  
1bff0 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
1c000 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69  block of code wi
1c010 6c 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75  ll expand the ou
1c020 74 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f  t query to 4 slo
1c030 74 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a  ts.  The middle.
1c040 20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65      ** slot is e
1c050 78 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73  xpanded to two s
1c060 6c 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f  lots in order to
1c070 20 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20   make space for 
1c080 74 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65  the.    ** two e
1c090 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46  lements in the F
1c0a0 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1c0b0 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20  e subquery..    
1c0c0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53  */.    if( nSubS
1c0d0 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50  rc>1 ){.      pP
1c0e0 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53  arent->pSrc = pS
1c0f0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
1c100 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1c110 53 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69  Src, nSubSrc-1,i
1c120 46 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69  From+1);.      i
1c130 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1c140 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62  led ){.        b
1c150 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1c160 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e    }..    /* Tran
1c170 73 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c  sfer the FROM cl
1c180 61 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20  ause terms from 
1c190 74 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74  the subquery int
1c1a0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74  o the.    ** out
1c1b0 65 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f  er query..    */
1c1c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1c1d0 6e 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  nSubSrc; i++){. 
1c1e0 20 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69       sqlite3IdLi
1c1f0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72  stDelete(db, pSr
1c200 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55  c->a[i+iFrom].pU
1c210 73 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72  sing);.      pSr
1c220 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20  c->a[i+iFrom] = 
1c230 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  pSubSrc->a[i];. 
1c240 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75       memset(&pSu
1c250 62 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73  bSrc->a[i], 0, s
1c260 69 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61  izeof(pSubSrc->a
1c270 5b 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  [i]));.    }.   
1c280 20 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e   pSrc->a[iFrom].
1c290 6a 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74  jointype = joint
1c2a0 79 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e  ype;.  .    /* N
1c2b0 6f 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74  ow begin substit
1c2c0 75 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72  uting subquery r
1c2d0 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
1c2e0 73 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a  sions for .    *
1c2f0 2a 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * references to 
1c300 74 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74  the iParent in t
1c310 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1c320 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45      ** .    ** E
1c330 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20  xample:.    **. 
1c340 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61     **   SELECT a
1c350 2b 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53  +5, b*10 FROM (S
1c360 45 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20  ELECT x*3 AS a, 
1c370 79 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74  y+10 AS b FROM t
1c380 31 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20  1) WHERE a>b;.  
1c390 20 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20    **   \        
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f               \__
1c3b0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71  ___________ subq
1c3c0 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  uery __________/
1c3d0 20 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20            /.    
1c3e0 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f  **    \_________
1c3f0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74  ____________ out
1c400 65 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  er query _______
1c410 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1c420 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a  _______/.    **.
1c430 20 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61      ** We look a
1c440 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  t every expressi
1c450 6f 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  on in the outer 
1c460 71 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20  query and every 
1c470 70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20  place we see.   
1c480 20 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74   ** "a" we subst
1c490 69 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20  itute "x*3" and 
1c4a0 65 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73  every place we s
1c4b0 65 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69  ee "b" we substi
1c4c0 74 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20  tute "y+10"..   
1c4d0 20 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   */.    pList = 
1c4e0 70 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b  pParent->pEList;
1c4f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1c500 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
1c510 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  +){.      if( pL
1c520 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d  ist->a[i].zName=
1c530 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
1c540 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ar *zName = sqli
1c550 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
1c560 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61  pList->a[i].zSpa
1c570 6e 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  n);.        sqli
1c580 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
1c590 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  );.        pList
1c5a0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  ->a[i].zName = z
1c5b0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Name;.      }.  
1c5c0 20 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70    }.    substExp
1c5d0 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e  rList(db, pParen
1c5e0 74 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65  t->pEList, iPare
1c5f0 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1c600 29 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67  );.    if( isAgg
1c610 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1c620 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1c630 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69  ent->pGroupBy, i
1c640 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1c650 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
1c660 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20  rent->pHaving = 
1c670 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1c680 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20  arent->pHaving, 
1c690 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1c6a0 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1c6b0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64    if( pSub->pOrd
1c6c0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73  erBy ){.      as
1c6d0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
1c6e0 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20  OrderBy==0 );.  
1c6f0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72      pParent->pOr
1c700 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
1c710 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
1c720 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
1c730 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c740 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42  pParent->pOrderB
1c750 79 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  y ){.      subst
1c760 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61  ExprList(db, pPa
1c770 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20  rent->pOrderBy, 
1c780 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70  iParent, pSub->p
1c790 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
1c7a0 20 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65    if( pSub->pWhe
1c7b0 72 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65  re ){.      pWhe
1c7c0 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
1c7d0 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57  Dup(db, pSub->pW
1c7e0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  here, 0);.    }e
1c7f0 6c 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72  lse{.      pWher
1c800 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 0;.    }.   
1c810 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41   if( subqueryIsA
1c820 67 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  gg ){.      asse
1c830 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61  rt( pParent->pHa
1c840 76 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ving==0 );.     
1c850 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1c860 67 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68  g = pParent->pWh
1c870 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
1c880 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68  nt->pWhere = pWh
1c890 65 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65  ere;.      pPare
1c8a0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75  nt->pHaving = su
1c8b0 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72  bstExpr(db, pPar
1c8c0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50  ent->pHaving, iP
1c8d0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1c8e0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1c8f0 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1c900 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
1c910 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
1c920 6e 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ng, .           
1c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1c950 70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e  prDup(db, pSub->
1c960 70 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20  pHaving, 0));.  
1c970 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
1c980 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30  ent->pGroupBy==0
1c990 20 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e   );.      pParen
1c9a0 74 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  t->pGroupBy = sq
1c9b0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
1c9c0 28 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75  (db, pSub->pGrou
1c9d0 70 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  pBy, 0);.    }el
1c9e0 73 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  se{.      pParen
1c9f0 74 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73  t->pWhere = subs
1ca00 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e  tExpr(db, pParen
1ca10 74 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65  t->pWhere, iPare
1ca20 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74  nt, pSub->pEList
1ca30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1ca40 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
1ca50 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50  e3ExprAnd(db, pP
1ca60 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70  arent->pWhere, p
1ca70 57 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Where);.    }.  
1ca80 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74  .    /* The flat
1ca90 74 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64  tened query is d
1caa0 69 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65  istinct if eithe
1cab0 72 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74  r the inner or t
1cac0 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  he.    ** outer 
1cad0 71 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63  query is distinc
1cae0 74 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  t. .    */.    p
1caf0 50 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73  Parent->selFlags
1cb00 20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61   |= pSub->selFla
1cb10 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74  gs & SF_Distinct
1cb20 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ;.  .    /*.    
1cb30 2a 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52  ** SELECT ... FR
1cb40 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c  OM (SELECT ... L
1cb50 49 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29  IMIT a OFFSET b)
1cb60 20 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20   LIMIT x OFFSET 
1cb70 79 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y;.    **.    **
1cb80 20 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20   One is tempted 
1cb90 74 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20  to try to add a 
1cba0 61 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65  and b to combine
1cbb0 20 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75   the limits.  Bu
1cbc0 74 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f  t this.    ** do
1cbd0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65  es not work if e
1cbe0 69 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e  ither limit is n
1cbf0 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a  egative..    */.
1cc00 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c      if( pSub->pL
1cc10 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50  imit ){.      pP
1cc20 61 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20  arent->pLimit = 
1cc30 70 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20  pSub->pLimit;.  
1cc40 20 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74      pSub->pLimit
1cc50 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1cc60 0a 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20  .  /* Finially, 
1cc70 64 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c  delete what is l
1cc80 65 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75  eft of the subqu
1cc90 65 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ery and return. 
1cca0 20 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a   ** success..  *
1ccb0 2f 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  /.  sqlite3Selec
1ccc0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62  tDelete(db, pSub
1ccd0 31 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b  1);..  return 1;
1cce0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
1ccf0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
1cd00 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21  T_SUBQUERY) || !
1cd10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1cd20 4d 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a  MIT_VIEW) */../*
1cd30 0a 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65  .** Based on the
1cd40 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1cd50 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
1cd60 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
1cd70 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
1cd80 75 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63  ument, this func
1cd90 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74  tion checks if t
1cda0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1cdb0 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   true:.**.**    
1cdc0 2a 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74  * the query cont
1cdd0 61 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67  ains just a sing
1cde0 6c 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  le aggregate fun
1cdf0 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74  ction,.**    * t
1ce00 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
1ce10 63 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20  ction is either 
1ce20 6d 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20  min() or max(), 
1ce30 61 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  and.**    * the 
1ce40 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
1ce50 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1ce60 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
1ce70 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  alue..**.** If a
1ce80 6c 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20  ll of the above 
1ce90 61 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57  are true, then W
1cea0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1ceb0 20 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42   or WHERE_ORDERB
1cec0 59 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75  Y_MAX.** is retu
1ced0 72 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69  rned as appropri
1cee0 61 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69  ate. Also, *ppMi
1cef0 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70  nMax is set to p
1cf00 6f 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20  oint to the .** 
1cf10 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74  list of argument
1cf20 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
1cf30 61 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65  aggregate before
1cf40 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1cf50 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e  * Or, if the con
1cf60 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72  ditions above ar
1cf70 65 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69  e not met, *ppMi
1cf80 6e 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30  nMax is set to 0
1cf90 20 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52   and.** WHERE_OR
1cfa0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20  DERBY_NORMAL is 
1cfb0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1cfc0 74 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65  tic u8 minMaxQue
1cfd0 72 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  ry(AggInfo *pAgg
1cfe0 49 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a  Info, ExprList *
1cff0 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e  *ppMinMax){.  in
1d000 74 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f  t eRet = WHERE_O
1d010 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20  RDERBY_NORMAL;  
1d020 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1d030 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70  n value */..  *p
1d040 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69  pMinMax = 0;.  i
1d050 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75  f( pAggInfo->nFu
1d060 6e 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70  nc==1 ){.    Exp
1d070 72 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49  r *pExpr = pAggI
1d080 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45  nfo->aFunc[0].pE
1d090 78 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74  xpr; /* Aggregat
1d0a0 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
1d0b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1d0c0 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
1d0d0 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67  ist;      /* Arg
1d0e0 75 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75  uments to agg fu
1d0f0 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61  nction */..    a
1d100 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
1d110 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  ==TK_AGG_FUNCTIO
1d120 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  N );.    if( pEL
1d130 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e  ist && pEList->n
1d140 45 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73  Expr==1 && pELis
1d150 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  t->a[0].pExpr->o
1d160 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
1d170 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1d180 63 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45  char *zFunc = pE
1d190 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
1d1a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1d1b0 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
1d1c0 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  min")==0 ){.    
1d1d0 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
1d1e0 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20  _ORDERBY_MIN;.  
1d1f0 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
1d200 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
1d210 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
1d220 33 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20  3StrICmp(zFunc, 
1d230 22 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "max")==0 ){.   
1d240 20 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52       eRet = WHER
1d250 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
1d260 20 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78         *ppMinMax
1d270 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20   = pEList;.     
1d280 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1d290 61 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61  assert( *ppMinMa
1d2a0 78 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d  x==0 || (*ppMinM
1d2b0 61 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b  ax)->nExpr==1 );
1d2c0 0a 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a  .  return eRet;.
1d2d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c  }../*.** The sel
1d2e0 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61  ect statement pa
1d2f0 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
1d300 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
1d310 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
1d320 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  ..** The second 
1d330 61 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61  argment is the a
1d340 73 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67  ssociated aggreg
1d350 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e  ate-info object.
1d360 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   This .** functi
1d370 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20  on tests if the 
1d380 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65  SELECT is of the
1d390 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53   form:.**.**   S
1d3a0 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1d3b0 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20  ROM <tbl>.**.** 
1d3c0 77 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61  where table is a
1d3d0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c   database table,
1d3e0 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63   not a sub-selec
1d3f0 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68  t or view. If th
1d400 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20  e query.** does 
1d410 6d 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65  match this patte
1d420 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  rn, then a point
1d430 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  er to the Table 
1d440 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74  object represent
1d450 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20  ing.** <tbl> is 
1d460 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1d470 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e  ise, 0 is return
1d480 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61  ed..*/.static Ta
1d490 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75  ble *isSimpleCou
1d4a0 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67  nt(Select *p, Ag
1d4b0 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
1d4c0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
1d4d0 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a  .  Expr *pExpr;.
1d4e0 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70  .  assert( !p->p
1d4f0 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66  GroupBy );..  if
1d500 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70  ( p->pWhere || p
1d510 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
1d520 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72  =1 .   || p->pSr
1d530 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d  c->nSrc!=1 || p-
1d540 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
1d550 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ect.  ){.    ret
1d560 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61  urn 0;.  }.  pTa
1d570 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30  b = p->pSrc->a[0
1d580 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20  ].pTab;.  pExpr 
1d590 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
1d5a0 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
1d5b0 74 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62  t( pTab && !pTab
1d5c0 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78  ->pSelect && pEx
1d5d0 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56  pr );..  if( IsV
1d5e0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72  irtual(pTab) ) r
1d5f0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
1d600 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
1d610 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75  _FUNCTION ) retu
1d620 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45  rn 0;.  if( NEVE
1d630 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  R(pAggInfo->nFun
1d640 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  c==0) ) return 0
1d650 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66  ;.  if( (pAggInf
1d660 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e  o->aFunc[0].pFun
1d670 63 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  c->funcFlags&SQL
1d680 49 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d  ITE_FUNC_COUNT)=
1d690 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1d6a0 20 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67   if( pExpr->flag
1d6b0 73 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20  s&EP_Distinct ) 
1d6c0 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
1d6d0 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a  urn pTab;.}../*.
1d6e0 2a 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65  ** If the source
1d6f0 2d 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65  -list item passe
1d700 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
1d710 20 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77   was augmented w
1d720 69 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45  ith an.** INDEXE
1d730 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  D BY clause, the
1d740 6e 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20  n try to locate 
1d750 74 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e  the specified in
1d760 64 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a  dex. If there.**
1d770 20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75   was such a clau
1d780 73 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64  se and the named
1d790 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65   index cannot be
1d7a0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a   found, return .
1d7b0 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  ** SQLITE_ERROR 
1d7c0 61 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72  and leave an err
1d7d0 6f 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74  or in pParse. Ot
1d7e0 68 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74  herwise, populat
1d7f0 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e  e .** pFrom->pIn
1d800 64 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53  dex and return S
1d810 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74  QLITE_OK..*/.int
1d820 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
1d830 79 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70  yLookup(Parse *p
1d840 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72  Parse, struct Sr
1d850 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
1d860 6d 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d  m){.  if( pFrom-
1d870 3e 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e  >pTab && pFrom->
1d880 7a 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61  zIndex ){.    Ta
1d890 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f  ble *pTab = pFro
1d8a0 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61  m->pTab;.    cha
1d8b0 72 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f  r *zIndex = pFro
1d8c0 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49  m->zIndex;.    I
1d8d0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
1d8e0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
1d8f0 49 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20  Index; .        
1d900 70 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53  pIdx && sqlite3S
1d910 74 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61  trICmp(pIdx->zNa
1d920 6d 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20  me, zIndex); .  
1d930 20 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d        pIdx=pIdx-
1d940 3e 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20  >pNext.    );.  
1d950 20 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20    if( !pIdx ){. 
1d960 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1d970 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
1d980 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22   such index: %s"
1d990 2c 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20  , zIndex, 0);.  
1d9a0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
1d9b0 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
1d9c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d9d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1d9e0 20 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20    pFrom->pIndex 
1d9f0 3d 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65  = pIdx;.  }.  re
1da00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1da10 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63  }./*.** Detect c
1da20 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
1da30 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75  tatements that u
1da40 73 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  se an ORDER BY c
1da50 6c 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61  lause with .** a
1da60 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  n alternative co
1da70 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1da80 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43  ..**.**    SELEC
1da90 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58  T ... FROM t1 EX
1daa0 43 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20  CEPT SELECT ... 
1dab0 46 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59  FROM t2 ORDER BY
1dac0 20 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a   .. COLLATE ....
1dad0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  **.** These are 
1dae0 72 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73  rewritten as a s
1daf0 75 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  ubquery:.**.**  
1db00 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
1db10 28 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d  (SELECT ... FROM
1db20 20 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43   t1 EXCEPT SELEC
1db30 54 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a  T ... FROM t2).*
1db40 2a 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e  *     ORDER BY .
1db50 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
1db60 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
1db70 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  ormation is nece
1db80 73 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68  ssary because th
1db90 65 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  e multiSelectOrd
1dba0 65 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a  erBy() routine.*
1dbb0 2a 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e  * above that gen
1dbc0 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
1dbd0 66 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53  for a compound S
1dbe0 45 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52  ELECT with an OR
1dbf0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a  DER BY clause.**
1dc00 20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c   uses a merge al
1dc10 67 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71  gorithm that req
1dc20 75 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63  uires the same c
1dc30 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1dc40 65 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75  e on the.** resu
1dc50 6c 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e  lt columns as on
1dc60 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1dc70 61 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65  ause.  See ticke
1dc80 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e  t.** http://www.
1dc90 73 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69  sqlite.org/src/i
1dca0 6e 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a  nfo/6709574d2a.*
1dcb0 2a 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66  *.** This transf
1dcc0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79  ormation is only
1dcd0 20 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45   needed for EXCE
1dce0 50 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61  PT, INTERSECT, a
1dcf0 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65  nd UNION..** The
1dd00 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1dd10 74 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77  tor works fine w
1dd20 69 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f  ith multiSelectO
1dd30 72 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68  rderBy() even wh
1dd40 65 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  en.** there are 
1dd50 43 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e  COLLATE terms in
1dd60 20 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a   the ORDER BY..*
1dd70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e  /.static int con
1dd80 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65  vertCompoundSele
1dd90 63 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c  ctToSubquery(Wal
1dda0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
1ddb0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20  lect *p){.  int 
1ddc0 69 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  i;.  Select *pNe
1ddd0 77 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b  w;.  Select *pX;
1dde0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1ddf0 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1de00 74 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63  t_item *a;.  Src
1de10 4c 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20  List *pNewSrc;. 
1de20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
1de30 20 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a    Token dummy;..
1de40 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d    if( p->pPrior=
1de50 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1de60 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20  Continue;.  if( 
1de70 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  p->pOrderBy==0 )
1de80 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1de90 69 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70  inue;.  for(pX=p
1dea0 3b 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d  ; pX && (pX->op=
1deb0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f  =TK_ALL || pX->o
1dec0 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70  p==TK_SELECT); p
1ded0 58 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a  X=pX->pPrior){}.
1dee0 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65    if( pX==0 ) re
1def0 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
1df00 65 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64  e;.  a = p->pOrd
1df10 65 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69  erBy->a;.  for(i
1df20 3d 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  =p->pOrderBy->nE
1df30 78 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  xpr-1; i>=0; i--
1df40 29 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e  ){.    if( a[i].
1df50 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
1df60 50 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61  P_Collate ) brea
1df70 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30  k;.  }.  if( i<0
1df80 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f   ) return WRC_Co
1df90 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66  ntinue;..  /* If
1dfa0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1dfb0 6f 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73  oint, that means
1dfc0 20 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74   the transformat
1dfd0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
1dfe0 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20   */..  pParse = 
1dff0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
1e000 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
1e010 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  db;.  pNew = sql
1e020 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1e030 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65  (db, sizeof(*pNe
1e040 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
1e050 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1e060 5f 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74  _Abort;.  memset
1e070 28 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65  (&dummy, 0, size
1e080 6f 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e  of(dummy));.  pN
1e090 65 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  ewSrc = sqlite3S
1e0a0 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
1e0b0 54 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c  Term(pParse,0,0,
1e0c0 30 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c  0,&dummy,pNew,0,
1e0d0 30 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72  0);.  if( pNewSr
1e0e0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52  c==0 ) return WR
1e0f0 43 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77  C_Abort;.  *pNew
1e100 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63   = *p;.  p->pSrc
1e110 20 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d   = pNewSrc;.  p-
1e120 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  >pEList = sqlite
1e130 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
1e140 70 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74  pParse, 0, sqlit
1e150 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c  e3Expr(db, TK_AL
1e160 4c 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20  L, 0));.  p->op 
1e170 3d 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70  = TK_SELECT;.  p
1e180 2d 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20  ->pWhere = 0;.  
1e190 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
1e1a0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76   0;.  pNew->pHav
1e1b0 69 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ing = 0;.  pNew-
1e1c0 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
1e1d0 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1e1e0 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
1e1f0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66   0;.  pNew->pOff
1e200 73 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  set = 0;.  retur
1e210 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
1e220 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1e230 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a  E_OMIT_CTE./*.**
1e240 20 41 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20   Argument pWith 
1e250 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55  (which may be NU
1e260 4c 4c 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  LL) points to a 
1e270 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e  linked list of n
1e280 65 73 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63  ested .** WITH c
1e290 6f 6e 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e  ontexts, from in
1e2a0 6e 65 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74  ner to outermost
1e2b0 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69  . If the table i
1e2c0 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a  dentified by .**
1e2d0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
1e2e0 6d 65 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65  ment pItem is re
1e2f0 61 6c 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61  ally a common-ta
1e300 62 6c 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28  ble-expression (
1e310 43 54 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65  CTE) .** then re
1e320 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1e330 6f 20 74 68 65 20 43 54 45 20 64 65 66 69 6e 69  o the CTE defini
1e340 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61  tion for that ta
1e350 62 6c 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a  ble. Otherwise.*
1e360 2a 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  * return NULL..*
1e370 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
1e380 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
1e390 57 69 74 68 20 2a 70 57 69 74 68 2c 20 73 74 72  With *pWith, str
1e3a0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e3b0 20 2a 70 49 74 65 6d 29 7b 0a 20 20 63 6f 6e 73   *pItem){.  cons
1e3c0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
1e3d0 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74   if( pItem->zDat
1e3e0 61 62 61 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61  abase==0 && (zNa
1e3f0 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  me = pItem->zNam
1e400 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 57 69 74  e)!=0 ){.    Wit
1e410 68 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  h *p;.    for(p=
1e420 70 57 69 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70  pWith; p; p=p->p
1e430 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69 6e  Outer){.      in
1e440 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
1e450 3d 30 3b 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69  =0; i<p->nCte; i
1e460 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1e470 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1e480 7a 4e 61 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a  zName, p->a[i].z
1e490 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
1e4a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d        return &p-
1e4b0 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  >a[i];.        }
1e4c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e4d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1e4e0 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65  ../* The code ge
1e4f0 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61 69 6e  nerator maintain
1e500 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61 63 74  s a stack of act
1e510 69 76 65 20 57 49 54 48 20 63 6c 61 75 73 65 73  ive WITH clauses
1e520 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 6e  .** with the inn
1e530 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  er-most WITH cla
1e540 75 73 65 20 62 65 69 6e 67 20 61 74 20 74 68 65  use being at the
1e550 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63   top of the stac
1e560 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  k..**.** These r
1e570 6f 75 74 69 6e 65 73 20 70 75 73 68 20 61 6e 64  outines push and
1e580 20 70 75 6c 6c 20 57 49 54 48 20 63 6c 61 75 73   pull WITH claus
1e590 65 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  es on the stack.
1e5a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e5b0 57 69 74 68 50 75 73 68 28 50 61 72 73 65 20 2a  WithPush(Parse *
1e5c0 70 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57  pParse, With *pW
1e5d0 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74  ith){.  if( pWit
1e5e0 68 20 29 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e  h ){.    pWith->
1e5f0 70 4f 75 74 65 72 20 3d 20 70 50 61 72 73 65 2d  pOuter = pParse-
1e600 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50 61 72  >pWith;.    pPar
1e610 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
1e620 68 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h;.  }.}../*.** 
1e630 49 66 20 61 72 67 75 6d 65 6e 74 20 70 43 74 65  If argument pCte
1e640 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 63 68   is not NULL, ch
1e650 65 63 6b 20 69 66 20 69 74 20 69 73 20 61 6c 72  eck if it is alr
1e660 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
1e670 68 65 0a 2a 2a 20 73 74 61 63 6b 20 6f 66 20 43  he.** stack of C
1e680 54 45 73 20 73 74 6f 72 65 64 20 62 79 20 74 68  TEs stored by th
1e690 65 20 70 61 72 73 65 72 2e 20 49 66 20 73 6f 2c  e parser. If so,
1e6a0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
1e6b0 61 6e 20 69 6c 6c 65 67 61 6c 0a 2a 2a 20 72 65  an illegal.** re
1e6c0 63 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63  cursive referenc
1e6d0 65 20 69 6e 20 61 20 43 54 45 2c 20 73 65 74 20  e in a CTE, set 
1e6e0 6f 66 20 6d 75 74 75 61 6c 6c 79 20 72 65 63 75  of mutually recu
1e6f0 72 73 69 76 65 20 43 54 45 73 2e 20 53 74 6f 72  rsive CTEs. Stor
1e700 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 69 6e  e.** an error in
1e710 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20   the parser and 
1e720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1e730 52 4f 52 20 69 66 20 74 68 69 73 20 69 73 20 74  ROR if this is t
1e740 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f  he case..**.** O
1e750 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 74  therwise, if pCt
1e760 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
1e770 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 74 61   part of the sta
1e780 63 6b 20 6f 66 20 43 54 45 73 20 73 74 6f 72 65  ck of CTEs store
1e790 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 72 73  d.** in the pars
1e7a0 65 72 2c 20 70 75 73 68 20 69 74 20 6f 6e 74 6f  er, push it onto
1e7b0 20 74 68 65 20 73 74 6f 70 20 6f 66 20 74 68 61   the stop of tha
1e7c0 74 20 73 74 61 63 6b 2e 0a 2a 2f 20 0a 73 74 61  t stack..*/ .sta
1e7d0 74 69 63 20 69 6e 74 20 63 74 65 50 75 73 68 28  tic int ctePush(
1e7e0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
1e7f0 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 29  truct Cte *pCte)
1e800 7b 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b 0a  {.  if( pCte ){.
1e810 20 20 20 20 73 74 72 75 63 74 20 43 74 65 20 2a      struct Cte *
1e820 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
1e830 72 73 65 2d 3e 70 43 74 65 3b 20 70 3b 20 70 3d  rse->pCte; p; p=
1e840 70 2d 3e 70 4f 75 74 65 72 43 74 65 29 7b 0a 20  p->pOuterCte){. 
1e850 20 20 20 20 20 69 66 28 20 70 3d 3d 70 43 74 65       if( p==pCte
1e860 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1e870 74 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20  te3ErrorMsg(.   
1e880 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c           pParse,
1e890 20 22 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73   "illegal recurs
1e8a0 69 76 65 20 64 65 66 69 6e 69 6e 69 74 69 6f 6e  ive defininition
1e8b0 20 69 6e 20 63 74 65 3a 20 25 73 22 2c 20 70 43   in cte: %s", pC
1e8c0 74 65 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  te->zName.      
1e8d0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74    );.        ret
1e8e0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1e8f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e900 20 20 20 20 0a 20 20 20 20 70 43 74 65 2d 3e 70      .    pCte->p
1e910 4f 75 74 65 72 43 74 65 20 3d 20 70 50 61 72 73  OuterCte = pPars
1e920 65 2d 3e 70 43 74 65 3b 0a 20 20 20 20 70 50 61  e->pCte;.    pPa
1e930 72 73 65 2d 3e 70 43 74 65 20 3d 20 70 43 74 65  rse->pCte = pCte
1e940 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1e950 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  QLITE_OK;.}./*.*
1e960 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 70 43  * If argument pC
1e970 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  te is not NULL, 
1e980 69 74 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  it must be a poi
1e990 6e 74 65 72 20 74 6f 20 74 68 65 20 43 54 45 20  nter to the CTE 
1e9a0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 20  currently.** on 
1e9b0 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
1e9c0 20 6f 66 20 43 54 45 73 20 73 74 6f 72 65 64 20   of CTEs stored 
1e9d0 69 6e 20 74 68 65 20 70 61 72 73 65 72 2e 20 52  in the parser. R
1e9e0 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
1e9f0 61 74 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a  at.** stack..*/.
1ea00 73 74 61 74 69 63 20 76 6f 69 64 20 63 74 65 50  static void cteP
1ea10 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  op(Parse *pParse
1ea20 2c 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43  , struct Cte *pC
1ea30 74 65 29 7b 0a 20 20 69 66 28 20 70 43 74 65 20  te){.  if( pCte 
1ea40 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ea50 50 61 72 73 65 2d 3e 70 43 74 65 3d 3d 70 43 74  Parse->pCte==pCt
1ea60 65 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  e );.    pParse-
1ea70 3e 70 43 74 65 20 3d 20 70 43 74 65 2d 3e 70 4f  >pCte = pCte->pO
1ea80 75 74 65 72 43 74 65 3b 0a 20 20 7d 0a 7d 0a 0a  uterCte;.  }.}..
1ea90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1eaa0 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61 72  ion checks if ar
1eab0 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65 66  gument pFrom ref
1eac0 65 72 73 20 74 6f 20 61 20 43 54 45 20 64 65 63  ers to a CTE dec
1ead0 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20 57  lared by .** a W
1eae0 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ITH clause on th
1eaf0 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74 6c  e stack currentl
1eb00 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  y maintained by 
1eb10 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64 2c  the parser. And,
1eb20 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c 79  .** if currently
1eb30 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43 54   processing a CT
1eb40 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69 66  E expression, if
1eb50 20 69 74 20 69 73 20 61 20 72 65 63 75 72 73 69   it is a recursi
1eb60 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ve.** reference 
1eb70 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 43  to the current C
1eb80 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72  TE..**.** If pFr
1eb90 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65 69  om falls into ei
1eba0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
1ebb0 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76 65  categories above
1ebc0 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a 2a  , pFrom->pTab.**
1ebd0 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c 64   and other field
1ebe0 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20  s are populated 
1ebf0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68 65  accordingly. The
1ec00 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63   caller should c
1ec10 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d 3e  heck.** (pFrom->
1ec20 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74 65  pTab!=0) to dete
1ec30 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
1ec40 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66 75   not a successfu
1ec50 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20 66  l match.** was f
1ec60 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ound..**.** Whet
1ec70 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61 74  her or not a mat
1ec80 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51 4c  ch is found, SQL
1ec90 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1eca0 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a 2a  ed if no error.*
1ecb0 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e 20  * occurs. If an 
1ecc0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
1ecd0 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
1ece0 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
1ecf0 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61 6e  the.** parser an
1ed00 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f 64  d some error cod
1ed10 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c  e other than SQL
1ed20 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
1ed30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1ed40 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61 6c  ithExpand(.  Wal
1ed50 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a 20  ker *pWalker, . 
1ed60 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1ed70 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a 20  item *pFrom.){. 
1ed80 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
1ed90 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
1eda0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b  pWalker->pParse;
1edb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1edc0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
1edd0 74 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 3b  truct Cte *pCte;
1ede0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f  ..  assert( pFro
1edf0 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a 20  m->pTab==0 );.. 
1ee00 20 70 43 74 65 20 3d 20 73 65 61 72 63 68 57 69   pCte = searchWi
1ee10 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74 68  th(pParse->pWith
1ee20 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 69 66 28 20  , pFrom);.  if( 
1ee30 70 43 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pCte==0 ){.    /
1ee40 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 7d 65 6c  * no-op */.  }el
1ee50 73 65 20 69 66 28 20 70 43 74 65 3d 3d 70 50 61  se if( pCte==pPa
1ee60 72 73 65 2d 3e 70 43 74 65 20 26 26 20 28 70 54  rse->pCte && (pT
1ee70 61 62 20 3d 20 70 43 74 65 2d 3e 70 54 61 62 29  ab = pCte->pTab)
1ee80 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1ee90 69 73 20 74 68 65 20 72 65 63 75 72 73 69 76 65  is the recursive
1eea0 20 70 61 72 74 20 6f 66 20 61 20 72 65 63 75 72   part of a recur
1eeb0 73 69 76 65 20 43 54 45 20 2a 2f 0a 20 20 20 20  sive CTE */.    
1eec0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
1eed0 54 61 62 3d 3d 30 20 26 26 20 70 46 72 6f 6d 2d  Tab==0 && pFrom-
1eee0 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30 20  >isRecursive==0 
1eef0 26 26 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  && pFrom->pSelec
1ef00 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 72 6f  t==0 );.    pFro
1ef10 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  m->pTab = pTab;.
1ef20 20 20 20 20 70 46 72 6f 6d 2d 3e 69 73 52 65 63      pFrom->isRec
1ef30 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20  ursive = 1;.    
1ef40 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  pTab->nRef++;.  
1ef50 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70 72 4c  }else{.    ExprL
1ef60 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
1ef70 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
1ef80 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74     Select *pLeft
1ef90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1efa0 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45   /* Left-most SE
1efb0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
1efc0 2f 0a 20 20 20 20 69 6e 74 20 62 52 65 63 75 72  /.    int bRecur
1efd0 73 69 76 65 3b 0a 0a 20 20 20 20 70 46 72 6f 6d  sive;..    pFrom
1efe0 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20  ->pTab = pTab = 
1eff0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1f000 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
1f010 61 62 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20  able));.    if( 
1f020 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  pTab==0 ) return
1f030 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1f040 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
1f050 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20      pTab->zName 
1f060 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1f070 28 64 62 2c 20 22 25 73 22 2c 20 70 43 74 65 2d  (db, "%s", pCte-
1f080 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61  >zName);.    pTa
1f090 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
1f0a0 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74     pTab->nRowEst
1f0b0 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 20 20   = 1048576;.    
1f0c0 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
1f0d0 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a  = TF_Ephemeral;.
1f0e0 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65      pFrom->pSele
1f0f0 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
1f100 63 74 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e  ctDup(db, pCte->
1f110 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
1f120 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1f130 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53  ailed ) return S
1f140 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1f150 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e   assert( pFrom->
1f160 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20  pSelect );..    
1f170 69 66 28 20 63 74 65 50 75 73 68 28 70 50 61 72  if( ctePush(pPar
1f180 73 65 2c 20 70 43 74 65 29 20 29 20 72 65 74 75  se, pCte) ) retu
1f190 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
1f1a0 20 20 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e    pSel = pFrom->
1f1b0 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 62 52 65  pSelect;.    bRe
1f1c0 63 75 72 73 69 76 65 20 3d 20 28 70 53 65 6c 2d  cursive = (pSel-
1f1d0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
1f1e0 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  Sel->op==TK_UNIO
1f1f0 4e 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 63  N);.    if( bRec
1f200 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
1f210 61 73 73 65 72 74 28 20 70 53 65 6c 2d 3e 70 50  assert( pSel->pP
1f220 72 69 6f 72 20 29 3b 0a 20 20 20 20 20 20 73 71  rior );.      sq
1f230 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
1f240 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 2d 3e 70  pWalker, pSel->p
1f250 50 72 69 6f 72 29 3b 0a 20 20 20 20 7d 65 6c 73  Prior);.    }els
1f260 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
1f270 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
1f280 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  er, pSel);.    }
1f290 0a 0a 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d  ..    for(pLeft=
1f2a0 70 53 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72  pSel; pLeft->pPr
1f2b0 69 6f 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74  ior; pLeft=pLeft
1f2c0 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70  ->pPrior);.    p
1f2d0 45 4c 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70  EList = pLeft->p
1f2e0 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  EList;.    if( p
1f2f0 43 74 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20  Cte->pCols ){.  
1f300 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e      if( pEList->
1f310 6e 45 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f  nExpr!=pCte->pCo
1f320 6c 73 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  ls->nExpr ){.   
1f330 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1f340 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 74  rMsg(pParse, "ct
1f350 65 20 5c 22 25 73 5c 22 20 72 65 74 75 72 6e 73  e \"%s\" returns
1f360 20 25 64 20 76 61 6c 75 65 73 20 66 6f 72 20 25   %d values for %
1f370 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20 20 20 20  d columns",.    
1f380 20 20 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 4e          pCte->zN
1f390 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ame, pEList->nEx
1f3a0 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d  pr, pCte->pCols-
1f3b0 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 20 20 29  >nExpr.        )
1f3c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f3d0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
1f3e0 20 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74    }.      pEList
1f3f0 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a   = pCte->pCols;.
1f400 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63      }..    selec
1f410 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
1f420 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
1f430 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
1f440 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
1f450 0a 20 20 20 20 69 66 28 20 62 52 65 63 75 72 73  .    if( bRecurs
1f460 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ive ){.      int
1f470 20 6e 52 65 66 20 3d 20 70 54 61 62 2d 3e 6e 52   nRef = pTab->nR
1f480 65 66 3b 0a 20 20 20 20 20 20 70 43 74 65 2d 3e  ef;.      pCte->
1f490 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20  pTab = pTab;.   
1f4a0 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
1f4b0 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  lect(pWalker, pS
1f4c0 65 6c 29 3b 0a 20 20 20 20 20 20 70 43 74 65 2d  el);.      pCte-
1f4d0 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  >pTab = 0;.     
1f4e0 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 20   if( pTab->nRef 
1f4f0 3e 20 6e 52 65 66 29 7b 0a 20 20 20 20 20 20 20  > nRef){.       
1f500 20 70 53 65 6c 2d 3e 70 52 65 63 75 72 73 65 20   pSel->pRecurse 
1f510 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
1f520 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 74 6e  assert( pTab->tn
1f530 75 6d 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  um==0 );.      }
1f540 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 65 50  .    }..    cteP
1f550 6f 70 28 70 50 61 72 73 65 2c 20 70 43 74 65 29  op(pParse, pCte)
1f560 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1f570 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
1f580 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
1f590 72 6f 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c  routine is a Wal
1f5a0 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ker callback for
1f5b0 20 22 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53   "expanding" a S
1f5c0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1f5d0 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20  .** "Expanding" 
1f5e0 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20  means to do the 
1f5f0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
1f600 20 20 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75      (1)  Make su
1f610 72 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  re VDBE cursor n
1f620 75 6d 62 65 72 73 20 68 61 76 65 20 62 65 65 6e  umbers have been
1f630 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65   assigned to eve
1f640 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c  ry.**         el
1f650 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ement of the FRO
1f660 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  M clause..**.** 
1f670 20 20 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20     (2)  Fill in 
1f680 74 68 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  the pTabList->a[
1f690 5d 2e 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e  ].pTab fields in
1f6a0 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
1f6b0 74 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65  t .**         de
1f6c0 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73  fines FROM claus
1f6d0 65 2e 20 20 57 68 65 6e 20 76 69 65 77 73 20 61  e.  When views a
1f6e0 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
1f6f0 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20  M clause,.**    
1f700 20 20 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69       fill pTabLi
1f710 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20  st->a[].pSelect 
1f720 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
1f730 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
1f740 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74  ent.**         t
1f750 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
1f760 68 65 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79  he view.  A copy
1f770 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20   is made of the 
1f780 76 69 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a  view's SELECT.**
1f790 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
1f7a0 6e 74 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  nt so that we ca
1f7b0 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20  n freely modify 
1f7c0 6f 72 20 64 65 6c 65 74 65 20 74 68 61 74 20 73  or delete that s
1f7d0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20  tatement.**     
1f7e0 20 20 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72      without worr
1f7f0 79 69 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69  ying about messi
1f800 6e 67 20 75 70 20 74 68 65 20 70 72 65 73 69 73  ng up the presis
1f810 74 65 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74  tent representat
1f820 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f  ion.**         o
1f830 66 20 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a  f the view..**.*
1f840 2a 20 20 20 20 28 33 29 20 20 41 64 64 20 74 65  *    (3)  Add te
1f850 72 6d 73 20 74 6f 20 74 68 65 20 57 48 45 52 45  rms to the WHERE
1f860 20 63 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d   clause to accom
1f870 6f 64 61 74 65 20 74 68 65 20 4e 41 54 55 52 41  odate the NATURA
1f880 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20  L keyword.**    
1f890 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e       on joins an
1f8a0 64 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49  d the ON and USI
1f8b0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69  NG clause of joi
1f8c0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29  ns..**.**    (4)
1f8d0 20 20 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20    Scan the list 
1f8e0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
1f8f0 65 20 72 65 73 75 6c 74 20 73 65 74 20 28 70 45  e result set (pE
1f900 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a  List) looking.**
1f910 20 20 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73           for ins
1f920 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a  tances of the "*
1f930 22 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68  " operator or th
1f940 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74  e TABLE.* operat
1f950 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49  or..**         I
1f960 66 20 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20  f found, expand 
1f970 65 61 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65  each "*" to be e
1f980 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65  very column in e
1f990 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20  very table.**   
1f9a0 20 20 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e        and TABLE.
1f9b0 2a 20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f  * to be every co
1f9c0 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a  lumn in TABLE..*
1f9d0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
1f9e0 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57  selectExpander(W
1f9f0 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
1fa00 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61  Select *p){.  Pa
1fa10 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1fa20 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
1fa30 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20   int i, j, k;.  
1fa40 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1fa50 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
1fa60 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
1fa70 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
1fa80 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  rom;.  sqlite3 *
1fa90 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1faa0 0a 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52  .  Expr *pE, *pR
1fab0 69 67 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20  ight, *pExpr;.  
1fac0 75 31 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70  u16 selFlags = p
1fad0 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70  ->selFlags;..  p
1fae0 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
1faf0 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28  _Expanded;.  if(
1fb00 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1fb10 64 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  d  ){.    return
1fb20 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
1fb30 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70    if( NEVER(p->p
1fb40 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46  Src==0) || (selF
1fb50 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
1fb60 65 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ed)!=0 ){.    re
1fb70 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
1fb80 20 20 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d    }.  pTabList =
1fb90 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69   p->pSrc;.  pELi
1fba0 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
1fbb0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1fbc0 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68  cursor numbers h
1fbd0 61 76 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65  ave been assigne
1fbe0 64 20 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73  d to all entries
1fbf0 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f   in.  ** the FRO
1fc00 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1fc10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1fc20 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1fc30 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
1fc40 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 54 61  sors(pParse, pTa
1fc50 62 4c 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  bList);..  /* Lo
1fc60 6f 6b 20 75 70 20 65 76 65 72 79 20 74 61 62 6c  ok up every tabl
1fc70 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
1fc80 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ROM clause of th
1fc90 65 20 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20  e select.  If.  
1fca0 2a 2a 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  ** an entry of t
1fcb0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1fcc0 73 20 61 20 73 75 62 71 75 65 72 79 20 69 6e 73  s a subquery ins
1fcd0 74 65 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20  tead of a table 
1fce0 6f 72 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68  or view,.  ** th
1fcf0 65 6e 20 63 72 65 61 74 65 20 61 20 74 72 61 6e  en create a tran
1fd00 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1fd10 63 74 75 72 65 20 74 6f 20 64 65 73 63 72 69 62  cture to describ
1fd20 65 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  e the subquery..
1fd30 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20    */.  for(i=0, 
1fd40 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
1fd50 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
1fd60 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
1fd70 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
1fd80 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 46 72  Tab;.    if( pFr
1fd90 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
1fda0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
1fdb0 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
1fdc0 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
1fdd0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
1fde0 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
1fdf0 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
1fe00 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
1fe10 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1fe20 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
1fe30 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1fe40 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69  E_OMIT_CTE.    i
1fe50 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57  f( withExpand(pW
1fe60 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20  alker, pFrom) ) 
1fe70 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1fe80 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
1fe90 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a  >pTab ) {} else.
1fea0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
1feb0 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
1fec0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1fed0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1fee0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
1fef0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
1ff00 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
1ff10 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
1ff20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1ff30 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
1ff40 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
1ff50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ff60 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
1ff70 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1ff80 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
1ff90 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
1ffa0 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
1ffb0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
1ffc0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1ffd0 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
1ffe0 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
1fff0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
20000 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
20010 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
20020 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
20030 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
20040 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22  , "sqlite_sq_%p"
20050 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
20060 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
20070 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
20080 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
20090 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74  ; }.      select
200a0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
200b0 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
200c0 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
200d0 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
200e0 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
200f0 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
20100 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74     pTab->nRowEst
20110 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 20 20   = 1048576;.    
20120 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
20130 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
20140 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
20150 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
20160 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
20170 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
20180 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
20190 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
201a0 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
201b0 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
201c0 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
201d0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
201e0 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70  tem(pParse, 0, p
201f0 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  From);.      if(
20200 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
20210 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
20220 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65     if( pTab->nRe
20230 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20  f==0xffff ){.   
20240 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
20250 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
20260 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65  o many reference
20270 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78  s to \"%s\": max
20280 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20   65535",.       
20290 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
202a0 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
202b0 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  >pTab = 0;.     
202c0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
202d0 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
202e0 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
202f0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
20300 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
20310 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
20320 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
20330 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
20340 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c   pTab->pSelect |
20350 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  | IsVirtual(pTab
20360 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
20370 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66  We reach here if
20380 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
20390 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76   is a really a v
203a0 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  iew */.        i
203b0 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
203c0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
203d0 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
203e0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
203f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
20400 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
20410 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
20420 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
20430 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
20440 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
20450 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
20460 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
20470 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
20480 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
20490 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
204a0 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
204b0 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
204c0 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
204d0 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
204e0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
204f0 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
20500 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
20510 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
20520 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
20530 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
20540 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
20550 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
20560 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
20570 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
20580 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
20590 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
205a0 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
205b0 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
205c0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
205d0 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
205e0 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
205f0 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
20600 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
20610 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
20620 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
20630 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
20640 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
20650 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
20660 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
20670 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
20680 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
20690 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
206a0 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
206b0 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
206c0 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
206d0 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
206e0 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
206f0 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
20700 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
20710 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
20720 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
20730 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
20740 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
20750 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
20760 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
20770 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
20780 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
20790 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
207a0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
207b0 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
207c0 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
207d0 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
207e0 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
207f0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
20800 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20   k++){.    pE = 
20810 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
20820 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
20830 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
20840 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
20850 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
20860 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
20870 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20880 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
20890 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
208a0 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
208b0 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
208c0 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
208d0 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
208e0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
208f0 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
20900 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
20910 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
20920 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
20930 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
20940 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
20950 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
20960 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
20970 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
20980 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
20990 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
209a0 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
209b0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
209c0 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
209d0 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
209e0 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
209f0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
20a00 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
20a10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
20a20 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
20a30 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
20a40 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
20a50 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
20a60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
20a70 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a90 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
20aa0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
20ab0 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f  ames)==0;..    /
20ac0 2a 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  * When processin
20ad0 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  g FROM-clause su
20ae0 62 71 75 65 72 69 65 73 2c 20 69 74 20 69 73 20  bqueries, it is 
20af0 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
20b00 20 20 20 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c      ** that full
20b10 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46  _column_names=OF
20b20 46 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75  F and short_colu
20b30 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68  mn_names=ON.  Th
20b40 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
20b50 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
20b60 74 28 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  t() routine make
20b70 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20  s it so. */.    
20b80 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
20b90 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
20ba0 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20  From)==0.       
20bb0 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 20 26 20     || ((flags & 
20bc0 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
20bd0 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  mes)==0 &&.     
20be0 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73 20           (flags 
20bf0 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
20c00 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a  lNames)!=0) );..
20c10 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
20c20 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
20c30 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
20c40 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
20c50 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52   pRight = pE->pR
20c60 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
20c70 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
20c80 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20  OT || pRight!=0 
20c90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
20ca0 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28  >op!=TK_ALL && (
20cb0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
20cc0 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
20cd0 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
20ce0 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
20cf0 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
20d00 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
20d10 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
20d20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
20d30 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
20d40 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
20d50 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
20d60 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
20d70 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
20d80 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
20d90 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
20da0 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
20db0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
20dc0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
20dd0 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
20de0 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
20df0 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
20e00 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
20e10 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
20e20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
20e30 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
20e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20e50 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
20e60 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
20e70 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
20e80 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
20e90 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
20ea0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
20eb0 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
20ec0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
20ed0 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
20ee0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
20ef0 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
20f00 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
20f10 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
20f20 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
20f30 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
20f40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
20f50 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
20f60 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
20f70 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
20f80 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
20f90 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
20fa0 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
20fb0 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
20fc0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
20fd0 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
20fe0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
20ff0 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
21000 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
21010 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
21020 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
21030 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
21040 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
21050 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
21060 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
21070 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
21080 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
21090 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
210a0 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
210b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
210c0 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
210d0 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
210e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
210f0 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
21100 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
21110 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21120 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
21130 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
21140 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
21150 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
21160 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
21170 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
21180 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
21190 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
211a0 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
211b0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
211c0 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
211d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
211e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
211f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21200 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
21210 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
21220 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
21230 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
21240 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
21250 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
21260 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a  [iDb].zName : "*
21270 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
21280 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
21290 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
212a0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
212b0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
212c0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
212d0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
212e0 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
212f0 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
21300 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
21310 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
21320 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
21330 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
21340 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
21350 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
21360 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
21370 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
21380 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
21390 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
213a0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
213b0 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  t( zName );.    
213c0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
213d0 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20  me && pSub.     
213e0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
213f0 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
21400 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
21410 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e  j].zSpan, 0, zTN
21420 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  ame, 0)==0.     
21430 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
21440 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
21450 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
21460 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
21470 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
21480 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
21490 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  ' (currently onl
214a0 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  y possible.     
214b0 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69         ** for vi
214c0 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64  rtual tables), d
214d0 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74  o not include it
214e0 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64   in the expanded
214f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21500 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e  result-set list.
21510 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
21520 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21530 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
21540 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29  pTab->aCol[j]) )
21550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21560 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c  assert(IsVirtual
21570 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20  (pTab));.       
21580 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
21590 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
215a0 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
215b0 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
215c0 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
215d0 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
215e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
215f0 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70   (pFrom->jointyp
21600 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
21610 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
21620 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
21630 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
21640 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
21650 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
21660 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
21670 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
21680 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
21690 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
216a0 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
216b0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
216c0 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
216d0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
216e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21700 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21710 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
21720 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
21730 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
21740 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
21750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
21760 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
21770 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
21780 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
21790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
217a0 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
217b0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
217c0 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
217d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
217e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
217f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21800 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21810 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
21820 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
21830 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
21840 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
21850 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
21860 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
21870 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
21880 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
21890 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
218a0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
218b0 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
218c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
218d0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
218e0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
218f0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
21900 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
21910 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
21920 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
21930 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
21940 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21950 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
21970 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
21980 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
21990 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
219a0 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
219b0 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
219c0 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
219d0 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30   pLeft, pExpr, 0
219e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
219f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
21a00 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
21a10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21a20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
21a30 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
21a40 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
21a50 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
21a60 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
21a70 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
21a90 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
21aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21ab0 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21ad0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
21ae0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
21af0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
21b00 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
21b10 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
21b20 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  e.z = zColname;.
21b30 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
21b40 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33  name.n = sqlite3
21b50 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d  Strlen30(zColnam
21b60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
21b70 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
21b80 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
21b90 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20  New, &sColname, 
21ba0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
21bb0 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e  if( pNew && (p->
21bc0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
21bd0 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a  stedFrom)!=0 ){.
21be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
21bf0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
21c00 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e  em *pX = &pNew->
21c10 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
21c20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
21c30 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20  if( pSub ){.    
21c40 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
21c50 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
21c60 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62  bStrDup(db, pSub
21c70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
21c80 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Span);.         
21c90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
21ca0 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
21cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
21cc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21cd0 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
21ce0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
21cf0 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c  (db, "%s.%s.%s",
21d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
21d30 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  emaName, zTabNam
21d40 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
21d60 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
21d70 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
21d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21d90 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49        pX->bSpanI
21da0 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  sTab = 1;.      
21db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21dc0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21dd0 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a  e(db, zToFree);.
21de0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21df0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
21e00 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
21e10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
21e20 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
21e30 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
21e40 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
21e50 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
21e60 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
21e70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21e80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
21e90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
21ea0 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
21eb0 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
21ec0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
21ed0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
21ee0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
21ef0 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29  lete(db, pEList)
21f00 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
21f10 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20  = pNew;.  }.#if 
21f20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
21f30 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  N.  if( p->pELis
21f40 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  t && p->pEList->
21f50 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
21f60 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
21f70 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
21f80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
21f90 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
21fa0 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
21fb0 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64   set");.  }.#end
21fc0 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  if.  return WRC_
21fd0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
21fe0 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 28 6f 72 20  ** Function (or 
21ff0 6d 61 63 72 6f 29 20 73 65 6c 65 63 74 45 78 70  macro) selectExp
22000 61 6e 64 65 72 57 69 74 68 20 69 73 20 75 73 65  anderWith is use
22010 64 20 61 73 20 74 68 65 20 53 45 4c 45 43 54 20  d as the SELECT 
22020 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 62 79 20 73  callback.** by s
22030 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
22040 6e 64 28 29 2e 20 49 6e 20 62 75 69 6c 64 73 20  nd(). In builds 
22050 74 68 61 74 20 64 6f 20 6e 6f 74 20 73 75 70 70  that do not supp
22060 6f 72 74 20 43 54 45 73 2c 20 74 68 69 73 0a 2a  ort CTEs, this.*
22070 2a 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  * is equivalent 
22080 74 6f 20 74 68 65 20 73 65 6c 65 63 74 45 78 70  to the selectExp
22090 61 6e 64 65 72 28 29 20 66 75 6e 63 74 69 6f 6e  ander() function
220a0 2e 20 49 6e 20 43 54 45 2d 65 6e 61 62 6c 65 64  . In CTE-enabled
220b0 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 61 6e 79 20   builds,.** any 
220c0 57 49 54 48 20 63 6c 61 75 73 65 20 61 73 73 6f  WITH clause asso
220d0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
220e0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
220f0 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 2a 2a 20   needs to be.** 
22100 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20  pushed onto the 
22110 73 74 61 63 6b 20 62 65 66 6f 72 65 20 63 61 6c  stack before cal
22120 6c 69 6e 67 20 73 65 6c 65 63 74 45 78 70 61 6e  ling selectExpan
22130 64 65 72 28 29 2c 20 61 6e 64 20 70 6f 70 70 65  der(), and poppe
22140 64 0a 2a 2a 20 6f 66 66 20 61 67 61 69 6e 20 61  d.** off again a
22150 66 74 65 72 77 61 72 64 73 2e 20 0a 2a 2f 0a 23  fterwards. .*/.#
22160 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22170 49 54 5f 43 54 45 0a 73 74 61 74 69 63 20 69 6e  IT_CTE.static in
22180 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72  t selectExpander
22190 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61  With(Walker *pWa
221a0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
221b0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
221c0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
221d0 72 73 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  rse;.  int res;.
221e0 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73    sqlite3WithPus
221f0 68 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 57 69  h(pParse, p->pWi
22200 74 68 29 3b 0a 20 20 72 65 73 20 3d 20 73 65 6c  th);.  res = sel
22210 65 63 74 45 78 70 61 6e 64 65 72 28 70 57 61 6c  ectExpander(pWal
22220 6b 65 72 2c 20 70 29 3b 0a 20 20 69 66 28 20 70  ker, p);.  if( p
22230 2d 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20 61  ->pWith ){.    a
22240 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
22250 57 69 74 68 3d 3d 70 2d 3e 70 57 69 74 68 20 29  With==p->pWith )
22260 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
22270 69 74 68 20 3d 20 70 2d 3e 70 57 69 74 68 2d 3e  ith = p->pWith->
22280 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 20 20 72 65  pOuter;.  }.  re
22290 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65 6c 73  turn res;.}.#els
222a0 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63 74  e.#define select
222b0 45 78 70 61 6e 64 65 72 57 69 74 68 20 73 65 6c  ExpanderWith sel
222c0 65 63 74 45 78 70 61 6e 64 65 72 0a 23 65 6e 64  ectExpander.#end
222d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20  if../*.** No-op 
222e0 72 6f 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20  routine for the 
222f0 70 61 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65  parse-tree walke
22300 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  r..**.** When th
22310 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
22320 65 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61  e Walker.xExprCa
22330 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72  llback then expr
22340 65 73 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20  ession trees.** 
22350 61 72 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f  are walked witho
22360 75 74 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62  ut any actions b
22370 65 69 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61  eing taken at ea
22380 63 68 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d  ch node.  Presum
22390 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68  ably,.** when th
223a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
223b0 65 64 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45  ed for Walker.xE
223c0 78 70 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e  xprCallback then
223d0 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c   .** Walker.xSel
223e0 65 63 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73  ectCallback is s
223f0 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69  et to do somethi
22400 6e 67 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76  ng useful for ev
22410 65 72 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79  ery .** subquery
22420 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 74   in the parser t
22430 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
22440 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28  nt exprWalkNoop(
22450 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c  Walker *NotUsed,
22460 20 45 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29   Expr *NotUsed2)
22470 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
22480 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
22490 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
224a0 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
224b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
224c0 6f 75 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22  outine "expands"
224d0 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
224e0 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ent and all of i
224f0 74 73 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a  ts subqueries..*
22500 2a 20 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * For additional
22510 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
22520 77 68 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f  what it means to
22530 20 22 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45   "expand" a SELE
22540 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c  CT.** statement,
22550 20 73 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74   see the comment
22560 20 6f 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78   on the selectEx
22570 70 61 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c  pand worker call
22580 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a  back above..**.*
22590 2a 20 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45  * Expanding a SE
225a0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
225b0 73 20 74 68 65 20 66 69 72 73 74 20 73 74 65 70  s the first step
225c0 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61   in processing a
225d0 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
225e0 6d 65 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43  ment.  The SELEC
225f0 54 20 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74  T statement must
22600 20 62 65 20 65 78 70 61 6e 64 65 64 20 62 65 66   be expanded bef
22610 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  ore.** name reso
22620 6c 75 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72  lution is perfor
22630 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  med..**.** If an
22640 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
22650 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  g, an error mess
22660 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
22670 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54  nto pParse..** T
22680 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
22690 69 6f 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74  ion can detect t
226a0 68 65 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f  he problem by lo
226b0 6f 6b 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d  oking at pParse-
226c0 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20  >nErr.** and/or 
226d0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
226e0 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61  ocFailed..*/.sta
226f0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
22700 53 65 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72  SelectExpand(Par
22710 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
22720 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20  ct *pSelect){.  
22730 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73  Walker w;.  mems
22740 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
22750 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
22760 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61  allback = exprWa
22770 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72  lkNoop;.  w.pPar
22780 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69  se = pParse;.  i
22790 66 28 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f  f( pParse->hasCo
227a0 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e  mpound ){.    w.
227b0 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
227c0 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e  = convertCompoun
227d0 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72  dSelectToSubquer
227e0 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  y;.    sqlite3Wa
227f0 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
22800 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78  lect);.  }.  w.x
22810 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
22820 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 57   selectExpanderW
22830 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ith;.  sqlite3Wa
22840 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
22850 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  lect);.}...#ifnd
22860 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
22870 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
22880 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78  is is a Walker.x
22890 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63  SelectCallback c
228a0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
228b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70  sqlite3SelectTyp
228c0 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72  eInfo().** inter
228d0 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  face..**.** For 
228e0 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65  each FROM-clause
228f0 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43   subquery, add C
22900 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20  olumn.zType and 
22910 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20  Column.zColl.** 
22920 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
22930 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
22940 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
22950 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
22960 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62  t.** of that sub
22970 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
22980 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
22990 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
229a0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
229b0 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
229c0 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61  ** by selectExpa
229d0 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74  nder() but the t
229e0 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
229f0 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61  n information wa
22a00 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20  s omitted.** at 
22a10 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75  that point becau
22a20 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68  se identifiers h
22a30 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ad not yet been 
22a40 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a  resolved.  This.
22a50 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
22a60 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74  lled after ident
22a70 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e  ifier resolution
22a80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22a90 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72  selectAddSubquer
22aa0 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72  yTypeInfo(Walker
22ab0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
22ac0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
22ad0 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b  pParse;.  int i;
22ae0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
22af0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
22b00 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72  rcList_item *pFr
22b10 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  om;..  assert( p
22b20 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22b30 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66  Resolved );.  if
22b40 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
22b50 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29   SF_HasTypeInfo)
22b60 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  ==0 ){.    p->se
22b70 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73  lFlags |= SF_Has
22b80 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50  TypeInfo;.    pP
22b90 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
22ba0 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62  pParse;.    pTab
22bb0 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
22bc0 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72      for(i=0, pFr
22bd0 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20  om=pTabList->a; 
22be0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
22bf0 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b  ; i++, pFrom++){
22c00 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
22c10 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ab = pFrom->pTab
22c20 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41  ;.      if( ALWA
22c30 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20 28  YS(pTab!=0) && (
22c40 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26  pTab->tabFlags &
22c50 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d   TF_Ephemeral)!=
22c60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
22c70 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74  A sub-query in t
22c80 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
22c90 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  f a SELECT */.  
22ca0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
22cb0 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  el = pFrom->pSel
22cc0 65 63 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ect;.        if(
22cd0 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 20   pSel ){.       
22ce0 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
22cf0 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20  pPrior ) pSel = 
22d00 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
22d10 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41 64          selectAd
22d20 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
22d30 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
22d40 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20  pTab, pSel);.   
22d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
22d60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22d70 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
22d80 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
22d90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 64   This routine ad
22da0 64 73 20 64 61 74 61 74 79 70 65 20 61 6e 64 20  ds datatype and 
22db0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
22dc0 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ce information t
22dd0 6f 0a 2a 2a 20 74 68 65 20 54 61 62 6c 65 20 73  o.** the Table s
22de0 74 72 75 63 74 75 72 65 73 20 6f 66 20 61 6c 6c  tructures of all
22df0 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62   FROM-clause sub
22e00 71 75 65 72 69 65 73 20 69 6e 20 61 0a 2a 2a 20  queries in a.** 
22e10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
22e20 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 69 73  ..**.** Use this
22e30 20 72 6f 75 74 69 6e 65 20 61 66 74 65 72 20 6e   routine after n
22e40 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ame resolution..
22e50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
22e60 71 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 54  qlite3SelectAddT
22e70 79 70 65 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  ypeInfo(Parse *p
22e80 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
22e90 53 65 6c 65 63 74 29 7b 0a 23 69 66 6e 64 65 66  Select){.#ifndef
22ea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
22eb0 51 55 45 52 59 0a 20 20 57 61 6c 6b 65 72 20 77  QUERY.  Walker w
22ec0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
22ed0 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
22ee0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
22ef0 6b 20 3d 20 73 65 6c 65 63 74 41 64 64 53 75 62  k = selectAddSub
22f00 71 75 65 72 79 54 79 70 65 49 6e 66 6f 3b 0a 20  queryTypeInfo;. 
22f10 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
22f20 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
22f30 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
22f40 61 72 73 65 3b 0a 20 20 77 2e 62 53 65 6c 65 63  arse;.  w.bSelec
22f50 74 44 65 70 74 68 46 69 72 73 74 20 3d 20 31 3b  tDepthFirst = 1;
22f60 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
22f70 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
22f80 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
22f90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22fa0 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
22fb0 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
22fc0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
22fd0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
22fe0 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
22ff0 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
23000 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
23010 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
23020 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
23030 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
23040 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
23050 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
23060 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
23070 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
23080 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
23090 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
230a0 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
230b0 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
230c0 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
230d0 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
230e0 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
230f0 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
23100 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
23110 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
23120 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
23130 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
23140 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
23150 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
23160 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
23170 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
23180 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
23190 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
231a0 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
231b0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
231c0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
231d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
231e0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
231f0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
23200 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
23210 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
23220 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
23230 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
23240 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
23250 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  r */.){.  sqlite
23260 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56  3 *db;.  if( NEV
23270 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
23280 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  n;.  db = pParse
23290 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
232a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
232b0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
232c0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
232d0 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
232e0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
232f0 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65  ectExpand(pParse
23300 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , p);.  if( pPar
23310 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
23320 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
23330 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
23340 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
23350 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
23360 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
23370 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
23380 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
23390 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
233a0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
233b0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b  Info(pParse, p);
233c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
233d0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
233e0 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
233f0 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
23400 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
23410 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
23420 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
23430 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
23440 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
23450 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
23460 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
23470 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
23480 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65   code that store
23490 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
234a0 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a  f those memory.*
234b0 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * cells..*/.stat
234c0 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
234d0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
234e0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
234f0 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
23500 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
23510 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
23520 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
23530 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
23540 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49  int nReg = pAggI
23550 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67  nfo->nFunc + pAg
23560 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  gInfo->nColumn;.
23570 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20    if( nReg==0 ) 
23580 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53  return;.#ifdef S
23590 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
235a0 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c   Verify that all
235b0 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65   AggInfo registe
235c0 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68  rs are within th
235d0 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65  e range specifie
235e0 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66  d by.  ** AggInf
235f0 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f  o.mnReg..AggInfo
23600 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65  .mxReg */.  asse
23610 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e  rt( nReg==pAggIn
23620 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e  fo->mxReg-pAggIn
23630 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20  fo->mnReg+1 );. 
23640 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
23650 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  Info->nColumn; i
23660 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
23670 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
23680 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
23690 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
236a0 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
236b0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  Col[i].iMem<=pAg
236c0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
236d0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
236e0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
236f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
23700 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  rt( pAggInfo->aF
23710 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  unc[i].iMem>=pAg
23720 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
23730 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
23740 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
23750 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
23760 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  g );.  }.#endif.
23770 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
23780 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
23790 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  0, pAggInfo->mnR
237a0 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg, pAggInfo->mx
237b0 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e  Reg);.  for(pFun
237c0 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
237d0 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
237e0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
237f0 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66  pFunc++){.    if
23800 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
23810 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
23820 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
23830 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
23840 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
23850 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49  operty(pE, EP_xI
23860 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
23870 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73    if( pE->x.pLis
23880 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c  t==0 || pE->x.pL
23890 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  ist->nExpr!=1 ){
238a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
238b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
238c0 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65   "DISTINCT aggre
238d0 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20  gates must have 
238e0 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20  exactly one ".  
238f0 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65           "argume
23900 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  nt");.        pF
23910 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
23920 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
23930 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
23940 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
23950 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
23960 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e  t(pParse, pE->x.
23970 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  pList);.        
23980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23990 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
239a0 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44  meral, pFunc->iD
239b0 69 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  istinct, 0, 0,. 
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239d0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
239e0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
239f0 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  INFO);.      }. 
23a00 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
23a10 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f  * Invoke the OP_
23a20 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f  AggFinalize opco
23a30 64 65 20 66 6f 72 20 65 76 65 72 79 20 61 67 67  de for every agg
23a40 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
23a50 2a 2a 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66  ** in the AggInf
23a60 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  o structure..*/.
23a70 73 74 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61  static void fina
23a80 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73  lizeAggFunctions
23a90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
23aa0 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
23ab0 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  o){.  Vdbe *v = 
23ac0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
23ad0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
23ae0 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70   AggInfo_func *p
23af0 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  F;.  for(i=0, pF
23b00 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63  =pAggInfo->aFunc
23b10 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  ; i<pAggInfo->nF
23b20 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b  unc; i++, pF++){
23b30 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70  .    ExprList *p
23b40 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72  List = pF->pExpr
23b50 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61  ->x.pList;.    a
23b60 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
23b70 72 6f 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70  roperty(pF->pExp
23b80 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
23b90 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
23ba0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
23bb0 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d  AggFinal, pF->iM
23bc0 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  em, pList ? pLis
23bd0 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c  t->nExpr : 0, 0,
23be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23bf0 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46         (void*)pF
23c00 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43  ->pFunc, P4_FUNC
23c10 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  DEF);.  }.}../*.
23c20 2a 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 63  ** Update the ac
23c30 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79  cumulator memory
23c40 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67   cells for an ag
23c50 67 72 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e  gregate based on
23c60 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
23c70 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e  cursor position.
23c80 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
23c90 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
23ca0 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
23cb0 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
23cc0 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
23cd0 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
23ce0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72    int i;.  int r
23cf0 65 67 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74  egHit = 0;.  int
23d00 20 61 64 64 72 48 69 74 54 65 73 74 20 3d 20 30   addrHitTest = 0
23d10 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e  ;.  struct AggIn
23d20 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73  fo_func *pF;.  s
23d30 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
23d40 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e  l *pC;..  pAggIn
23d50 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
23d60 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   1;.  for(i=0, p
23d70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  F=pAggInfo->aFun
23d80 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  c; i<pAggInfo->n
23d90 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29  Func; i++, pF++)
23da0 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a  {.    int nArg;.
23db0 20 20 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74      int addrNext
23dc0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65   = 0;.    int re
23dd0 67 41 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69  gAgg;.    ExprLi
23de0 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e  st *pList = pF->
23df0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a  pExpr->x.pList;.
23e00 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
23e10 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d  rHasProperty(pF-
23e20 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  >pExpr, EP_xIsSe
23e30 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28  lect) );.    if(
23e40 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20   pList ){.      
23e50 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  nArg = pList->nE
23e60 78 70 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67  xpr;.      regAg
23e70 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
23e80 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
23e90 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  nArg);.      sql
23ea0 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
23eb0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69  List(pParse, pLi
23ec0 73 74 2c 20 72 65 67 41 67 67 2c 20 53 51 4c 49  st, regAgg, SQLI
23ed0 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20  TE_ECEL_DUP);.  
23ee0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
23ef0 41 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Arg = 0;.      r
23f00 65 67 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d  egAgg = 0;.    }
23f10 0a 20 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69  .    if( pF->iDi
23f20 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20  stinct>=0 ){.   
23f30 20 20 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71     addrNext = sq
23f40 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
23f50 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73  el(v);.      ass
23f60 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
23f70 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e        codeDistin
23f80 63 74 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69  ct(pParse, pF->i
23f90 44 69 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65  Distinct, addrNe
23fa0 78 74 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a  xt, 1, regAgg);.
23fb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
23fc0 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61  ->pFunc->funcFla
23fd0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
23fe0 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20  _NEEDCOLL ){.   
23ff0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
24000 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72  l = 0;.      str
24010 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
24020 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
24030 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73  int j;.      ass
24040 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
24050 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66    /* pList!=0 if
24060 20 70 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e   pF->pFunc has N
24070 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20  EEDCOLL */.     
24080 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d   for(j=0, pItem=
24090 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c  pList->a; !pColl
240a0 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c   && j<nArg; j++,
240b0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
240c0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
240d0 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
240e0 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
240f0 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
24100 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
24110 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
24120 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66   pParse->db->pDf
24130 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  ltColl;.      }.
24140 20 20 20 20 20 20 69 66 28 20 72 65 67 48 69 74        if( regHit
24150 3d 3d 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d  ==0 && pAggInfo-
24160 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20  >nAccumulator ) 
24170 72 65 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73  regHit = ++pPars
24180 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
24190 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
241a0 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20  (v, OP_CollSeq, 
241b0 72 65 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63  regHit, 0, 0, (c
241c0 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
241d0 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a  COLLSEQ);.    }.
241e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
241f0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53  ddOp4(v, OP_AggS
24200 74 65 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20  tep, 0, regAgg, 
24210 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20  pF->iMem,.      
24220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24230 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
24240 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
24250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
24260 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41  angeP5(v, (u8)nA
24270 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
24280 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
24290 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
242a0 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20  regAgg, nArg);. 
242b0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
242c0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
242d0 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
242e0 3b 0a 20 20 20 20 69 66 28 20 61 64 64 72 4e 65  ;.    if( addrNe
242f0 78 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  xt ){.      sqli
24300 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
24310 62 65 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29  bel(v, addrNext)
24320 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
24330 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
24340 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  arse);.    }.  }
24350 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f  ..  /* Before po
24360 70 75 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63  pulating the acc
24370 75 6d 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65  umulator registe
24380 72 73 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f  rs, clear the co
24390 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a  lumn cache..  **
243a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
243b0 6e 79 20 6f 66 20 74 68 65 20 72 65 71 75 69 72  ny of the requir
243c0 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  ed column values
243d0 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 72 65   are already pre
243e0 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65  sent .  ** in re
243f0 67 69 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33  gisters, sqlite3
24400 45 78 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75  ExprCode() may u
24410 73 65 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63  se OP_SCopy to c
24420 6f 70 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20  opy the value.  
24430 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20  ** to pC->iMem. 
24440 42 75 74 20 62 79 20 74 68 65 20 74 69 6d 65 20  But by the time 
24450 74 68 65 20 76 61 6c 75 65 20 69 73 20 75 73 65  the value is use
24460 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  d, the original 
24470 72 65 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61  register.  ** ma
24480 79 20 68 61 76 65 20 62 65 65 6e 20 75 73 65 64  y have been used
24490 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74  , invalidating t
244a0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75  he underlying bu
244b0 66 66 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ffer holding the
244c0 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c  .  ** text or bl
244d0 6f 62 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69  ob value. See ti
244e0 63 6b 65 74 20 5b 38 38 33 30 33 34 64 63 62 35  cket [883034dcb5
244f0 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f  ]..  **.  ** Ano
24500 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f  ther solution wo
24510 75 6c 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65  uld be to change
24520 20 74 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73   the OP_SCopy us
24530 65 64 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65  ed to copy cache
24540 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f  d.  ** values to
24550 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a   an OP_Copy..  *
24560 2f 0a 20 20 69 66 28 20 72 65 67 48 69 74 20 29  /.  if( regHit )
24570 7b 0a 20 20 20 20 61 64 64 72 48 69 74 54 65 73  {.    addrHitTes
24580 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  t = sqlite3VdbeA
24590 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
245a0 72 65 67 48 69 74 29 3b 0a 20 20 7d 0a 20 20 73  regHit);.  }.  s
245b0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
245c0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
245d0 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67  for(i=0, pC=pAgg
245e0 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41  Info->aCol; i<pA
245f0 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c  ggInfo->nAccumul
24600 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29  ator; i++, pC++)
24610 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
24620 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43  rCode(pParse, pC
24630 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65  ->pExpr, pC->iMe
24640 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e  m);.  }.  pAggIn
24650 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d  fo->directMode =
24660 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
24670 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
24680 73 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48  se);.  if( addrH
24690 69 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71  itTest ){.    sq
246a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
246b0 65 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74  e(v, addrHitTest
246c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
246d0 41 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f  Add a single OP_
246e0 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
246f0 69 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20  ion to the VDBE 
24700 74 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d  to explain a sim
24710 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20  ple.** count(*) 
24720 71 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63  query ("SELECT c
24730 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61  ount(*) FROM pTa
24740 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  b")..*/.#ifndef 
24750 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
24760 41 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AIN.static void 
24770 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
24780 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
24790 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
247a0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
247b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
247c0 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
247d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
247e0 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69  able being queri
247f0 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ed */.  Index *p
24800 49 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20  Idx             
24810 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
24820 20 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a   used to optimiz
24830 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20  e scan, or NULL 
24840 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72  */.){.  if( pPar
24850 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
24860 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70  {.    char *zEqp
24870 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
24880 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53  f(pParse->db, "S
24890 43 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73  CAN TABLE %s%s%s
248a0 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ",.        pTab-
248b0 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  >zName, .       
248c0 20 70 49 64 78 20 3f 20 22 20 55 53 49 4e 47 20   pIdx ? " USING 
248d0 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22  COVERING INDEX "
248e0 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 70   : "",.        p
248f0 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d  Idx ? pIdx->zNam
24900 65 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20  e : "".    );.  
24910 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
24920 4f 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61  Op4(.        pPa
24930 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45  rse->pVdbe, OP_E
24940 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e  xplain, pParse->
24950 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c  iSelectId, 0, 0,
24960 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49   zEqp, P4_DYNAMI
24970 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23  C.    );.  }.}.#
24980 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78  else.# define ex
24990 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
249a0 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a  (a,b,c).#endif..
249b0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
249c0 6f 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45  ode for the SELE
249d0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  CT statement giv
249e0 65 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75  en in the p argu
249f0 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ment.  .**.** Th
24a00 65 20 72 65 73 75 6c 74 73 20 61 72 65 20 64 69  e results are di
24a10 73 74 72 69 62 75 74 65 64 20 69 6e 20 76 61 72  stributed in var
24a20 69 6f 75 73 20 77 61 79 73 20 64 65 70 65 6e 64  ious ways depend
24a30 69 6e 67 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f  ing on the.** co
24a40 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 53 65  ntents of the Se
24a50 6c 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75  lectDest structu
24a60 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
24a70 20 61 72 67 75 6d 65 6e 74 20 70 44 65 73 74 0a   argument pDest.
24a80 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ** as follows:.*
24a90 2a 0a 2a 2a 20 20 20 20 20 70 44 65 73 74 2d 3e  *.**     pDest->
24aa0 65 44 65 73 74 20 20 20 20 52 65 73 75 6c 74 0a  eDest    Result.
24ab0 2a 2a 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  **     ---------
24ac0 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
24ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24af0 2d 2d 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4f 75  --.**     SRT_Ou
24b00 74 70 75 74 20 20 20 20 20 20 47 65 6e 65 72 61  tput      Genera
24b10 74 65 20 61 20 72 6f 77 20 6f 66 20 6f 75 74 70  te a row of outp
24b20 75 74 20 28 75 73 69 6e 67 20 74 68 65 20 4f 50  ut (using the OP
24b30 5f 52 65 73 75 6c 74 52 6f 77 0a 2a 2a 20 20 20  _ResultRow.**   
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b50 20 20 6f 70 63 6f 64 65 29 20 66 6f 72 20 65 61    opcode) for ea
24b60 63 68 20 72 6f 77 20 69 6e 20 74 68 65 20 72 65  ch row in the re
24b70 73 75 6c 74 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  sult set..**.** 
24b80 20 20 20 20 53 52 54 5f 4d 65 6d 20 20 20 20 20      SRT_Mem     
24b90 20 20 20 20 4f 6e 6c 79 20 76 61 6c 69 64 20 69      Only valid i
24ba0 66 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20  f the result is 
24bb0 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e  a single column.
24bc0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
24bd0 20 20 20 20 20 20 20 20 53 74 6f 72 65 20 74 68          Store th
24be0 65 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f  e first column o
24bf0 66 20 74 68 65 20 66 69 72 73 74 20 72 65 73 75  f the first resu
24c00 6c 74 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20  lt row.**       
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
24c20 20 72 65 67 69 73 74 65 72 20 70 44 65 73 74 2d   register pDest-
24c30 3e 69 53 44 50 61 72 6d 20 74 68 65 6e 20 61 62  >iSDParm then ab
24c40 61 6e 64 6f 6e 20 74 68 65 20 72 65 73 74 0a 2a  andon the rest.*
24c50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
24c60 20 20 20 20 20 20 6f 66 20 74 68 65 20 71 75 65        of the que
24c70 72 79 2e 20 20 54 68 69 73 20 64 65 73 74 69 6e  ry.  This destin
24c80 61 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 22 4c  ation implies "L
24c90 49 4d 49 54 20 31 22 2e 0a 2a 2a 0a 2a 2a 20 20  IMIT 1"..**.**  
24ca0 20 20 20 53 52 54 5f 53 65 74 20 20 20 20 20 20     SRT_Set      
24cb0 20 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d 75     The result mu
24cc0 73 74 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63  st be a single c
24cd0 6f 6c 75 6d 6e 2e 20 20 53 74 6f 72 65 20 65 61  olumn.  Store ea
24ce0 63 68 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ch.**           
24cf0 20 20 20 20 20 20 20 20 20 20 72 6f 77 20 6f 66            row of
24d00 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 6b   result as the k
24d10 65 79 20 69 6e 20 74 61 62 6c 65 20 70 44 65 73  ey in table pDes
24d20 74 2d 3e 69 53 44 50 61 72 6d 2e 20 0a 2a 2a 20  t->iSDParm. .** 
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d40 20 20 20 20 41 70 70 6c 79 20 74 68 65 20 61 66      Apply the af
24d50 66 69 6e 69 74 79 20 70 44 65 73 74 2d 3e 61 66  finity pDest->af
24d60 66 53 64 73 74 20 62 65 66 6f 72 65 20 73 74 6f  fSdst before sto
24d70 72 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ring.**         
24d80 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
24d90 6c 74 73 2e 20 20 55 73 65 64 20 74 6f 20 69 6d  lts.  Used to im
24da0 70 6c 65 6d 65 6e 74 20 22 49 4e 20 28 53 45 4c  plement "IN (SEL
24db0 45 43 54 20 2e 2e 2e 29 22 2e 0a 2a 2a 0a 2a 2a  ECT ...)"..**.**
24dc0 20 20 20 20 20 53 52 54 5f 55 6e 69 6f 6e 20 20       SRT_Union  
24dd0 20 20 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c       Store resul
24de0 74 73 20 61 73 20 61 20 6b 65 79 20 69 6e 20 61  ts as a key in a
24df0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
24e00 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
24e10 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69 66           identif
24e20 69 65 64 20 62 79 20 70 44 65 73 74 2d 3e 69 53  ied by pDest->iS
24e30 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  DParm..**.**    
24e40 20 53 52 54 5f 45 78 63 65 70 74 20 20 20 20 20   SRT_Except     
24e50 20 52 65 6d 6f 76 65 20 72 65 73 75 6c 74 73 20   Remove results 
24e60 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 6f 72 61  from the tempora
24e70 72 79 20 74 61 62 6c 65 20 70 44 65 73 74 2d 3e  ry table pDest->
24e80 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20  iSDParm..**.**  
24e90 20 20 20 53 52 54 5f 54 61 62 6c 65 20 20 20 20     SRT_Table    
24ea0 20 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74 73     Store results
24eb0 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61   in temporary ta
24ec0 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ble pDest->iSDPa
24ed0 72 6d 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rm..**          
24ee0 20 20 20 20 20 20 20 20 20 20 20 54 68 69 73 20             This 
24ef0 69 73 20 6c 69 6b 65 20 53 52 54 5f 45 70 68 65  is like SRT_Ephe
24f00 6d 54 61 62 20 65 78 63 65 70 74 20 74 68 61 74  mTab except that
24f10 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20   the table.**   
24f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f30 20 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20    is assumed to 
24f40 61 6c 72 65 61 64 79 20 62 65 20 6f 70 65 6e 2e  already be open.
24f50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45  .**.**     SRT_E
24f60 70 68 65 6d 54 61 62 20 20 20 20 43 72 65 61 74  phemTab    Creat
24f70 65 20 61 6e 20 74 65 6d 70 6f 72 61 72 79 20 74  e an temporary t
24f80 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50  able pDest->iSDP
24f90 61 72 6d 20 61 6e 64 20 73 74 6f 72 65 0a 2a 2a  arm and store.**
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fb0 20 20 20 20 20 74 68 65 20 72 65 73 75 6c 74 20       the result 
24fc0 74 68 65 72 65 2e 20 54 68 65 20 63 75 72 73 6f  there. The curso
24fd0 72 20 69 73 20 6c 65 66 74 20 6f 70 65 6e 20 61  r is left open a
24fe0 66 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  fter.**         
24ff0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
25000 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69 73 20  rning.  This is 
25010 6c 69 6b 65 20 53 52 54 5f 54 61 62 6c 65 20 65  like SRT_Table e
25020 78 63 65 70 74 20 74 68 61 74 0a 2a 2a 20 20 20  xcept that.**   
25030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25040 20 20 74 68 69 73 20 64 65 73 74 69 6e 61 74 69    this destinati
25050 6f 6e 20 75 73 65 73 20 4f 50 5f 4f 70 65 6e 45  on uses OP_OpenE
25060 70 68 65 6d 65 72 61 6c 20 74 6f 20 63 72 65 61  phemeral to crea
25070 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  te.**           
25080 20 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61            the ta
25090 62 6c 65 20 66 69 72 73 74 2e 0a 2a 2a 0a 2a 2a  ble first..**.**
250a0 20 20 20 20 20 53 52 54 5f 43 6f 72 6f 75 74 69       SRT_Corouti
250b0 6e 65 20 20 20 47 65 6e 65 72 61 74 65 20 61 20  ne   Generate a 
250c0 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68 61 74 20  co-routine that 
250d0 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 72 6f  returns a new ro
250e0 77 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  w of.**         
250f0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75              resu
25100 6c 74 73 20 65 61 63 68 20 74 69 6d 65 20 69 74  lts each time it
25110 20 69 73 20 69 6e 76 6f 6b 65 64 2e 20 20 54 68   is invoked.  Th
25120 65 20 65 6e 74 72 79 20 70 6f 69 6e 74 0a 2a 2a  e entry point.**
25130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25140 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 2d 72       of the co-r
25150 6f 75 74 69 6e 65 20 69 73 20 73 74 6f 72 65 64  outine is stored
25160 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 44 65   in register pDe
25170 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 0a  st->iSDParm..**.
25180 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 69 73 74  **     SRT_Exist
25190 73 20 20 20 20 20 20 53 74 6f 72 65 20 61 20 31  s      Store a 1
251a0 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20   in memory cell 
251b0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 69  pDest->iSDParm i
251c0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  f the result.** 
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251e0 20 20 20 20 73 65 74 20 69 73 20 6e 6f 74 20 65      set is not e
251f0 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mpty..**.**     
25200 53 52 54 5f 44 69 73 63 61 72 64 20 20 20 20 20  SRT_Discard     
25210 54 68 72 6f 77 20 74 68 65 20 72 65 73 75 6c 74  Throw the result
25220 73 20 61 77 61 79 2e 20 20 54 68 69 73 20 69 73  s away.  This is
25230 20 75 73 65 64 20 62 79 20 53 45 4c 45 43 54 0a   used by SELECT.
25240 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
25250 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
25260 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72  s within trigger
25270 73 20 77 68 6f 73 65 20 6f 6e 6c 79 20 70 75 72  s whose only pur
25280 70 6f 73 65 20 69 73 0a 2a 2a 20 20 20 20 20 20  pose is.**      
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
252a0 68 65 20 73 69 64 65 2d 65 66 66 65 63 74 73 20  he side-effects 
252b0 6f 66 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  of functions..**
252c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
252d0 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
252e0 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
252f0 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
25300 65 0a 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64  e.** encountered
25310 2c 20 74 68 65 6e 20 61 6e 20 61 70 70 72 6f 70  , then an approp
25320 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
25330 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 2a  age is left in.*
25340 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  * pParse->zErrMs
25350 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  g..**.** This ro
25360 75 74 69 6e 65 20 64 6f 65 73 20 4e 4f 54 20 66  utine does NOT f
25370 72 65 65 20 74 68 65 20 53 65 6c 65 63 74 20 73  ree the Select s
25380 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64 20  tructure passed 
25390 69 6e 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  in.  The.** call
253a0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 65 65  ing function nee
253b0 64 73 20 74 6f 20 64 6f 20 74 68 61 74 2e 0a 2a  ds to do that..*
253c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  /.int sqlite3Sel
253d0 65 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ect(.  Parse *pP
253e0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
253f0 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
25400 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
25410 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
25420 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
25430 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
25440 64 65 64 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ded. */.  Select
25450 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
25460 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
25470 69 74 68 20 74 68 65 20 71 75 65 72 79 20 72 65  ith the query re
25480 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
25490 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
254a0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
254b0 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65 72 65  nters */.  Where
254c0 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20  Info *pWInfo;   
254d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 66 72 6f 6d    /* Return from
254e0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
254f0 69 6e 28 29 20 2a 2f 0a 20 20 56 64 62 65 20 2a  in() */.  Vdbe *
25500 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
25510 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
25520 6d 61 63 68 69 6e 65 20 75 6e 64 65 72 20 63 6f  machine under co
25530 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
25540 69 6e 74 20 69 73 41 67 67 3b 20 20 20 20 20 20  int isAgg;      
25550 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
25560 6f 72 20 73 65 6c 65 63 74 20 6c 69 73 74 73 20  or select lists 
25570 6c 69 6b 65 20 22 63 6f 75 6e 74 28 2a 29 22 20  like "count(*)" 
25580 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
25590 45 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  EList;      /* L
255a0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
255b0 6f 20 65 78 74 72 61 63 74 2e 20 2a 2f 0a 20 20  o extract. */.  
255c0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
255d0 74 3b 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  t;     /* List o
255e0 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 6c 65  f tables to sele
255f0 63 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 45 78 70  ct from */.  Exp
25600 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
25610 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
25620 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62 65   clause.  May be
25630 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 4c   NULL */.  ExprL
25640 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
25650 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
25660 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  Y clause.  May b
25670 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72  e NULL */.  Expr
25680 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
25690 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
256a0 42 59 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20  BY clause.  May 
256b0 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  be NULL */.  Exp
256c0 72 20 2a 70 48 61 76 69 6e 67 3b 20 20 20 20 20  r *pHaving;     
256d0 20 20 20 20 2f 2a 20 54 68 65 20 48 41 56 49 4e      /* The HAVIN
256e0 47 20 63 6c 61 75 73 65 2e 20 20 4d 61 79 20 62  G clause.  May b
256f0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
25700 72 63 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  rc = 1;         
25710 20 20 20 2f 2a 20 56 61 6c 75 65 20 74 6f 20 72     /* Value to r
25720 65 74 75 72 6e 20 66 72 6f 6d 20 74 68 69 73 20  eturn from this 
25730 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  function */.  in
25740 74 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3b  t addrSortIndex;
25750 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
25760 6f 66 20 61 6e 20 4f 50 5f 4f 70 65 6e 45 70 68  of an OP_OpenEph
25770 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74 69  emeral instructi
25780 6f 6e 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  on */.  Distinct
25790 43 74 78 20 73 44 69 73 74 69 6e 63 74 3b 20 2f  Ctx sDistinct; /
257a0 2a 20 49 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f  * Info on how to
257b0 20 63 6f 64 65 20 74 68 65 20 44 49 53 54 49 4e   code the DISTIN
257c0 43 54 20 6b 65 79 77 6f 72 64 20 2a 2f 0a 20 20  CT keyword */.  
257d0 41 67 67 49 6e 66 6f 20 73 41 67 67 49 6e 66 6f  AggInfo sAggInfo
257e0 3b 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  ;      /* Inform
257f0 61 74 69 6f 6e 20 75 73 65 64 20 62 79 20 61 67  ation used by ag
25800 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
25810 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64 3b 20 20  */.  int iEnd;  
25820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
25830 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 65 6e  ddress of the en
25840 64 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 2a  d of the query *
25850 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
25860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25870 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
25880 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ction */..#ifnde
25890 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
258a0 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 52 65 73  PLAIN.  int iRes
258b0 74 6f 72 65 53 65 6c 65 63 74 49 64 20 3d 20 70  toreSelectId = p
258c0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
258d0 3b 0a 20 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  ;.  pParse->iSel
258e0 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
258f0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 2b 2b 3b  iNextSelectId++;
25900 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 20 3d 20  .#endif..  db = 
25910 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
25920 28 20 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  ( p==0 || db->ma
25930 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50  llocFailed || pP
25940 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
25950 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
25960 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
25970 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
25980 51 4c 49 54 45 5f 53 45 4c 45 43 54 2c 20 30 2c  QLITE_SELECT, 0,
25990 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 20   0, 0) ) return 
259a0 31 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 41 67  1;.  memset(&sAg
259b0 67 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  gInfo, 0, sizeof
259c0 28 73 41 67 67 49 6e 66 6f 29 29 3b 0a 0a 20 20  (sAggInfo));..  
259d0 69 66 28 20 49 67 6e 6f 72 61 62 6c 65 4f 72 64  if( IgnorableOrd
259e0 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20  erby(pDest) ){. 
259f0 20 20 20 61 73 73 65 72 74 28 70 44 65 73 74 2d     assert(pDest-
25a00 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 78 69 73  >eDest==SRT_Exis
25a10 74 73 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65  ts || pDest->eDe
25a20 73 74 3d 3d 53 52 54 5f 55 6e 69 6f 6e 20 7c 7c  st==SRT_Union ||
25a30 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 44 65   .           pDe
25a40 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
25a50 78 63 65 70 74 20 7c 7c 20 70 44 65 73 74 2d 3e  xcept || pDest->
25a60 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61  eDest==SRT_Disca
25a70 72 64 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 4f  rd);.    /* If O
25a80 52 44 45 52 20 42 59 20 6d 61 6b 65 73 20 6e 6f  RDER BY makes no
25a90 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
25aa0 68 65 20 6f 75 74 70 75 74 20 74 68 65 6e 20 6e  he output then n
25ab0 65 69 74 68 65 72 20 64 6f 65 73 0a 20 20 20 20  either does.    
25ac0 2a 2a 20 44 49 53 54 49 4e 43 54 20 73 6f 20 69  ** DISTINCT so i
25ad0 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  t can be removed
25ae0 20 74 6f 6f 2e 20 2a 2f 0a 20 20 20 20 73 71 6c   too. */.    sql
25af0 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
25b00 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  te(db, p->pOrder
25b10 42 79 29 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64  By);.    p->pOrd
25b20 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d  erBy = 0;.    p-
25b30 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
25b40 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 20  _Distinct;.  }. 
25b50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
25b60 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 30 29  ep(pParse, p, 0)
25b70 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70  ;.  pOrderBy = p
25b80 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 54  ->pOrderBy;.  pT
25b90 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  abList = p->pSrc
25ba0 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e  ;.  pEList = p->
25bb0 70 45 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 50  pEList;.  if( pP
25bc0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
25bd0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
25be0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
25bf0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 73 41  t_end;.  }.  isA
25c00 67 67 20 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67  gg = (p->selFlag
25c10 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
25c20 29 21 3d 30 3b 0a 20 20 61 73 73 65 72 74 28 20  )!=0;.  assert( 
25c30 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 0a 20 20  pEList!=0 );..  
25c40 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74  /* Begin generat
25c50 69 6e 67 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ing code..  */. 
25c60 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
25c70 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
25c80 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 73  f( v==0 ) goto s
25c90 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 2f 2a  elect_end;..  /*
25ca0 20 49 66 20 77 72 69 74 69 6e 67 20 74 6f 20 6d   If writing to m
25cb0 65 6d 6f 72 79 20 6f 72 20 67 65 6e 65 72 61 74  emory or generat
25cc0 69 6e 67 20 61 20 73 65 74 0a 20 20 2a 2a 20 6f  ing a set.  ** o
25cd0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c  nly a single col
25ce0 75 6d 6e 20 6d 61 79 20 62 65 20 6f 75 74 70 75  umn may be outpu
25cf0 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
25d00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
25d10 55 45 52 59 0a 20 20 69 66 28 20 63 68 65 63 6b  UERY.  if( check
25d20 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53 65  ForMultiColumnSe
25d30 6c 65 63 74 45 72 72 6f 72 28 70 50 61 72 73 65  lectError(pParse
25d40 2c 20 70 44 65 73 74 2c 20 70 45 4c 69 73 74 2d  , pDest, pEList-
25d50 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20 20 20 67  >nExpr) ){.    g
25d60 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
25d70 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
25d80 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
25d90 6f 72 20 61 6c 6c 20 73 75 62 2d 71 75 65 72 69  or all sub-queri
25da0 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
25db0 6c 61 75 73 65 0a 20 20 2a 2f 0a 23 69 66 20 21  lause.  */.#if !
25dc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
25dd0 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c  MIT_SUBQUERY) ||
25de0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
25df0 5f 4f 4d 49 54 5f 56 49 45 57 29 0a 20 20 66 6f  _OMIT_VIEW).  fo
25e00 72 28 69 3d 30 3b 20 21 70 2d 3e 70 50 72 69 6f  r(i=0; !p->pPrio
25e10 72 20 26 26 20 69 3c 70 54 61 62 4c 69 73 74 2d  r && i<pTabList-
25e20 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
25e30 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
25e40 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
25e50 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  TabList->a[i];. 
25e60 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
25e70 73 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  st;.    Select *
25e80 70 53 75 62 20 3d 20 70 49 74 65 6d 2d 3e 70 53  pSub = pItem->pS
25e90 65 6c 65 63 74 3b 0a 20 20 20 20 69 6e 74 20 69  elect;.    int i
25ea0 73 41 67 67 53 75 62 3b 0a 0a 20 20 20 20 69 66  sAggSub;..    if
25eb0 28 20 70 53 75 62 3d 3d 30 20 29 20 63 6f 6e 74  ( pSub==0 ) cont
25ec0 69 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 6f  inue;..    /* So
25ed0 6d 65 74 69 6d 65 73 20 74 68 65 20 63 6f 64 65  metimes the code
25ee0 20 66 6f 72 20 61 20 73 75 62 71 75 65 72 79 20   for a subquery 
25ef0 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
25f00 64 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  d more than.    
25f10 2a 2a 20 6f 6e 63 65 2c 20 69 66 20 74 68 65 20  ** once, if the 
25f20 73 75 62 71 75 65 72 79 20 69 73 20 70 61 72 74  subquery is part
25f30 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
25f40 61 75 73 65 20 69 6e 20 61 20 4c 45 46 54 20 4a  ause in a LEFT J
25f50 4f 49 4e 2c 0a 20 20 20 20 2a 2a 20 66 6f 72 20  OIN,.    ** for 
25f60 65 78 61 6d 70 6c 65 2e 20 20 49 6e 20 74 68 61  example.  In tha
25f70 74 20 63 61 73 65 2c 20 64 6f 20 6e 6f 74 20 72  t case, do not r
25f80 65 67 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f  egenerate the co
25f90 64 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 0a 20  de to manifest. 
25fa0 20 20 20 2a 2a 20 61 20 76 69 65 77 20 6f 72 20     ** a view or 
25fb0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  the co-routine t
25fc0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 76 69  o implement a vi
25fd0 65 77 2e 20 20 54 68 65 20 66 69 72 73 74 20 69  ew.  The first i
25fe0 6e 73 74 61 6e 63 65 0a 20 20 20 20 2a 2a 20 69  nstance.    ** i
25ff0 73 20 73 75 66 66 69 63 69 65 6e 74 2c 20 74 68  s sufficient, th
26000 6f 75 67 68 20 74 68 65 20 73 75 62 72 6f 75 74  ough the subrout
26010 69 6e 65 20 74 6f 20 6d 61 6e 69 66 65 73 74 20  ine to manifest 
26020 74 68 65 20 76 69 65 77 20 64 6f 65 73 20 6e 65  the view does ne
26030 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
26040 69 6e 76 6f 6b 65 64 20 61 67 61 69 6e 2e 20 2a  invoked again. *
26050 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  /.    if( pItem-
26060 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 29 7b 0a  >addrFillSub ){.
26070 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
26080 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 3d 3d 30  >viaCoroutine==0
26090 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
260a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
260b0 20 4f 50 5f 47 6f 73 75 62 2c 20 70 49 74 65 6d   OP_Gosub, pItem
260c0 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 70 49 74  ->regReturn, pIt
260d0 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
260e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
260f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
26100 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
26110 74 20 50 61 72 73 65 2e 6e 48 65 69 67 68 74 20  t Parse.nHeight 
26120 62 79 20 74 68 65 20 68 65 69 67 68 74 20 6f 66  by the height of
26130 20 74 68 65 20 6c 61 72 67 65 73 74 20 65 78 70   the largest exp
26140 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
26150 72 65 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ree referred to 
26160 62 79 20 74 68 69 73 2c 20 74 68 65 20 70 61 72  by this, the par
26170 65 6e 74 20 73 65 6c 65 63 74 2e 20 54 68 65 20  ent select. The 
26180 63 68 69 6c 64 20 73 65 6c 65 63 74 0a 20 20 20  child select.   
26190 20 2a 2a 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20   ** may contain 
261a0 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
261b0 20 6f 66 20 61 74 20 6d 6f 73 74 0a 20 20 20 20   of at most.    
261c0 2a 2a 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ** (SQLITE_MAX_E
261d0 58 50 52 5f 44 45 50 54 48 2d 50 61 72 73 65 2e  XPR_DEPTH-Parse.
261e0 6e 48 65 69 67 68 74 29 20 68 65 69 67 68 74 2e  nHeight) height.
261f0 20 54 68 69 73 20 69 73 20 61 20 62 69 74 0a 20   This is a bit. 
26200 20 20 20 2a 2a 20 6d 6f 72 65 20 63 6f 6e 73 65     ** more conse
26210 72 76 61 74 69 76 65 20 74 68 61 6e 20 6e 65 63  rvative than nec
26220 65 73 73 61 72 79 2c 20 62 75 74 20 6d 75 63 68  essary, but much
26230 20 65 61 73 69 65 72 20 74 68 61 6e 20 65 6e 66   easier than enf
26240 6f 72 63 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6e  orcing.    ** an
26250 20 65 78 61 63 74 20 6c 69 6d 69 74 2e 0a 20 20   exact limit..  
26260 20 20 2a 2f 0a 20 20 20 20 70 50 61 72 73 65 2d    */.    pParse-
26270 3e 6e 48 65 69 67 68 74 20 2b 3d 20 73 71 6c 69  >nHeight += sqli
26280 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65 69  te3SelectExprHei
26290 67 68 74 28 70 29 3b 0a 0a 20 20 20 20 69 73 41  ght(p);..    isA
262a0 67 67 53 75 62 20 3d 20 28 70 53 75 62 2d 3e 73  ggSub = (pSub->s
262b0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
262c0 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 20 20  regate)!=0;.    
262d0 69 66 28 20 66 6c 61 74 74 65 6e 53 75 62 71 75  if( flattenSubqu
262e0 65 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ery(pParse, p, i
262f0 2c 20 69 73 41 67 67 2c 20 69 73 41 67 67 53 75  , isAgg, isAggSu
26300 62 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  b) ){.      /* T
26310 68 69 73 20 73 75 62 71 75 65 72 79 20 63 61 6e  his subquery can
26320 20 62 65 20 61 62 73 6f 72 62 65 64 20 69 6e 74   be absorbed int
26330 6f 20 69 74 73 20 70 61 72 65 6e 74 2e 20 2a 2f  o its parent. */
26340 0a 20 20 20 20 20 20 69 66 28 20 69 73 41 67 67  .      if( isAgg
26350 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Sub ){.        i
26360 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
26370 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
26380 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
26390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 20 3d       }.      i =
263a0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   -1;.    }else i
263b0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
263c0 63 3d 3d 31 20 26 26 20 28 70 2d 3e 73 65 6c 46  c==1 && (p->selF
263d0 6c 61 67 73 20 26 20 53 46 5f 4d 61 74 65 72 69  lags & SF_Materi
263e0 61 6c 69 7a 65 29 3d 3d 30 0a 20 20 20 20 20 20  alize)==0.      
263f0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
26400 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
26410 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 29  E_SubqCoroutine)
26420 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
26430 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 63 6f 2d   Implement a co-
26440 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c  routine that wil
26450 6c 20 72 65 74 75 72 6e 20 61 20 73 69 6e 67 6c  l return a singl
26460 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73  e row of the res
26470 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  ult.      ** set
26480 20 6f 6e 20 65 61 63 68 20 69 6e 76 6f 63 61 74   on each invocat
26490 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
264a0 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b      int addrTop;
264b0 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 45  .      int addrE
264c0 6f 66 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  of;.      pItem-
264d0 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70  >regReturn = ++p
264e0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
264f0 20 20 20 61 64 64 72 45 6f 66 20 3d 20 2b 2b 70     addrEof = ++p
26500 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
26510 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 63 6f 64     /* Before cod
26520 69 6e 67 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20  ing the OP_Goto 
26530 74 6f 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 73  to jump to the s
26540 74 61 72 74 20 6f 66 20 74 68 65 20 6d 61 69 6e  tart of the main
26550 20 72 6f 75 74 69 6e 65 2c 0a 20 20 20 20 20 20   routine,.      
26560 2a 2a 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  ** ensure that t
26570 68 65 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 76  he jump to the v
26580 65 72 69 66 79 2d 73 63 68 65 6d 61 20 72 6f 75  erify-schema rou
26590 74 69 6e 65 20 68 61 73 20 61 6c 72 65 61 64 79  tine has already
265a0 0a 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 63  .      ** been c
265b0 6f 64 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  oded. Otherwise,
265c0 20 74 68 65 20 76 65 72 69 66 79 2d 73 63 68 65   the verify-sche
265d0 6d 61 20 77 6f 75 6c 64 20 6c 69 6b 65 6c 79 20  ma would likely 
265e0 62 65 20 63 6f 64 65 64 20 61 73 20 0a 20 20 20  be coded as .   
265f0 20 20 20 2a 2a 20 70 61 72 74 20 6f 66 20 74 68     ** part of th
26600 65 20 63 6f 2d 72 6f 75 74 69 6e 65 2e 20 49 66  e co-routine. If
26610 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e   the main routin
26620 65 20 74 68 65 6e 20 61 63 63 65 73 73 65 64 20  e then accessed 
26630 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 61  the .      ** da
26640 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 69 6e  tabase before in
26650 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 2d 72 6f  voking the co-ro
26660 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 66 69  utine for the fi
26670 72 73 74 20 74 69 6d 65 20 28 66 6f 72 20 0a 20  rst time (for . 
26680 20 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 20       ** example 
26690 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
266a0 4c 49 4d 49 54 20 72 65 67 69 73 74 65 72 20 66  LIMIT register f
266b0 72 6f 6d 20 61 20 73 75 62 2d 73 65 6c 65 63 74  rom a sub-select
266c0 29 2c 20 69 74 20 77 6f 75 6c 64 20 0a 20 20 20  ), it would .   
266d0 20 20 20 2a 2a 20 62 65 20 64 6f 69 6e 67 20 73     ** be doing s
266e0 6f 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  o without having
266f0 20 76 65 72 69 66 69 65 64 20 74 68 65 20 73 63   verified the sc
26700 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 61 6e 64  hema version and
26710 20 6f 62 74 61 69 6e 65 64 20 0a 20 20 20 20 20   obtained .     
26720 20 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64   ** the required
26730 20 64 62 20 6c 6f 63 6b 73 2e 20 53 65 65 20 74   db locks. See t
26740 69 63 6b 65 74 20 64 36 62 33 36 62 65 33 38 2e  icket d6b36be38.
26750 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
26760 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
26770 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 0a  ma(pParse, -1);.
26780 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26790 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47 6f  eAddOp0(v, OP_Go
267a0 74 6f 29 3b 0a 20 20 20 20 20 20 61 64 64 72 54  to);.      addrT
267b0 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
267c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f 70 65  AddOp1(v, OP_Ope
267d0 6e 50 73 65 75 64 6f 2c 20 70 49 74 65 6d 2d 3e  nPseudo, pItem->
267e0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
267f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
26800 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  eP5(v, 1);.     
26810 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
26820 20 22 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20   "coroutine for 
26830 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
26840 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
26850 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
26860 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a 20  Sub = addrTop;. 
26870 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
26880 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
26890 65 67 65 72 2c 20 30 2c 20 61 64 64 72 45 6f 66  eger, 0, addrEof
268a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
268b0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
268c0 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
268d0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
268e0 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
268f0 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67  tine, pItem->reg
26900 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20 65  Return);.      e
26910 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
26920 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
26930 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
26940 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
26950 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
26960 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
26970 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
26980 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
26990 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Est = (unsigned)
269a0 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
269b0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 76  ;.      pItem->v
269c0 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  iaCoroutine = 1;
269d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
269e0 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
269f0 64 72 54 6f 70 2c 20 64 65 73 74 2e 69 53 64 73  drTop, dest.iSds
26a00 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
26a10 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
26a20 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 6e   addrTop, dest.n
26a30 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
26a40 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
26a50 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
26a60 20 61 64 64 72 45 6f 66 29 3b 0a 20 20 20 20 20   addrEof);.     
26a70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26a80 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
26a90 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
26aa0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
26ab0 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 25 73  ment((v, "end %s
26ac0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
26ad0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73  zName));.      s
26ae0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
26af0 72 65 28 76 2c 20 61 64 64 72 54 6f 70 2d 31 29  re(v, addrTop-1)
26b00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
26b10 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
26b20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 65  (pParse);.    }e
26b30 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65  lse{.      /* Ge
26b40 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
26b50 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 66 69  ine that will fi
26b60 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ll an ephemeral 
26b70 74 61 62 6c 65 20 77 69 74 68 0a 20 20 20 20 20  table with.     
26b80 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   ** the content 
26b90 6f 66 20 74 68 69 73 20 73 75 62 71 75 65 72 79  of this subquery
26ba0 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  .  pItem->addrFi
26bb0 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74  llSub will point
26bc0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
26bd0 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
26be0 67 65 6e 65 72 61 74 65 64 20 73 75 62 72 6f 75  generated subrou
26bf0 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65  tine.  pItem->re
26c00 67 52 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a  gReturn.      **
26c10 20 69 73 20 61 20 72 65 67 69 73 74 65 72 20 61   is a register a
26c20 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68 6f 6c 64  llocated to hold
26c30 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
26c40 72 65 74 75 72 6e 20 61 64 64 72 65 73 73 0a 20  return address. 
26c50 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
26c60 74 20 74 6f 70 41 64 64 72 3b 0a 20 20 20 20 20  t topAddr;.     
26c70 20 69 6e 74 20 6f 6e 63 65 41 64 64 72 20 3d 20   int onceAddr = 
26c80 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 74  0;.      int ret
26c90 41 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Addr;.      asse
26ca0 72 74 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rt( pItem->addrF
26cb0 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20  illSub==0 );.   
26cc0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
26cd0 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
26ce0 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41  nMem;.      topA
26cf0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
26d00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
26d10 74 65 67 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d  teger, 0, pItem-
26d20 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
26d30 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
26d40 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64 64 72 2b  llSub = topAddr+
26d50 31 3b 0a 20 20 20 20 20 20 56 64 62 65 4e 6f 6f  1;.      VdbeNoo
26d60 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  pComment((v, "ma
26d70 74 65 72 69 61 6c 69 7a 65 20 25 73 22 2c 20 70  terialize %s", p
26d80 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
26d90 65 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e));.      if( p
26da0 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
26db0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
26dc0 20 2f 2a 20 49 66 20 74 68 65 20 73 75 62 71 75   /* If the subqu
26dd0 65 72 79 20 69 73 20 6e 6f 74 20 63 6f 72 72 65  ery is not corre
26de0 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77 65 20  lated and if we 
26df0 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65 20 6f  are not inside o
26e00 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 74  f.        ** a t
26e10 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77 65 20  rigger, then we 
26e20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63 6f 6d  only need to com
26e30 70 75 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  pute the value o
26e40 66 20 74 68 65 20 73 75 62 71 75 65 72 79 0a 20  f the subquery. 
26e50 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65 2e 20         ** once. 
26e60 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 41  */.        onceA
26e70 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43 6f 64  ddr = sqlite3Cod
26e80 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b 0a 20  eOnce(pParse);. 
26e90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
26ea0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
26eb0 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70  it(&dest, SRT_Ep
26ec0 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69  hemTab, pItem->i
26ed0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65  Cursor);.      e
26ee0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
26ef0 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49  (pItem->iSelectI
26f00 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69  d, (u8)pParse->i
26f10 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
26f20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
26f30 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c  ct(pParse, pSub,
26f40 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70   &dest);.      p
26f50 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77  Item->pTab->nRow
26f60 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29  Est = (unsigned)
26f70 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  pSub->nSelectRow
26f80 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
26f90 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64  Addr ) sqlite3Vd
26fa0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e  beJumpHere(v, on
26fb0 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72  ceAddr);.      r
26fc0 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  etAddr = sqlite3
26fd0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
26fe0 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e  _Return, pItem->
26ff0 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
27000 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
27010 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
27020 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
27030 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27040 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74  dbeChangeP1(v, t
27050 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29  opAddr, retAddr)
27060 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
27070 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65  learTempRegCache
27080 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
27090 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65      if( /*pParse
270a0 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e  ->nErr ||*/ db->
270b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
270c0 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
270d0 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  t_end;.    }.   
270e0 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
270f0 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63   -= sqlite3Selec
27100 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a  tExprHeight(p);.
27110 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70      pTabList = p
27120 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20  ->pSrc;.    if( 
27130 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62  !IgnorableOrderb
27140 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20  y(pDest) ){.    
27150 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
27160 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a  pOrderBy;.    }.
27170 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
27180 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66  ->pEList;.#endif
27190 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70  .  pWhere = p->p
271a0 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42  Where;.  pGroupB
271b0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
271c0 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e  .  pHaving = p->
271d0 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74  pHaving;.  sDist
271e0 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70  inct.isTnct = (p
271f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
27200 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23  Distinct)!=0;..#
27210 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27220 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
27230 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  CT.  /* If there
27240 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e   is are a sequen
27250 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64  ce of queries, d
27260 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e  o the earlier on
27270 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20  es first..  */. 
27280 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29   if( p->pPrior )
27290 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69  {.    if( p->pRi
272a0 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a 20 20  ghtmost==0 ){.  
272b0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 6f 6f      Select *pLoo
272c0 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30 3b 0a  p, *pRight = 0;.
272d0 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20        int cnt = 
272e0 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53  0;.      int mxS
272f0 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66 6f 72  elect;.      for
27300 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b  (pLoop=p; pLoop;
27310 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
27320 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20  rior, cnt++){.  
27330 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 52 69        pLoop->pRi
27340 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 20  ghtmost = p;.   
27350 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78       pLoop->pNex
27360 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20  t = pRight;.    
27370 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 6f      pRight = pLo
27380 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  op;.      }.    
27390 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64 62 2d    mxSelect = db-
273a0 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
273b0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
273c0 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69 66 28  LECT];.      if(
273d0 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63 6e 74   mxSelect && cnt
273e0 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  >mxSelect ){.   
273f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
27400 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
27410 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
27420 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22  compound SELECT"
27430 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
27440 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
27450 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 63    }.    }.    rc
27460 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 70   = multiSelect(p
27470 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
27480 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74  ;.    explainSet
27490 49 6e 74 65 67 65 72 28 70 50 61 72 73 65 2d 3e  Integer(pParse->
274a0 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65 73 74  iSelectId, iRest
274b0 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  oreSelectId);.  
274c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
274d0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
274e0 20 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61   there is both a
274f0 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20 61 6e   GROUP BY and an
27500 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
27510 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a 20 20   and they are.  
27520 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 74 68  ** identical, th
27530 65 6e 20 64 69 73 61 62 6c 65 20 74 68 65 20 4f  en disable the O
27540 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
27550 69 6e 63 65 20 74 68 65 20 47 52 4f 55 50 20 42  ince the GROUP B
27560 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61 75 73  Y.  ** will caus
27570 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 63 6f  e elements to co
27580 6d 65 20 6f 75 74 20 69 6e 20 74 68 65 20 63 6f  me out in the co
27590 72 72 65 63 74 20 6f 72 64 65 72 2e 20 20 54 68  rrect order.  Th
275a0 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20 6f 70  is is.  ** an op
275b0 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74 68 65  timization - the
275c0 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   correct answer 
275d0 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20 72 65  should result re
275e0 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a 20 55  gardless..  ** U
275f0 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f 47 72  se the SQLITE_Gr
27600 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61 67 20  oupByOrder flag 
27610 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45 53 54  with SQLITE_TEST
27620 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52 0a 20  CTRL_OPTIMIZER. 
27630 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65 20 74   ** to disable t
27640 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
27650 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72   for testing pur
27660 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  poses..  */.  if
27670 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
27680 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47 72 6f  tCompare(p->pGro
27690 75 70 42 79 2c 20 70 4f 72 64 65 72 42 79 2c 20  upBy, pOrderBy, 
276a0 2d 31 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  -1)==0.         
276b0 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45  && OptimizationE
276c0 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  nabled(db, SQLIT
276d0 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20  E_GroupByOrder) 
276e0 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20  ){.    pOrderBy 
276f0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  = 0;.  }..  /* I
27700 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 44  f the query is D
27710 49 53 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20  ISTINCT with an 
27720 4f 52 44 45 52 20 42 59 20 62 75 74 20 69 73 20  ORDER BY but is 
27730 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74 65  not an aggregate
27740 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74  , and .  ** if t
27750 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69  he select-list i
27760 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  s the same as th
27770 65 20 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c  e ORDER BY list,
27780 20 74 68 65 6e 20 74 68 69 73 20 71 75 65 72 79   then this query
27790 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77  .  ** can be rew
277a0 72 69 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55  ritten as a GROU
277b0 50 20 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77  P BY. In other w
277c0 6f 72 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a  ords, this:.  **
277d0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
277e0 20 44 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52   DISTINCT xyz FR
277f0 4f 4d 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20  OM ... ORDER BY 
27800 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  xyz.  **.  ** is
27810 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a   transformed to:
27820 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
27830 45 4c 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  ELECT xyz FROM .
27840 2e 2e 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a  .. GROUP BY xyz.
27850 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65    **.  ** The se
27860 63 6f 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65  cond form is pre
27870 66 65 72 72 65 64 20 61 73 20 61 20 73 69 6e 67  ferred as a sing
27880 6c 65 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d  le index (or tem
27890 70 2d 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20  p-table) may be 
278a0 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62  .  ** used for b
278b0 6f 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  oth the ORDER BY
278c0 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72   and DISTINCT pr
278d0 6f 63 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69  ocessing. As ori
278e0 67 69 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72  ginally .  ** wr
278f0 69 74 74 65 6e 20 74 68 65 20 71 75 65 72 79 20  itten the query 
27900 6d 75 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d  must use a temp-
27910 74 61 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61  table for at lea
27920 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52  st one of the OR
27930 44 45 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64  DER .  ** BY and
27940 20 44 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61   DISTINCT, and a
27950 6e 20 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72  n index or separ
27960 61 74 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  ate temp-table f
27970 6f 72 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20  or the other..  
27980 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c  */.  if( (p->sel
27990 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
279a0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
279b0 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
279c0 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 45   .   && sqlite3E
279d0 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70  xprListCompare(p
279e0 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69  OrderBy, p->pELi
279f0 73 74 2c 20 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a  st, -1)==0.  ){.
27a00 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
27a10 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
27a20 0a 20 20 20 20 70 2d 3e 70 47 72 6f 75 70 42 79  .    p->pGroupBy
27a30 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
27a40 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45 4c  stDup(db, p->pEL
27a50 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 70 47 72  ist, 0);.    pGr
27a60 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
27a70 70 42 79 3b 0a 20 20 20 20 70 4f 72 64 65 72 42  pBy;.    pOrderB
27a80 79 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f  y = 0;.    /* No
27a90 74 69 63 65 20 74 68 61 74 20 65 76 65 6e 20 74  tice that even t
27aa0 68 6f 75 67 68 74 20 53 46 5f 44 69 73 74 69 6e  hought SF_Distin
27ab0 63 74 20 68 61 73 20 62 65 65 6e 20 63 6c 65 61  ct has been clea
27ac0 72 65 64 20 66 72 6f 6d 20 70 2d 3e 73 65 6c 46  red from p->selF
27ad0 6c 61 67 73 2c 0a 20 20 20 20 2a 2a 20 74 68 65  lags,.    ** the
27ae0 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63   sDistinct.isTnc
27af0 74 20 69 73 20 73 74 69 6c 6c 20 73 65 74 2e 20  t is still set. 
27b00 20 48 65 6e 63 65 2c 20 69 73 54 6e 63 74 20 72   Hence, isTnct r
27b10 65 70 72 65 73 65 6e 74 73 20 74 68 65 0a 20 20  epresents the.  
27b20 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 73 65    ** original se
27b30 74 74 69 6e 67 20 6f 66 20 74 68 65 20 53 46 5f  tting of the SF_
27b40 44 69 73 74 69 6e 63 74 20 66 6c 61 67 2c 20 6e  Distinct flag, n
27b50 6f 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ot the current s
27b60 65 74 74 69 6e 67 20 2a 2f 0a 20 20 20 20 61 73  etting */.    as
27b70 73 65 72 74 28 20 73 44 69 73 74 69 6e 63 74 2e  sert( sDistinct.
27b80 69 73 54 6e 63 74 20 29 3b 0a 20 20 7d 0a 0a 20  isTnct );.  }.. 
27b90 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
27ba0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
27bb0 73 65 2c 20 74 68 65 6e 20 74 68 69 73 20 73 6f  se, then this so
27bc0 72 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  rting.  ** index
27bd0 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
27be0 69 6e 67 20 75 6e 75 73 65 64 20 69 66 20 74 68  ing unused if th
27bf0 65 20 64 61 74 61 20 63 61 6e 20 62 65 20 0a 20  e data can be . 
27c00 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 69 6e   ** extracted in
27c10 20 70 72 65 2d 73 6f 72 74 65 64 20 6f 72 64 65   pre-sorted orde
27c20 72 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74  r.  If that is t
27c30 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
27c40 65 0a 20 20 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70  e.  ** OP_OpenEp
27c50 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 75 63 74  hemeral instruct
27c60 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 68 61 6e  ion will be chan
27c70 67 65 64 20 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f  ged to an OP_Noo
27c80 70 20 6f 6e 63 65 0a 20 20 2a 2a 20 77 65 20 66  p once.  ** we f
27c90 69 67 75 72 65 20 6f 75 74 20 74 68 61 74 20 74  igure out that t
27ca0 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
27cb0 20 69 73 20 6e 6f 74 20 6e 65 65 64 65 64 2e 20   is not needed. 
27cc0 20 54 68 65 20 61 64 64 72 53 6f 72 74 49 6e 64   The addrSortInd
27cd0 65 78 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ex.  ** variable
27ce0 20 69 73 20 75 73 65 64 20 74 6f 20 66 61 63 69   is used to faci
27cf0 6c 69 74 61 74 65 20 74 68 61 74 20 63 68 61 6e  litate that chan
27d00 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
27d10 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
27d20 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
27d30 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d  ;.    pKeyInfo =
27d40 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
27d50 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4f 72  List(pParse, pOr
27d60 64 65 72 42 79 29 3b 0a 20 20 20 20 70 4f 72 64  derBy);.    pOrd
27d70 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d  erBy->iECursor =
27d80 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
27d90 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e  .    p->addrOpen
27da0 45 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f  Ephm[2] = addrSo
27db0 72 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20  rtIndex =.      
27dc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27dd0 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
27de0 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  meral,.         
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e00 20 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75    pOrderBy->iECu
27e10 72 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e  rsor, pOrderBy->
27e20 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20  nExpr+2, 0,.    
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e40 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
27e50 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
27e60 46 4f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  FO);.  }else{.  
27e70 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20    addrSortIndex 
27e80 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  = -1;.  }..  /* 
27e90 49 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  If the output is
27ea0 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20   destined for a 
27eb0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c  temporary table,
27ec0 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65   open that table
27ed0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65  ..  */.  if( pDe
27ee0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
27ef0 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73  phemTab ){.    s
27f00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
27f10 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
27f20 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44  eral, pDest->iSD
27f30 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45  Parm, pEList->nE
27f40 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  xpr);.  }..  /* 
27f50 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e  Set the limiter.
27f60 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73  .  */.  iEnd = s
27f70 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
27f80 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65  bel(v);.  p->nSe
27f90 6c 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53  lectRow = LARGES
27fa0 54 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75  T_INT64;.  compu
27fb0 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
27fc0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64  (pParse, p, iEnd
27fd0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d  );.  if( p->iLim
27fe0 69 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f 72  it==0 && addrSor
27ff0 74 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20  tIndex>=0 ){.   
28000 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
28010 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64  p(v, addrSortInd
28020 65 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  ex)->opcode = OP
28030 5f 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20  _SorterOpen;.   
28040 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
28050 53 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20  SF_UseSorter;.  
28060 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76  }..  /* Open a v
28070 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20  irtual index to 
28080 75 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74  use for the dist
28090 69 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  inct set..  */. 
280a0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
280b0 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29   & SF_Distinct )
280c0 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
280d0 74 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65  tabTnct = pParse
280e0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44  ->nTab++;.    sD
280f0 69 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74  istinct.addrTnct
28100 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
28110 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
28120 70 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20  phemeral,.      
28130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28140 20 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69            sDisti
28150 6e 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20  nct.tabTnct, 0, 
28160 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
28170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28180 20 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66     (char*)keyInf
28190 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
281a0 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 29  arse, p->pEList)
281b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
281c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281d0 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20    P4_KEYINFO);. 
281e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
281f0 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
28200 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
28210 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
28220 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54  ype = WHERE_DIST
28230 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a  INCT_UNORDERED;.
28240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69    }else{.    sDi
28250 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
28260 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
28270 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69  T_NOOP;.  }..  i
28280 66 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72  f( !isAgg && pGr
28290 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  oupBy==0 ){.    
282a0 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20  /* No aggregate 
282b0 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f  functions and no
282c0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
282d0 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72   */.    u16 wctr
282e0 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69  lFlags = (sDisti
282f0 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45  nct.isTnct ? WHE
28300 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
28310 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42   : 0);..    /* B
28320 65 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  egin the databas
28330 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70  e scan. */.    p
28340 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57  WInfo = sqlite3W
28350 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65  hereBegin(pParse
28360 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65  , pTabList, pWhe
28370 72 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2d  re, pOrderBy, p-
28380 3e 70 45 4c 69 73 74 2c 0a 20 20 20 20 20 20 20  >pEList,.       
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283a0 20 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61          wctrlFla
283b0 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  gs, 0);.    if( 
283c0 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f  pWInfo==0 ) goto
283d0 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20   select_end;.   
283e0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
283f0 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28  eOutputRowCount(
28400 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65  pWInfo) < p->nSe
28410 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20  lectRow ){.     
28420 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
28430 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74   sqlite3WhereOut
28440 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e  putRowCount(pWIn
28450 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
28460 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54  f( sDistinct.isT
28470 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68  nct && sqlite3Wh
28480 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
28490 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73  Info) ){.      s
284a0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
284b0 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  pe = sqlite3Wher
284c0 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e  eIsDistinct(pWIn
284d0 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
284e0 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 73  f( pOrderBy && s
284f0 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64  qlite3WhereIsOrd
28500 65 72 65 64 28 70 57 49 6e 66 6f 29 20 29 20 70  ered(pWInfo) ) p
28510 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
28520 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
28530 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
28540 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
28550 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
28560 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
28570 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
28580 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
28590 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
285a0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
285b0 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
285c0 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
285d0 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
285e0 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
285f0 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
28600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
28610 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
28620 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
28630 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
28640 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[2] = -1;.   
28650 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74   }..    /* Use t
28660 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
28670 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73  r loop. */.    s
28680 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
28690 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
286a0 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
286b0 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44  , &sDistinct, pD
286c0 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
286d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
286e0 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
286f0 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
28720 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
28730 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
28740 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
28750 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
28760 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
28770 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
28780 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
28790 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  se when there ex
287a0 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75  ist aggregate fu
287b0 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f  nctions or a GRO
287c0 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  UP BY clause.   
287d0 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20   ** or both */. 
287e0 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
287f0 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
28800 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
28810 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
28820 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
28830 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
28840 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
28850 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
28860 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
28870 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
28880 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
28890 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
288a0 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
288b0 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
288c0 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
288d0 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
288e0 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
288f0 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
28900 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
28930 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
28940 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
28950 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
28960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28970 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
28980 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
28990 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
289a0 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
289b0 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
289c0 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
289d0 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
289e0 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
289f0 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
28a00 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
28a10 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
28a20 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
28a30 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
28a40 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
28a50 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ECT */.    int s
28a60 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f  ortPTab = 0;   /
28a70 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73  * Pseudotable us
28a80 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72  ed to decode sor
28a90 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ting results */.
28aa0 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20      int sortOut 
28ab0 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75  = 0;    /* Outpu
28ac0 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20  t register from 
28ad0 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20  the sorter */.. 
28ae0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
28af0 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
28b00 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
28b10 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
28b20 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
28b30 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
28b40 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
28b50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
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 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
28b80 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
28b90 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
28ba0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
28bb0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
28bc0 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
28bd0 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
28be0 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
28bf0 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
28c00 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
28c10 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
28c20 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
28c30 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
28c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
28c50 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
28c60 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
28c70 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
28c80 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
28c90 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
28ca0 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
28cb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
28cc0 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29  nSelectRow>100 )
28cd0 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
28ce0 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   100;.    }else{
28cf0 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
28d00 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  tRow = 1;.    }.
28d10 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  . .    /* Create
28d20 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70   a label to jump
28d30 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74   to when we want
28d40 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75   to abort the qu
28d50 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45  ery */.    addrE
28d60 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
28d70 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
28d80 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
28d90 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
28da0 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
28db0 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
28dc0 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
28dd0 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
28de0 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
28df0 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
28e00 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
28e10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
28e20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
28e30 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
28e40 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
28e50 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
28e60 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
28e70 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
28e80 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
28e90 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
28ea0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65     sAggInfo.mnRe
28eb0 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
28ec0 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  +1;.    sAggInfo
28ed0 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20  .nSortingColumn 
28ee0 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72  = pGroupBy ? pGr
28ef0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a  oupBy->nExpr+1 :
28f00 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
28f10 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
28f20 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
28f30 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
28f40 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
28f50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
28f60 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
28f70 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29  (&sNC, pOrderBy)
28f80 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
28f90 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
28fa0 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
28fb0 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
28fc0 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
28fd0 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
28fe0 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
28ff0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
29000 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
29010 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
29020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
29030 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29040 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
29050 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
29060 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
29070 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  sNC.ncFlags |= N
29080 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
29090 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
290a0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
290b0 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
290c0 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
290d0 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  ist);.      sNC.
290e0 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49  ncFlags &= ~NC_I
290f0 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a  nAggFunc;.    }.
29100 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52      sAggInfo.mxR
29110 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
29120 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  m;.    if( db->m
29130 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
29140 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
29150 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
29160 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
29170 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
29180 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
29190 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
291a0 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
291b0 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
291c0 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
291d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
291e0 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
291f0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
29200 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
29210 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
29220 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
29230 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
29240 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
29250 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
29260 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
29270 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
29280 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
29290 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
292a0 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
292b0 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
292c0 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
292d0 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
292e0 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
292f0 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
29300 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
29310 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
29320 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
29330 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
29340 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
29350 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
29360 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
29370 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
29380 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
29390 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
293a0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
293b0 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
293c0 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
293d0 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
293e0 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
293f0 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
29400 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
29410 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
29420 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
29430 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
29440 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
29450 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
29460 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
29470 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
29480 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
29490 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
294a0 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
294b0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
294c0 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
294d0 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
294e0 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
294f0 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
29500 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
29510 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
29520 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
29530 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
29540 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
29550 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
29560 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
29570 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
29580 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
29590 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
295a0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
295b0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
295c0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
295d0 79 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  y);.      addrSo
295e0 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
295f0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
29600 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a  OP_SorterOpen, .
29610 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
29620 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
29630 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
29640 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
29650 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
29660 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
29670 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e  O);..      /* In
29680 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
29690 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62  locations used b
296a0 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65  y GROUP BY aggre
296b0 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  gate processing.
296c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
296d0 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  UseFlag = ++pPar
296e0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
296f0 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70  iAbortFlag = ++p
29700 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
29710 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20     regOutputRow 
29720 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
29730 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
29740 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
29750 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
29760 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20  .      regReset 
29770 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
29780 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65  ;.      addrRese
29790 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
297a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
297b0 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73     iAMem = pPars
297c0 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
297d0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
297e0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
297f0 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
29800 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
29810 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
29820 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
29830 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
29840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
29850 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
29860 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 0, iAbortFlag)
29870 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
29880 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61  ent((v, "clear a
29890 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
298a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
298b0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
298c0 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67  ger, 0, iUseFlag
298d0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
298e0 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
298f0 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
29900 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73  mpty"));.      s
29910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
29920 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
29930 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72  iAMem, iAMem+pGr
29940 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
29950 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
29960 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
29970 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
29980 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
29990 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
299a0 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
299b0 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
299c0 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
299d0 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
299e0 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
299f0 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
29a00 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
29a10 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
29a20 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
29a30 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
29a40 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
29a50 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
29a60 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
29a70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29a80 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
29a90 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
29aa0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
29ab0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
29ac0 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
29ad0 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
29ae0 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 0a  , pGroupBy, 0, .
29af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b10 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 2c 20   WHERE_GROUPBY, 
29b20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  0);.      if( pW
29b30 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
29b40 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
29b50 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
29b60 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
29b70 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  o) ){.        /*
29b80 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
29b90 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
29ba0 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
29bb0 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
29bc0 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
29bd0 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
29be0 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
29bf0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
29c00 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
29c10 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
29c20 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
29c30 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
29c40 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
29c50 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
29c60 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
29c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29c80 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
29c90 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
29ca0 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
29cb0 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
29cc0 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
29cd0 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
29ce0 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
29cf0 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
29d00 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
29d10 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
29d20 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
29d30 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
29d40 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
29d50 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
29d60 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
29d70 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
29d80 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
29d90 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
29da0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
29db0 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
29dc0 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  pBy;..        ex
29dd0 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
29de0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
29df0 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69      (sDistinct.i
29e00 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c  sTnct && (p->sel
29e10 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
29e20 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  t)==0) ?.       
29e30 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49               "DI
29e40 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50  STINCT" : "GROUP
29e50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20   BY");..        
29e60 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
29e70 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
29e80 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
29e90 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
29ea0 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31  l = nGroupBy + 1
29eb0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
29ec0 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
29ed0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
29ee0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
29ef0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
29f00 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
29f10 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
29f20 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
29f30 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
29f40 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
29f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29f60 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
29f70 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
29f80 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
29f90 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
29fa0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
29fb0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
29fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
29fd0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
29fe0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
29ff0 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20   regBase, 0);.  
2a000 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a010 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
2a020 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f  quence, sAggInfo
2a030 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42  .sortingIdx,regB
2a040 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20  ase+nGroupBy);. 
2a050 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
2a060 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
2a070 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2a080 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
2a090 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2a0a0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
2a0b0 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
2a0c0 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
2a0d0 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
2a0e0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
2a0f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2a100 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61  t r1 = j + regBa
2a110 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
2a120 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20  int r2;..       
2a130 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
2a140 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
2a150 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  mn(pParse, .    
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a170 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2a180 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f  >pTab, pCol->iCo
2a190 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
2a1a0 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  le, r1, 0);.    
2a1b0 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d          if( r1!=
2a1c0 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r2 ){.          
2a1d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a1e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
2a1f0 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20  y, r2, r1);.    
2a200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a210 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2a220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a230 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
2a240 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
2a250 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2a260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2a270 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2a280 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
2a290 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
2a2a0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2a2b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a2c0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
2a2d0 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
2a2e0 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
2a2f0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2a300 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2a310 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
2a320 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
2a330 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2a340 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2a350 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
2a360 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2a370 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2a380 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2a390 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  o.sortingIdxPTab
2a3a0 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50   = sortPTab = pP
2a3b0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2a3c0 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20        sortOut = 
2a3d0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2a3e0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
2a3f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2a400 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
2a410 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c  seudo, sortPTab,
2a420 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b   sortOut, nCol);
2a430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2a440 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2a450 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67  _SorterSort, sAg
2a460 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2a470 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
2a480 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2a490 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
2a4a0 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  rt"));.        s
2a4b0 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69  AggInfo.useSorti
2a4c0 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20  ngIdx = 1;.     
2a4d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2a4e0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2a4f0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2a500 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
2a510 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
2a520 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
2a530 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
2a540 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
2a550 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
2a560 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
2a570 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
2a580 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
2a590 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
2a5a0 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
2a5b0 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
2a5c0 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
2a5d0 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
2a5e0 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
2a5f0 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
2a600 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
2a610 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
2a620 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
2a630 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2a640 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2a650 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2a660 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2a670 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  se);.      if( g
2a680 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
2a690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2a6a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
2a6b0 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e  rterData, sAggIn
2a6c0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
2a6d0 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d  ortOut);.      }
2a6e0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2a6f0 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
2a700 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
2a710 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
2a720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2a730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
2a740 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f  v, OP_Column, so
2a750 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d  rtPTab, j, iBMem
2a760 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +j);.          i
2a770 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65  f( j==0 ) sqlite
2a780 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2a790 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
2a7a0 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  HE);.        }el
2a7b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41  se{.          sA
2a7c0 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64  ggInfo.directMod
2a7d0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
2a7e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
2a7f0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2a800 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69  y->a[j].pExpr, i
2a810 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
2a820 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2a830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a840 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
2a850 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20  , iAMem, iBMem, 
2a860 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
2a870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a880 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
2a890 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
2a8a0 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50  Ref(pKeyInfo), P
2a8b0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
2a8c0 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
2a8d0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2a8e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2a8f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2a900 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a  Jump, j1+1, 0, j
2a910 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  1+1);..      /* 
2a920 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
2a930 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72  at runs whenever
2a940 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 68   the GROUP BY ch
2a950 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20  anges..      ** 
2a960 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47  Changes in the G
2a970 52 4f 55 50 20 42 59 20 61 72 65 20 64 65 74 65  ROUP BY are dete
2a980 63 74 65 64 20 62 79 20 74 68 65 20 70 72 65 76  cted by the prev
2a990 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20  ious code.      
2a9a0 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68  ** block.  If th
2a9b0 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e  ere were no chan
2a9c0 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20  ges, this block 
2a9d0 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20  is skipped..    
2a9e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68    **.      ** Th
2a9f0 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63  is code copies c
2aa00 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20  urrent group by 
2aa10 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62  terms in b0,b1,b
2aa20 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f  2,....      ** o
2aa30 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e  ver to a0,a1,a2.
2aa40 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20    It then calls 
2aa50 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f  the output subro
2aa60 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61  utine.      ** a
2aa70 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 61 67  nd resets the ag
2aa80 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
2aa90 74 6f 72 20 72 65 67 69 73 74 65 72 73 20 69 6e  tor registers in
2aaa0 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20   preparation.   
2aab0 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65     ** for the ne
2aac0 78 74 20 47 52 4f 55 50 20 42 59 20 62 61 74 63  xt GROUP BY batc
2aad0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
2aae0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2aaf0 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42  eMove(pParse, iB
2ab00 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f  Mem, iAMem, pGro
2ab10 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  upBy->nExpr);.  
2ab20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ab30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
2ab40 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c  b, regOutputRow,
2ab50 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
2ab60 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2ab70 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f  nt((v, "output o
2ab80 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20  ne row"));.     
2ab90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2aba0 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20  p2(v, OP_IfPos, 
2abb0 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72  iAbortFlag, addr
2abc0 45 6e 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65  End);.      Vdbe
2abd0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65  Comment((v, "che
2abe0 63 6b 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29  ck abort flag"))
2abf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2ac00 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2ac10 47 6f 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c  Gosub, regReset,
2ac20 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
2ac30 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
2ac40 76 2c 20 22 72 65 73 65 74 20 61 63 63 75 6d 75  v, "reset accumu
2ac50 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  lator"));..     
2ac60 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
2ac70 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
2ac80 61 74 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74  ators based on t
2ac90 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20  he content of.  
2aca0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
2acb0 6e 74 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a  nt row.      */.
2acc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2acd0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
2ace0 3b 0a 20 20 20 20 20 20 75 70 64 61 74 65 41 63  ;.      updateAc
2acf0 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65  cumulator(pParse
2ad00 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2ad10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ad20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2ad30 67 65 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67  ger, 1, iUseFlag
2ad40 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2ad50 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
2ad60 74 65 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d  te data in accum
2ad70 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20  ulator"));..    
2ad80 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
2ad90 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20  loop.      */.  
2ada0 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
2adb0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
2adc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2add0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
2ade0 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
2adf0 69 6e 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f  ingIdx, addrTopO
2ae00 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65  fLoop);.      }e
2ae10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
2ae20 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
2ae30 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  nfo);.        sq
2ae40 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
2ae50 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72  oNoop(v, addrSor
2ae60 74 69 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20  tingIdx);.      
2ae70 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70  }..      /* Outp
2ae80 75 74 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  ut the final row
2ae90 20 6f 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20   of result.     
2aea0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2aeb0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2aec0 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70  P_Gosub, regOutp
2aed0 75 74 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75  utRow, addrOutpu
2aee0 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62  tRow);.      Vdb
2aef0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75  eComment((v, "ou
2af00 74 70 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29  tput final row")
2af10 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d  );..      /* Jum
2af20 70 20 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f  p over the subro
2af30 75 74 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a  utines.      */.
2af40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2af50 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2af60 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b  to, 0, addrEnd);
2af70 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
2af80 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
2af90 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
2afa0 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68  single row of th
2afb0 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  e result.      *
2afc0 2a 20 73 65 74 2e 20 20 54 68 69 73 20 73 75 62  * set.  This sub
2afd0 72 6f 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f  routine first lo
2afe0 6f 6b 73 20 61 74 20 74 68 65 20 69 55 73 65 46  oks at the iUseF
2aff0 6c 61 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61  lag.  If iUseFla
2b000 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65  g.      ** is le
2b010 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
2b020 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75   to zero, the su
2b030 62 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f  broutine is a no
2b040 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a  -op.  If.      *
2b050 2a 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  * the processing
2b060 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71   calls for the q
2b070 75 65 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74  uery to abort, t
2b080 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  his subroutine. 
2b090 20 20 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e       ** incremen
2b0a0 74 73 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61  ts the iAbortFla
2b0b0 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  g memory locatio
2b0c0 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  n before returni
2b0d0 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ng in.      ** o
2b0e0 72 64 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74  rder to signal t
2b0f0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f  he caller to abo
2b100 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rt..      */.   
2b110 20 20 20 61 64 64 72 53 65 74 41 62 6f 72 74 20     addrSetAbort 
2b120 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2b130 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2b140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b150 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
2b160 65 72 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61  er, 1, iAbortFla
2b170 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  g);.      VdbeCo
2b180 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61  mment((v, "set a
2b190 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
2b1a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b1b0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75  ddOp1(v, OP_Retu
2b1c0 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77  rn, regOutputRow
2b1d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b1e0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2b1f0 28 76 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  (v, addrOutputRo
2b200 77 29 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75  w);.      addrOu
2b210 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  tputRow = sqlite
2b220 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2b230 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2b240 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2b250 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c  OP_IfPos, iUseFl
2b260 61 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ag, addrOutputRo
2b270 77 2b 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65  w+2);.      Vdbe
2b280 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f  Comment((v, "Gro
2b290 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
2b2a0 72 61 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e  rator entry poin
2b2b0 74 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  t"));.      sqli
2b2c0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2b2d0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f   OP_Return, regO
2b2e0 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20  utputRow);.     
2b2f0 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63   finalizeAggFunc
2b300 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73  tions(pParse, &s
2b310 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2b320 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2b330 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
2b340 6e 67 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ng, addrOutputRo
2b350 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  w+1, SQLITE_JUMP
2b360 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73  IFNULL);.      s
2b370 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
2b380 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c  Parse, p, p->pEL
2b390 69 73 74 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65  ist, 0, 0, pOrde
2b3a0 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
2b3b0 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69 73             &sDis
2b3c0 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
2b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3e0 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
2b3f0 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f 72  w+1, addrSetAbor
2b400 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2b410 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2b420 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
2b430 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 56  putRow);.      V
2b440 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2b450 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73 75  end groupby resu
2b460 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29 3b  lt generator"));
2b470 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
2b480 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
2b490 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65 74   that will reset
2b4a0 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61 63   the group-by ac
2b4b0 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20 20  cumulator.      
2b4c0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2b4d0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2b4e0 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  (v, addrReset);.
2b4f0 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
2b500 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2b510 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2b520 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b530 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
2b540 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20 20   regReset);.    
2b550 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66   .    } /* endif
2b560 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67 69   pGroupBy.  Begi
2b570 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n aggregate quer
2b580 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f 55  ies without GROU
2b590 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73  P BY: */.    els
2b5a0 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  e {.      ExprLi
2b5b0 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69  st *pDel = 0;.#i
2b5c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b5d0 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20 20  T_BTREECOUNT.   
2b5e0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
2b5f0 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 20        if( (pTab 
2b600 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28  = isSimpleCount(
2b610 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21 3d  p, &sAggInfo))!=
2b620 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
2b630 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74  If isSimpleCount
2b640 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  () returns a poi
2b650 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65 20  nter to a Table 
2b660 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e 0a  structure, then.
2b670 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 53          ** the S
2b680 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
2b690 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20  of the form:.   
2b6a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2b6b0 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  **   SELECT coun
2b6c0 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a  t(*) FROM <tbl>.
2b6d0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2b6e0 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65 20     ** where the 
2b6f0 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
2b700 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73 65  returned represe
2b710 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e  nts table <tbl>.
2b720 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2b730 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61 74      ** This stat
2b740 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d  ement is so comm
2b750 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f 70  on that it is op
2b760 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c 6c  timized speciall
2b770 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  y. The.        *
2b780 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72  * OP_Count instr
2b790 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74  uction is execut
2b7a0 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68 65  ed either on the
2b7b0 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74 68   intkey table th
2b7c0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  at.        ** co
2b7d0 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 20  ntains the data 
2b7e0 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20  for table <tbl> 
2b7f0 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73  or on one of its
2b800 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20 20   indexes. It.   
2b810 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74 65       ** is bette
2b820 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  r to execute the
2b830 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c   op on an index,
2b840 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65 20   as indexes are 
2b850 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20 2a  almost.        *
2b860 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64 20  * always spread 
2b870 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67 65  across less page
2b880 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f 72  s than their cor
2b890 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
2b8a0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2b8b0 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
2b8c0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2b8d0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
2b8e0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
2b8f0 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 63  hema);.        c
2b900 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d 20  onst int iCsr = 
2b910 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
2b920 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
2b930 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a   scan b-tree */.
2b940 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70          Index *p
2b950 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
2b960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b970 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2b980 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65 79  e */.        Key
2b990 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
2b9a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2b9b0 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72    /* Keyinfo for
2b9c0 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a   scanned index *
2b9d0 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20  /.        Index 
2b9e0 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20  *pBest = 0;     
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ba00 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f 75  * Best index fou
2ba10 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20  nd so far */.   
2ba20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d       int iRoot =
2ba30 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20   pTab->tnum;    
2ba40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
2ba50 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e 65  t page of scanne
2ba60 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20  d b-tree */..   
2ba70 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
2ba80 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
2ba90 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
2baa0 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c     sqlite3TableL
2bab0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
2bac0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20   pTab->tnum, 0, 
2bad0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
2bae0 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
2baf0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 74   for the index t
2bb00 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77 65  hat has the lowe
2bb10 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20 20  st scan cost..  
2bb20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2bb30 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35 29   ** (2011-04-15)
2bb40 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75 6c   Do not do a ful
2bb50 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e 6f  l scan of an uno
2bb60 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20 20  rdered index..  
2bb70 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2bb80 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33 29   ** (2013-10-03)
2bb90 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74 68   Do not count th
2bba0 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 70  e entries in a p
2bbb0 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20 20  artial index..  
2bbc0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2bbd0 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65 20   ** In practice 
2bbe0 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
2bbf0 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20 62  cture will not b
2bc00 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f 6e  e used. It is on
2bc10 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ly .        ** p
2bc20 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f 50  assed to keep OP
2bc30 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79 2e  _OpenRead happy.
2bc40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2bc50 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
2bc60 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74 20  d(pTab) ) pBest 
2bc70 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
2bc80 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
2bc90 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78          for(pIdx
2bca0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
2bcb0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
2bcc0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
2bcd0 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f    if( pIdx->bUno
2bce0 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
2bcf0 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73 7a       && pIdx->sz
2bd00 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a 54  IdxRow<pTab->szT
2bd10 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20 20  abRow.          
2bd20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74 49   && pIdx->pPartI
2bd30 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20 20  dxWhere==0.     
2bd40 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73 74        && (!pBest
2bd50 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   || pIdx->szIdxR
2bd60 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78 52  ow<pBest->szIdxR
2bd70 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ow).          ){
2bd80 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 65  .            pBe
2bd90 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  st = pIdx;.     
2bda0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2bdb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 65  .        if( pBe
2bdc0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
2bdd0 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e 74  iRoot = pBest->t
2bde0 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  num;.          p
2bdf0 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  KeyInfo = sqlite
2be00 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
2be10 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b 0a  pParse, pBest);.
2be20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2be30 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65 61     /* Open a rea
2be40 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 65  d-only cursor, e
2be50 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43 6f  xecute the OP_Co
2be60 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20 63  unt, close the c
2be70 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20 20  ursor. */.      
2be80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2be90 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
2bea0 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f  nRead, iCsr, iRo
2beb0 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20 20  ot, iDb, 1);.   
2bec0 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66       if( pKeyInf
2bed0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  o ){.          s
2bee0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2bef0 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
2bf00 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
2bf10 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20  EYINFO);.       
2bf20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
2bf30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2bf40 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c 20  OP_Count, iCsr, 
2bf50 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 30  sAggInfo.aFunc[0
2bf60 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  ].iMem);.       
2bf70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2bf80 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
2bf90 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20 65  iCsr);.        e
2bfa0 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
2bfb0 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  t(pParse, pTab, 
2bfc0 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  pBest);.      }e
2bfd0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
2bfe0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
2bff0 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b 0a  OUNT */.      {.
2c000 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2c010 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73   if the query is
2c020 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   of one of the f
2c030 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a 0a  ollowing forms:.
2c040 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2c050 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
2c060 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  in(x) FROM .... 
2c070 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
2c080 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20 2e  CT max(x) FROM .
2c090 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  ...        **.  
2c0a0 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69        ** If it i
2c0b0 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65 20  s, then ask the 
2c0c0 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20  code in where.c 
2c0d0 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73 6f  to attempt to so
2c0e0 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  rt results.     
2c0f0 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65 72     ** as if ther
2c100 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52 20  e was an "ORDER 
2c110 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52 20  ON x" or "ORDER 
2c120 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75 73  ON x DESC" claus
2c130 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  e. .        ** I
2c140 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62 6c  f where.c is abl
2c150 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65 73  e to produce res
2c160 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20 74  ults sorted in t
2c170 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e 0a  his order, then.
2c180 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20 76          ** add v
2c190 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65 61  dbe code to brea
2c1a0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72 6f  k out of the pro
2c1b0 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66 74  cessing loop aft
2c1c0 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  er the .        
2c1d0 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74 69  ** first iterati
2c1e0 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66 69  on (since the fi
2c1f0 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
2c200 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20 20   the loop is .  
2c210 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74        ** guarant
2c220 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  eed to operate o
2c230 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20 74  n the row with t
2c240 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d 61  he minimum or ma
2c250 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20 2a  ximum .        *
2c260 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74 68  * value of x, th
2c270 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75 69  e only row requi
2c280 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a  red)..        **
2c290 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 70  .        ** A sp
2c2a0 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74 20  ecial flag must 
2c2b0 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  be passed to sql
2c2c0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2c2d0 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   to slightly.   
2c2e0 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20 62       ** modify b
2c2f0 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c 6f  ehavior as follo
2c300 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ws:.        **. 
2c310 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49 66         **   + If
2c320 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61 20   the query is a 
2c330 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22 2c  "SELECT min(x)",
2c340 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20 63   then the loop c
2c350 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20 20  oded by.        
2c360 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20 73  **     where.c s
2c370 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61 74  hould not iterat
2c380 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75 65  e over any value
2c390 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76 61  s with a NULL va
2c3a0 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  lue.        **  
2c3b0 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20 20     for x..      
2c3c0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2c3d0 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a 65    + The optimize
2c3e0 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e  r code in where.
2c3f0 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68 61  c (the thing tha
2c400 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68 0a  t decides which.
2c410 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 69          **     i
2c420 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73 20  ndex or indices 
2c430 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20 70  to use) should p
2c440 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e 74  lace a different
2c450 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20 20   priority on .  
2c460 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61 74        **     sat
2c470 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52 44  isfying the 'ORD
2c480 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74 68  ER BY' clause th
2c490 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f 74  an it does in ot
2c4a0 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20 20  her cases..     
2c4b0 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72 20     **     Refer 
2c4c0 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d 6d  to code and comm
2c4d0 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63 20  ents in where.c 
2c4e0 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 20  for details..   
2c4f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c500 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d 61  ExprList *pMinMa
2c510 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75  x = 0;.        u
2c520 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f 4f  8 flag = WHERE_O
2c530 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20  RDERBY_NORMAL;. 
2c540 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2c550 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f 75  assert( p->pGrou
2c560 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pBy==0 );.      
2c570 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
2c580 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
2c590 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29   p->pHaving==0 )
2c5a0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  {.          flag
2c5b0 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28 26   = minMaxQuery(&
2c5c0 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d  sAggInfo, &pMinM
2c5d0 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ax);.        }. 
2c5e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66         assert( f
2c5f0 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d  lag==0 || (pMinM
2c600 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61 78  ax!=0 && pMinMax
2c610 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a 0a  ->nExpr==1) );..
2c620 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
2c630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   ){.          pM
2c640 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 45  inMax = sqlite3E
2c650 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
2c660 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20 20  MinMax, 0);.    
2c670 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d 69        pDel = pMi
2c680 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20 20  nMax;.          
2c690 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20 21  if( pMinMax && !
2c6a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2c6b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c6c0 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f  pMinMax->a[0].so
2c6d0 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21 3d  rtOrder = flag!=
2c6e0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
2c6f0 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20 20  N ?1:0;.        
2c700 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30      pMinMax->a[0
2c710 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b  ].pExpr->op = TK
2c720 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20  _COLUMN;.       
2c730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2c740 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69   .        /* Thi
2c750 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20 74  s case runs if t
2c760 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61 73  he aggregate has
2c770 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61   no GROUP BY cla
2c780 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20 20  use.  The.      
2c790 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
2c7a0 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72 20  is much simpler 
2c7b0 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6f  since there is o
2c7c0 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nly a single row
2c7d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f  .        ** of o
2c7e0 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20 2a  utput..        *
2c7f0 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74 41  /.        resetA
2c800 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
2c810 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2c820 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20         pWInfo = 
2c830 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
2c840 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  n(pParse, pTabLi
2c850 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69 6e  st, pWhere, pMin
2c860 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20  Max,0,flag,0);. 
2c870 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66         if( pWInf
2c880 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  o==0 ){.        
2c890 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
2c8a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65 6c  tDelete(db, pDel
2c8b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2c8c0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2c8d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c8e0 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f  updateAccumulato
2c8f0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
2c900 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61 73  nfo);.        as
2c910 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30  sert( pMinMax==0
2c920 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   || pMinMax->nEx
2c930 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  pr==1 );.       
2c940 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2c950 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2c960 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
2c970 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c980 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
2c990 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65   sqlite3WhereBre
2c9a0 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29  akLabel(pWInfo))
2c9b0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
2c9c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
2c9d0 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20  ) by index",.   
2c9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
2c9f0 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
2ca00 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
2ca10 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ")));.        }.
2ca20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2ca30 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2ca40 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  .        finaliz
2ca50 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
2ca60 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2ca70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2ca80 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
2ca90 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2caa0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
2cab0 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
2cac0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2cad0 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
2cae0 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
2caf0 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
2cb00 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20  , 0, 0, 0, 0, . 
2cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb20 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
2cb30 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
2cb40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2cb50 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
2cb60 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
2cb70 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2cb80 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
2cb90 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
2cba0 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
2cbb0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
2cbc0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
2cbd0 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
2cbe0 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
2cbf0 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
2cc00 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
2cc10 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
2cc20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
2cc30 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
2cc40 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
2cc50 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
2cc60 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
2cc70 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
2cc80 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
2cc90 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
2cca0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
2ccb0 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2ccc0 65 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45 52  e(pParse, "ORDER
2ccd0 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72   BY");.    gener
2cce0 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
2ccf0 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74  se, p, v, pEList
2cd00 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
2cd10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
2cd20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
2cd30 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
2cd40 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2cd50 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
2cd60 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
2cd70 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
2cd80 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
2cd90 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
2cda0 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
2cdb0 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
2cdc0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
2cdd0 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
2cde0 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
2cdf0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
2ce00 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
2ce10 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
2ce20 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
2ce30 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
2ce40 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
2ce50 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
2ce60 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
2ce70 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
2ce80 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65  ctId);..  /* Ide
2ce90 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
2cea0 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66  es if results of
2ceb0 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
2cec0 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  to be output..  
2ced0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
2cee0 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d  ITE_OK && pDest-
2cef0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
2cf00 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
2cf10 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
2cf20 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2cf30 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
2cf40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2cf50 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  , sAggInfo.aCol)
2cf60 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2cf70 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
2cf80 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Func);.  return 
2cf90 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
2cfa0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2cfb0 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f  _TREE_EXPLAIN)./
2cfc0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
2cfd0 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64  human-readable d
2cfe0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20  escription of a 
2cff0 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
2d000 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2d010 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65  d explainOneSele
2d020 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  ct(Vdbe *pVdbe, 
2d030 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71  Select *p){.  sq
2d040 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2d050 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43  tf(pVdbe, "SELEC
2d060 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  T ");.  if( p->s
2d070 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
2d080 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
2d090 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ate) ){.    if( 
2d0a0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
2d0b0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
2d0c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2d0d0 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2d0e0 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20  DISTINCT ");.   
2d0f0 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65   }.    if( p->se
2d100 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
2d110 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  egate ){.      s
2d120 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2d130 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f  ntf(pVdbe, "agg_
2d140 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20  flag ");.    }. 
2d150 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2d160 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20  nNL(pVdbe);.    
2d170 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2d180 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20 20  intf(pVdbe, "   
2d190 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
2d1a0 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2d1b0 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73  (pVdbe, p->pELis
2d1c0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
2d1d0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2d1e0 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20   if( p->pSrc && 
2d1f0 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b  p->pSrc->nSrc ){
2d200 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2d210 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2d220 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f  intf(pVdbe, "FRO
2d230 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  M ");.    sqlite
2d240 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64  3ExplainPush(pVd
2d250 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  be);.    for(i=0
2d260 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ; i<p->pSrc->nSr
2d270 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
2d280 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2d290 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
2d2a0 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
2d2b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d2c0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b  Printf(pVdbe, "{
2d2d0 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d  %d,*} = ", pItem
2d2e0 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
2d2f0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
2d300 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
2d310 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
2d320 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49 74 65  lect(pVdbe, pIte
2d330 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
2d340 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2d350 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
2d360 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d370 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2d380 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70  (tabname=%s)", p
2d390 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
2d3a0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2d3b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
2d3c0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
2d3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2d3e0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2d3f0 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  , "%s", pItem->z
2d400 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
2d410 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
2d420 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
2d430 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d440 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
2d450 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  (AS %s)", pItem-
2d460 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
2d470 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
2d480 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
2d490 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20  _LEFT ){.       
2d4a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2d4b0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c  rintf(pVdbe, " L
2d4c0 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20  EFT-JOIN");.    
2d4d0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
2d4e0 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2d4f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2d500 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70  ite3ExplainPop(p
2d510 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
2d520 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
2d530 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d540 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57  Printf(pVdbe, "W
2d550 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c  HERE ");.    sql
2d560 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
2d570 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65  pVdbe, p->pWhere
2d580 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2d590 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2d5a0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72    }.  if( p->pGr
2d5b0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
2d5c0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2d5d0 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42  f(pVdbe, "GROUPB
2d5e0 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Y ");.    sqlite
2d5f0 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
2d600 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75  (pVdbe, p->pGrou
2d610 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
2d620 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
2d630 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2d640 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73  pHaving ){.    s
2d650 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2d660 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41 56 49  ntf(pVdbe, "HAVI
2d670 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  NG ");.    sqlit
2d680 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
2d690 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  dbe, p->pHaving)
2d6a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2d6b0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2d6c0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
2d6d0 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
2d6e0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2d6f0 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59  (pVdbe, "ORDERBY
2d700 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2d710 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2d720 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72  pVdbe, p->pOrder
2d730 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
2d740 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2d750 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2d760 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
2d770 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2d780 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20  f(pVdbe, "LIMIT 
2d790 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2d7a0 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65  xplainExpr(pVdbe
2d7b0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
2d7c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d7d0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
2d7e0 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
2d7f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2d800 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2d810 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20  e, "OFFSET ");. 
2d820 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2d830 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e  nExpr(pVdbe, p->
2d840 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  pOffset);.    sq
2d850 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2d860 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  Vdbe);.  }.}.voi
2d870 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
2d880 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64  Select(Vdbe *pVd
2d890 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  be, Select *p){.
2d8a0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
2d8b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2d8c0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28  Printf(pVdbe, "(
2d8d0 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a  null-select)");.
2d8e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2d8f0 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 50 72 69    while( p->pPri
2d900 6f 72 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  or ){.    p->pPr
2d910 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  ior->pNext = p;.
2d920 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f      p = p->pPrio
2d930 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
2d940 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62  ExplainPush(pVdb
2d950 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e);.  while( p )
2d960 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65  {.    explainOne
2d970 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20 70 29  Select(pVdbe, p)
2d980 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  ;.    p = p->pNe
2d990 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30  xt;.    if( p==0
2d9a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
2d9b0 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
2d9c0 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Vdbe);.    sqlit
2d9d0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2d9e0 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c 20 73  pVdbe, "%s\n", s
2d9f0 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
2da00 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  p));.  }.  sqlit
2da10 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2da20 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b 0a 20  pVdbe, "END");. 
2da30 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2da40 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a  op(pVdbe);.}../*
2da50 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74 72 75   End of the stru
2da60 63 74 75 72 65 20 64 65 62 75 67 20 70 72 69 6e  cture debug prin
2da70 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a  ting code.******
2da80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2da90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2daa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2dac0 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
2dad0 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
2dae0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
2daf0 50 4c 41 49 4e 29 20 2a 2f 0a                    PLAIN) */.