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

Artifact ebec4d3fad7fd5aa33cd69e2f50e9c109285dc73:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  fset);.  sqlite3
0400: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0410: 2d 3e 70 57 69 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pWith);.}../*.
0420: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0430: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0440: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0450: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0460: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0470: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0480: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0490: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
04a0: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
04b0: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
04c0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04d0: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
04e0: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
04f0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0500: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0510: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0520: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0530: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0540: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0550: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0560: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0570: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0580: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0590: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
05a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
05b0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
05c0: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
05d0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
05e0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
05f0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0600: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0610: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0620: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0630: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0640: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0650: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0660: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0670: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0680: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0690: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
06a0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
06b0: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
06c0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
06d0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
06e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
06f0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0700: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0710: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0720: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0730: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0740: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0750: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0760: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0770: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0780: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0790: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
07a0: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
07b0: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07c0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07d0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07f0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0810: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0820: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0830: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0840: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0850: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0860: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0870: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0880: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0890: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
08a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
08b0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08c0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08d0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0900: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0910: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0920: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0930: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0940: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0950: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0960: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0970: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0980: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0990: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
09a0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09c0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09e0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09f0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0a00: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
0a10: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a20: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a30: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
0a40: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
0a50: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
0a60: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
0a70: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
0a80: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
0a90: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
0aa0: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
0ab0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0ac0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0ad0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ae0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0af0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0b00: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  ] = -1;.  if( db
0b10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0b20: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
0b30: 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ct(db, pNew);.  
0b40: 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61    if( pNew!=&sta
0b50: 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62  ndin ) sqlite3Db
0b60: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
0b70: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
0b80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
0b90: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
0ba0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
0bb0: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
0bc0: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
0bd0: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
0be0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0bf0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0c00: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0c10: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0c20: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0c40: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0c50: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0c60: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0c70: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0c80: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0c90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0ca0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
0cb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0cc0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
0cd0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
0ce0: 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a   in a compound..
0cf0: 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  */.static Select
0d00: 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28   *findRightmost(
0d10: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68  Select *p){.  wh
0d20: 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20  ile( p->pNext ) 
0d30: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
0d40: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0d50: 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20  ** Given 1 to 3 
0d60: 69 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63  identifiers prec
0d70: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
0d80: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
0d90: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
0da0: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
0db0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
0dc0: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
0dd0: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
0de0: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
0df0: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
0e00: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
0e10: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0e20: 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
0e30: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0e40: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0e50: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
0e60: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
0e70: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
0e80: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
0e90: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
0ea0: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
0eb0: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0ec0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0ed0: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0ee0: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0ef0: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0f00: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0f10: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0f20: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0f30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0f40: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0f50: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0f60: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0f70: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0f80: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0f90: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0fa0: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20  Token *p;.      
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33         /*   0123
0fd0: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
0fe0: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 20 2a   123456789 123 *
0ff0: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
1000: 20 63 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d   char zKeyText[]
1010: 20 3d 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75   = "naturaleftou
1020: 74 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72  terightfullinner
1030: 63 72 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63  cross";.  static
1040: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
1050: 20 20 20 20 75 38 20 69 3b 20 20 20 20 20 20 20      u8 i;       
1060: 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
1070: 20 6b 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e   keyword text in
1080: 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20   zKeyText[] */. 
1090: 20 20 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20     u8 nChar;    
10a0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
10b0: 20 6b 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72   keyword in char
10c0: 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38  acters */.    u8
10d0: 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f   code;     /* Jo
10e0: 69 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a  in type mask */.
10f0: 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d    } aKeyword[] =
1100: 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61   {.    /* natura
1110: 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54  l */ { 0,  7, JT
1120: 5f 4e 41 54 55 52 41 4c 20 20 20 20 20 20 20 20  _NATURAL        
1130: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1140: 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36  * left    */ { 6
1150: 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54  ,  4, JT_LEFT|JT
1160: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20  _OUTER          
1170: 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20  },.    /* outer 
1180: 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54    */ { 10, 5, JT
1190: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20  _OUTER          
11a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
11b0: 2a 20 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31  * right   */ { 1
11c0: 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a  4, 5, JT_RIGHT|J
11d0: 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20  T_OUTER         
11e0: 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20  },.    /* full  
11f0: 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54    */ { 19, 4, JT
1200: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
1210: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f  T_OUTER },.    /
1220: 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32  * inner   */ { 2
1230: 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20  3, 5, JT_INNER  
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20  },.    /* cross 
1260: 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54    */ { 28, 5, JT
1270: 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20  _INNER|JT_CROSS 
1280: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
1290: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70    int i, j;.  ap
12a0: 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61  All[0] = pA;.  a
12b0: 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20  pAll[1] = pB;.  
12c0: 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20  apAll[2] = pC;. 
12d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26   for(i=0; i<3 &&
12e0: 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   apAll[i]; i++){
12f0: 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69  .    p = apAll[i
1300: 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ];.    for(j=0; 
1310: 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  j<ArraySize(aKey
1320: 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  word); j++){.   
1330: 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65     if( p->n==aKe
1340: 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a  yword[j].nChar .
1350: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
1360: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
1370: 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54  ar*)p->z, &zKeyT
1380: 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  ext[aKeyword[j].
1390: 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a  i], p->n)==0 ){.
13a0: 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65          jointype
13b0: 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e   |= aKeyword[j].
13c0: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72  code;.        br
13d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
13e0: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
13f0: 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c   j==0 || j==1 ||
1400: 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c   j==2 || j==3 ||
1410: 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c   j==4 || j==5 ||
1420: 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28   j==6 );.    if(
1430: 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b   j>=ArraySize(aK
1440: 65 79 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20  eyword) ){.     
1450: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f   jointype |= JT_
1460: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1470: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1480: 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79  if(.     (jointy
1490: 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a  pe & (JT_INNER|J
14a0: 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49  T_OUTER))==(JT_I
14b0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c  NNER|JT_OUTER) |
14c0: 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  |.     (jointype
14d0: 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a   & JT_ERROR)!=0.
14e0: 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
14f0: 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a  har *zSp = " ";.
1500: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 21 3d      assert( pB!=
1510: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d  0 );.    if( pC=
1520: 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20  =0 ){ zSp++; }. 
1530: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1540: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
1550: 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  own or unsupport
1560: 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a  ed join type: ".
1570: 20 20 20 20 20 20 20 22 25 54 20 25 54 25 73 25         "%T %T%s%
1580: 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c  T", pA, pB, zSp,
1590: 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79   pC);.    jointy
15a0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
15b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e   }else if( (join
15c0: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
15d0: 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
15e0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
15f0: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29  _LEFT|JT_RIGHT))
1600: 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  !=JT_LEFT ){.   
1610: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1620: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1630: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
1640: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
1650: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
1660: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
1670: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1680: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
1690: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
16a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
16b0: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
16c0: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
16d0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
16e0: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
16f0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
1700: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1710: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
1720: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
1730: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
1740: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1750: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
1760: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1770: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1780: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1790: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
17a0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
17b0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
17c0: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
17d0: 66 69 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69  first N tables i
17e0: 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66  n pSrc, from lef
17f0: 74 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b  t to right, look
1800: 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  ing for a.** tab
1810: 6c 65 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  le that has a co
1820: 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e  lumn named zCol.
1830: 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f    .**.** When fo
1840: 75 6e 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20  und, set *piTab 
1850: 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68  and *piCol to th
1860: 65 20 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e  e table index an
1870: 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a  d column index.*
1880: 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e  * of the matchin
1890: 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74  g column and ret
18a0: 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20  urn TRUE..**.** 
18b0: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65  If not found, re
18c0: 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73  turn FALSE..*/.s
18d0: 74 61 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41  tatic int tableA
18e0: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20  ndColumnIndex(. 
18f0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1900: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
1910: 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72  f tables to sear
1920: 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ch */.  int N,  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1940: 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  Number of tables
1950: 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f   in pSrc->a[] to
1960: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e   search */.  con
1970: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1980: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1990: 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c   column we are l
19a0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
19b0: 69 6e 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20  int *piTab,     
19c0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e       /* Write in
19d0: 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d  dex of pSrc->a[]
19e0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
19f0: 70 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20  piCol           
1a00: 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f  /* Write index o
1a10: 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62  f pSrc->a[*piTab
1a20: 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68  ].pTab->aCol[] h
1a30: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1a40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1a50: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1a60: 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
1a70: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
1a80: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
1a90: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
1aa0: 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a   matching zCol *
1ab0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 69  /..  assert( (pi
1ac0: 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d  Tab==0)==(piCol=
1ad0: 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20  =0) );  /* Both 
1ae0: 6f 72 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e  or neither are N
1af0: 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ULL */.  for(i=0
1b00: 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<N; i++){.   
1b10: 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e   iCol = columnIn
1b20: 64 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  dex(pSrc->a[i].p
1b30: 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Tab, zCol);.    
1b40: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
1b50: 20 20 20 20 20 69 66 28 20 70 69 54 61 62 20 29       if( piTab )
1b60: 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 54 61 62  {.        *piTab
1b70: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70   = i;.        *p
1b80: 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  iCol = iCol;.   
1b90: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1ba0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1bb0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1bc0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1bd0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
1be0: 20 74 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62   terms implied b
1bf0: 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f  y JOIN syntax to
1c00: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
1c10: 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
1c20: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
1c30: 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74  ement. The new t
1c40: 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73  erm, which.** is
1c50: 20 41 4e 44 65 64 20 77 69 74 68 20 74 68 65 20   ANDed with the 
1c60: 65 78 69 73 74 69 6e 67 20 57 48 45 52 45 20 63  existing WHERE c
1c70: 6c 61 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65  lause, is of the
1c80: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
1c90: 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62  (tab1.col1 = tab
1ca0: 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68  2.col2).**.** wh
1cb0: 65 72 65 20 74 61 62 31 20 69 73 20 74 68 65 20  ere tab1 is the 
1cc0: 69 53 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e  iSrc'th table in
1cd0: 20 53 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e   SrcList pSrc an
1ce0: 64 20 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a  d tab2 is the .*
1cf0: 2a 20 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43  * (iSrc+1)'th. C
1d00: 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f  olumn col1 is co
1d10: 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66  lumn iColLeft of
1d20: 20 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20   tab1, and col2 
1d30: 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  is.** column iCo
1d40: 6c 52 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a  lRight of tab2..
1d50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1d60: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50  ddWhereTerm(.  P
1d70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d90: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1da0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1db0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
1dc0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1dd0: 66 20 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d  f tables in FROM
1de0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
1df0: 20 69 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20   iLeft,         
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e10: 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 74  Index of first t
1e20: 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20  able to join in 
1e30: 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43  pSrc */.  int iC
1e40: 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  olLeft,         
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1e60: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
1e70: 66 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20  first table */. 
1e80: 20 69 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20   int iRight,    
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63   /* Index of sec
1eb0: 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72  ond table in pSr
1ec0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52  c */.  int iColR
1ed0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
1ee0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1ef0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63  of column in sec
1f00: 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ond table */.  i
1f10: 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20  nt isOuterJoin, 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1f40: 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20  s an OUTER join 
1f50: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68  */.  Expr **ppWh
1f60: 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ere             
1f70: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1f80: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1f90: 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b   to add to */.){
1fa0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1fb0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
1fc0: 78 70 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72  xpr *pE1;.  Expr
1fd0: 20 2a 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70   *pE2;.  Expr *p
1fe0: 45 71 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  Eq;..  assert( i
1ff0: 4c 65 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20  Left<iRight );. 
2000: 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e   assert( pSrc->n
2010: 53 72 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20  Src>iRight );.  
2020: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
2030: 69 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20  iLeft].pTab );. 
2040: 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61   assert( pSrc->a
2050: 5b 69 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b  [iRight].pTab );
2060: 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65  ..  pE1 = sqlite
2070: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2080: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66  r(db, pSrc, iLef
2090: 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20  t, iColLeft);.  
20a0: 70 45 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE2 = sqlite3Cre
20b0: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
20c0: 2c 20 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20  , pSrc, iRight, 
20d0: 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70  iColRight);..  p
20e0: 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  Eq = sqlite3PExp
20f0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c  r(pParse, TK_EQ,
2100: 20 70 45 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20   pE1, pE2, 0);. 
2110: 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75   if( pEq && isOu
2120: 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45  terJoin ){.    E
2130: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2140: 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  Eq, EP_FromJoin)
2150: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2160: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2170: 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  Eq, EP_TokenOnly
2180: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2190: 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
21a0: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e  operty(pEq, EP_N
21b0: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45  oReduce);.    pE
21c0: 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  q->iRightJoinTab
21d0: 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69  le = (i16)pE2->i
21e0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70  Table;.  }.  *pp
21f0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
2200: 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68  xprAnd(db, *ppWh
2210: 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a  ere, pEq);.}../*
2220: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
2230: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2240: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
2250: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
2260: 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65  ssion..** And se
2270: 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68  t the Expr.iRigh
2280: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54  tJoinTable to iT
2290: 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74  able for every t
22a0: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  erm in the.** ex
22b0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
22c0: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
22d0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
22e0: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
22f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
2300: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
2310: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
2320: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
2330: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
2340: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
2350: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
2360: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
2370: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2380: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
2390: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
23a0: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
23b0: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
23c0: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
23d0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
23e0: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
23f0: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
2400: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
2410: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
2420: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
2430: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2440: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
2450: 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  The Expr.iRightJ
2460: 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74  oinTable tells t
2470: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2480: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
2490: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
24a0: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62  n depends on tab
24b0: 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  le iRightJoinTab
24c0: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  le even if that 
24d0: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
24e0: 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69  explicitly menti
24f0: 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  oned in the expr
2500: 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e  ession.  That in
2510: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
2520: 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73  ded.** for cases
2530: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
2540: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
2550: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2560: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
2570: 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a  AND t1.x=5.**.**
2580: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
2590: 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72  e needs to defer
25a0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
25b0: 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74   the t1.x=5.** t
25c0: 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20  erm until after 
25d0: 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74  the t2 loop of t
25e0: 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61  he join.  In tha
25f0: 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c  t way, a.** NULL
2600: 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   t2 row will be 
2610: 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65  inserted wheneve
2620: 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77  r t1.x!=5.  If w
2630: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65  e do not.** defe
2640: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2650: 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c  f t1.x=5, it wil
2660: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  l be processed i
2670: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
2680: 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ter the t1 loop 
2690: 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31  and rows with t1
26a0: 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72  .x!=5 will never
26b0: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
26c0: 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20  e output, which 
26d0: 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f  is incorrect..*/
26e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
26f0: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
2700: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2710: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2720: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2730: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
2740: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2750: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2760: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2770: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2780: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2790: 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64  erty(p, EP_NoRed
27a0: 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69  uce);.    p->iRi
27b0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
27c0: 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20  i16)iTable;.    
27d0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
27e0: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
27f0: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
2800: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  } .}../*.** 
2810: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f  This routine pro
2820: 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20  cesses the join 
2830: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
2840: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2850: 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53  nt..** ON and US
2860: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
2870: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65  converted into e
2880: 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68  xtra terms of th
2890: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
28a0: 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73  ** NATURAL joins
28b0: 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74   also create ext
28c0: 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ra WHERE clause 
28d0: 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  terms..**.** The
28e0: 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d   terms of a FROM
28f0: 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74   clause are cont
2900: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c  ained in the Sel
2910: 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75  ect.pSrc structu
2920: 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20  re..** The left 
2930: 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68  most table is th
2940: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2950: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54   Select.pSrc.  T
2960: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a  he right-most.**
2970: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61   table is the la
2980: 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a  st entry.  The j
2990: 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  oin operator is 
29a0: 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72  held in the entr
29b0: 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74  y to.** the left
29c0: 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20  .  Thus entry 0 
29d0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69  contains the joi
29e0: 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74  n operator for t
29f0: 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a  he join between.
2a00: 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64  ** entries 0 and
2a10: 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55   1.  Any ON or U
2a20: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73  SING clauses ass
2a30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2a40: 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73   join are.** als
2a50: 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  o attached to th
2a60: 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a  e left entry..**
2a70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a80: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2a90: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
2aa0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74  countered..*/.st
2ab0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50  atic int sqliteP
2ac0: 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65  rocessJoin(Parse
2ad0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2ae0: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
2af0: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20  *pSrc;          
2b00: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74          /* All t
2b10: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2b20: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  M clause */.  in
2b30: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b50: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2b60: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2b70: 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20  st_item *pLeft; 
2b80: 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c      /* Left tabl
2b90: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
2ba0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2bb0: 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b  st_item *pRight;
2bc0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62      /* Right tab
2bd0: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
2be0: 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  */..  pSrc = p->
2bf0: 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20  pSrc;.  pLeft = 
2c00: 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70  &pSrc->a[0];.  p
2c10: 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31  Right = &pLeft[1
2c20: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
2c30: 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b  pSrc->nSrc-1; i+
2c40: 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65  +, pRight++, pLe
2c50: 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  ft++){.    Table
2c60: 20 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65   *pLeftTab = pLe
2c70: 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61  ft->pTab;.    Ta
2c80: 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d  ble *pRightTab =
2c90: 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20   pRight->pTab;. 
2ca0: 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a     int isOuter;.
2cb0: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
2cc0: 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52  LeftTab==0 || pR
2cd0: 69 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f  ightTab==0) ) co
2ce0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75  ntinue;.    isOu
2cf0: 74 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a  ter = (pRight->j
2d00: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
2d10: 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  ER)!=0;..    /* 
2d20: 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c  When the NATURAL
2d30: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
2d40: 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63  ent, add WHERE c
2d50: 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a  lause terms for.
2d60: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c      ** every col
2d70: 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f  umn that the two
2d80: 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20   tables have in 
2d90: 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  common..    */. 
2da0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a     if( pRight->j
2db0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2dc0: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
2dd0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c  ( pRight->pOn ||
2de0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2df0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2e10: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
2e20: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
2e30: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
2e40: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2e50: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
2e60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2e70: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2e80: 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e  0; j<pRightTab->
2e90: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
2ea0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
2eb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f     /* Name of co
2ec0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68  lumn in the righ
2ed0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
2ee0: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
2ef0: 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65    /* Matching le
2f00: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ft table */.    
2f10: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
2f20: 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63  ;  /* Matching c
2f30: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66  olumn in the lef
2f40: 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  t table */..    
2f50: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67      zName = pRig
2f60: 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  htTab->aCol[j].z
2f70: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
2f80: 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  ( tableAndColumn
2f90: 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c  Index(pSrc, i+1,
2fa0: 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20   zName, &iLeft, 
2fb0: 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20  &iLeftCol) ){.  
2fc0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
2fd0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72  Term(pParse, pSr
2fe0: 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43  c, iLeft, iLeftC
2ff0: 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20  ol, i+1, j,.    
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
3020: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
3030: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3040: 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f  ..    /* Disallo
3050: 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  w both ON and US
3060: 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74  ING clauses in t
3070: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20  he same join.   
3080: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
3090: 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68  ht->pOn && pRigh
30a0: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
30b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
30c0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
30d0: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
30e0: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
30f0: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
3100: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
3110: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
3120: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
3130: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
3140: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
3150: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
3160: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
3170: 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72    ** an AND oper
3180: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
3190: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
31a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
31b0: 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45  Outer ) setJoinE
31c0: 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c  xpr(pRight->pOn,
31d0: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
31e0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65  );.      p->pWhe
31f0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
3200: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
3210: 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68  p->pWhere, pRigh
3220: 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70  t->pOn);.      p
3230: 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a  Right->pOn = 0;.
3240: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
3250: 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73  eate extra terms
3260: 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   on the WHERE cl
3270: 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f  ause for each co
3280: 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a  lumn named.    *
3290: 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  * in the USING c
32a0: 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a  lause.  Example:
32b0: 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c   If the two tabl
32c0: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20  es to be joined 
32d0: 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e  are .    ** A an
32e0: 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e  d B and the USIN
32f0: 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58  G clause names X
3300: 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e  , Y, and Z, then
3310: 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a   add this.    **
3320: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
3330: 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58  ause:    A.X=B.X
3340: 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44   AND A.Y=B.Y AND
3350: 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20   A.Z=B.Z.    ** 
3360: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
3370: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65  if any column me
3380: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55  ntioned in the U
3390: 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20  SING clause is. 
33a0: 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69     ** not contai
33b0: 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ned in both tabl
33c0: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e  es to be joined.
33d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33e0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
33f0: 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a  {.      IdList *
3400: 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e  pList = pRight->
3410: 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f  pUsing;.      fo
3420: 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e  r(j=0; j<pList->
3430: 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nId; j++){.     
3440: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20     char *zName; 
3450: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3460: 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55  he term in the U
3470: 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20  SING clause */. 
3480: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3490: 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ;       /* Table
34a0: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74   on the left wit
34b0: 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  h matching colum
34c0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
34d0: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20    int iLeftCol; 
34e0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
34f0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3500: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65  column on the le
3510: 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ft */.        in
3520: 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f  t iRightCol;   /
3530: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
3540: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
3550: 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  mn on the right 
3560: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  */..        zNam
3570: 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  e = pList->a[j].
3580: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3590: 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d  RightCol = colum
35a0: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
35b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
35c0: 20 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c    if( iRightCol<
35d0: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74  0.         || !t
35e0: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
35f0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
3600: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
3610: 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  eftCol).        
3620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
3630: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3640: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69  rse, "cannot joi
3650: 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25  n using column %
3660: 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20  s - column ".   
3670: 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72           "not pr
3680: 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61  esent in both ta
3690: 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bles", zName);. 
36a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
36b0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
36c0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
36d0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
36e0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
36f0: 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c   i+1, iRightCol,
3700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3710: 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26        isOuter, &
3720: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
3730: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
3740: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3750: 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69  ** Insert code i
3760: 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c  nto "v" that wil
3770: 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72  l push the recor
3780: 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  d on the top of 
3790: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74  the.** stack int
37a0: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
37b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
37c0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
37d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
37e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
37f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3800: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
3810: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
3820: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
3830: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
3840: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
3850: 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ole SELECT state
3860: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ment */.  int re
3870: 67 44 61 74 61 20 20 20 20 20 20 20 20 20 20 20  gData           
3880: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
3890: 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20  ding data to be 
38a0: 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 56  sorted */.){.  V
38b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
38c0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e 45  >pVdbe;.  int nE
38d0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
38e0: 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 72 65 67  nExpr;.  int reg
38f0: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
3900: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
3910: 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69  e, nExpr+2);.  i
3920: 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  nt regRecord = s
3930: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
3940: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
3950: 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  op;.  sqlite3Exp
3960: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
3970: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  se);.  sqlite3Ex
3980: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
3990: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
39a0: 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20   regBase, 0);.  
39b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
39c0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
39d0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
39e0: 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45  rsor, regBase+nE
39f0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
3a00: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
3a10: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
3a20: 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31 29  Base+nExpr+1, 1)
3a30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3a40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
3a50: 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
3a60: 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67 52   nExpr + 2, regR
3a70: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 53  ecord);.  if( pS
3a80: 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
3a90: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
3aa0: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f  {.    op = OP_So
3ab0: 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65  rterInsert;.  }e
3ac0: 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  lse{.    op = OP
3ad0: 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a  _IdxInsert;.  }.
3ae0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3af0: 4f 70 32 28 76 2c 20 6f 70 2c 20 70 4f 72 64 65  Op2(v, op, pOrde
3b00: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  rBy->iECursor, r
3b10: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
3b20: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
3b30: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
3b40: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
3b50: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
3b60: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
3b70: 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 66  , nExpr+2);.  if
3b80: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  ( pSelect->iLimi
3b90: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  t ){.    int add
3ba0: 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69  r1, addr2;.    i
3bb0: 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69  nt iLimit;.    i
3bc0: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66  f( pSelect->iOff
3bd0: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69  set ){.      iLi
3be0: 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69  mit = pSelect->i
3bf0: 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65  Offset+1;.    }e
3c00: 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69  lse{.      iLimi
3c10: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  t = pSelect->iLi
3c20: 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  mit;.    }.    a
3c30: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
3c40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
3c50: 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a  fZero, iLimit);.
3c60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3c70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
3c80: 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b  mm, iLimit, -1);
3c90: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
3ca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
3cb0: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
3cc0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3cd0: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
3ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3cf0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c  dOp1(v, OP_Last,
3d00: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3d10: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
3d20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3d30: 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65 72  P_Delete, pOrder
3d40: 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  By->iECursor);. 
3d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3d60: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
3d70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3d80: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
3d90: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
3da0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3db0: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
3dc0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
3dd0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
3de0: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
3df0: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
3e00: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
3e10: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
3e20: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
3e30: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
3e40: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3e50: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
3e60: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
3e70: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
3e80: 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  && iContinue!=0 
3e90: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
3ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3eb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
3ec0: 49 6d 6d 2c 20 69 4f 66 66 73 65 74 2c 20 2d 31  Imm, iOffset, -1
3ed0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
3ee0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3ef0: 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 69 4f 66  v, OP_IfNeg, iOf
3f00: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
3f10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3f20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
3f30: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
3f40: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
3f50: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
3f60: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
3f70: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3f80: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
3f90: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
3fa0: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
3fb0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
3fc0: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
3fd0: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
3fe0: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
3ff0: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
4000: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
4010: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
4020: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
4030: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
4040: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
4050: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
4060: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
4070: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
4080: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
4090: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
40a0: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
40b0: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
40c0: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
40d0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
40e0: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
40f0: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
4100: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
4110: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
4120: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
4130: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
4140: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
4150: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4160: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
4170: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
4180: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
4190: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
41a0: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
41b0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
41c0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
41d0: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
41e0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
41f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4200: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
4210: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
4220: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
4230: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
4240: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
4250: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
4260: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
4270: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
4280: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
4290: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
42a0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
42b0: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
42c0: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
42d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
42e0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
42f0: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
4300: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4310: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
4320: 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20  t, iTab, r1);.  
4330: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4340: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
4350: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
4360: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4370: 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
4380: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
4390: 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  ge when a SELECT
43a0: 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20   is used within 
43b0: 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  a subexpression.
43c0: 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61  ** (example:  "a
43d0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52   IN (SELECT * FR
43e0: 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74 20  OM table)") but 
43f0: 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  it has more than
4400: 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c   1 result.** col
4410: 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73  umn.  We do this
4420: 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65   in a subroutine
4430: 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72 72   because the err
4440: 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72  or used to occur
4450: 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  .** in multiple 
4460: 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65 72  places.  (The er
4470: 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  ror only occurs 
4480: 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77  in one place now
4490: 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61  , but we.** reta
44a0: 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  in the subroutin
44b0: 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f  e to minimize co
44c0: 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a  de disruption.).
44d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
44e0: 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
44f0: 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20  nSelectError(.  
4500: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4510: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
4520: 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65  ntext. */.  Sele
4530: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
4540: 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
4550: 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  of SELECT result
4560: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72  s */.  int nExpr
4570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4580: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
4590: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
45a0: 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b   by SELECT */.){
45b0: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
45c0: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
45d0: 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65  f( nExpr>1 && (e
45e0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
45f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
4600: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4610: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4620: 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72  "only a single r
4630: 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f  esult allowed fo
4640: 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45  r ".       "a SE
4650: 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
4660: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
4670: 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  on");.    return
4680: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
4690: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
46a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
46b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
46c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
46d0: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
46e0: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
46f0: 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f   about.** how to
4700: 20 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53   process the DIS
4710: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74  TINCT keyword, t
4720: 6f 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69  o simplify passi
4730: 6e 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74  ng that informat
4740: 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ion.** into the 
4750: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
4760: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79  ) routine..*/.ty
4770: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73  pedef struct Dis
4780: 74 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63  tinctCtx Distinc
4790: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73  tCtx;.struct Dis
47a0: 74 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20  tinctCtx {.  u8 
47b0: 69 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  isTnct;      /* 
47c0: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
47d0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
47e0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20  present */.  u8 
47f0: 65 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20  eTnctType;   /* 
4800: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
4810: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72  _DISTINCT_* oper
4820: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74  ators */.  int t
4830: 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70  abTnct;    /* Ep
4840: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
4850: 65 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ed for DISTINCT 
4860: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
4870: 69 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20  int addrTnct;   
4880: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
4890: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f  _OpenEphemeral o
48a0: 70 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63  pcode for tabTnc
48b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  t */.};../*.** T
48c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
48d0: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
48e0: 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66  or the inside of
48f0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
4900: 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a  ** of a SELECT..
4910: 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20  **.** If srcTab 
4920: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
4930: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
4940: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
4950: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
4960: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
4970: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
4980: 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a    If srcTab is.*
4990: 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20  * zero or more, 
49a0: 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c  then data is pul
49b0: 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20  led from srcTab 
49c0: 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73  and pEList is us
49d0: 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67  ed only .** to g
49e0: 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d 6e  et number column
49f0: 73 20 61 6e 64 20 74 68 65 20 64 61 74 61 74 79  s and the dataty
4a00: 70 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  pe for each colu
4a10: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
4a20: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
4a30: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
4a40: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
4a50: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
4a60: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
4a70: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
4a80: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
4a90: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
4aa0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
4ab0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4ac0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
4ad0: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69  st of values bei
4ae0: 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ng extracted */.
4af0: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
4b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
4b10: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
4b20: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
4b30: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
4b40: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
4b50: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
4b60: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
4b70: 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
4b80: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20   *pDistinct, /* 
4b90: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
4ba0: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
4bb0: 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ess DISTINCT */.
4bc0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
4bd0: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
4be0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
4bf0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
4c00: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
4c10: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
4c20: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
4c30: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
4c40: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
4c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
4c70: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
4c80: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
4c90: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4ca0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
4cb0: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
4cc0: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
4cd0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4ce0: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4cf0: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
4d00: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
4d10: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
4d20: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
4d30: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ng result set */
4d40: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
4d50: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
4d60: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
4d70: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
4d80: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
4d90: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20  st->iSDParm; /* 
4da0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
4db0: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
4dc0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
4dd0: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
4de0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4df0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
4e00: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
4e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
4e20: 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69  st!=0 );.  hasDi
4e30: 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e  stinct = pDistin
4e40: 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e  ct ? pDistinct->
4e50: 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52  eTnctType : WHER
4e60: 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
4e70: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
4e80: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
4e90: 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66  ct ){.    codeOf
4ea0: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
4eb0: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
4ec0: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
4ed0: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
4ee0: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65  umns..  */.  nRe
4ef0: 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74  sultCol = pEList
4f00: 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69 66 28 20  ->nExpr;..  if( 
4f10: 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
4f20: 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53  ){.    pDest->iS
4f30: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
4f40: 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
4f50: 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c  ->nMem += nResul
4f60: 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tCol;.  }else if
4f70: 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 6e  ( pDest->iSdst+n
4f80: 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70 50 61 72  ResultCol > pPar
4f90: 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20 20 20 20  se->nMem ){.    
4fa0: 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20 65 72  /* This is an er
4fb0: 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 74 68  ror condition th
4fc0: 61 74 20 63 61 6e 20 72 65 73 75 6c 74 2c 20 66  at can result, f
4fd0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
4fe0: 20 61 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a   a SELECT.    **
4ff0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
5000: 6e 64 20 73 69 64 65 20 6f 66 20 61 6e 20 49 4e  nd side of an IN
5010: 53 45 52 54 20 63 6f 6e 74 61 69 6e 73 20 6d 6f  SERT contains mo
5020: 72 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  re result column
5030: 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 74 68  s than.    ** th
5040: 65 72 65 20 61 72 65 20 63 6f 6c 75 6d 6e 73 20  ere are columns 
5050: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20  in the table on 
5060: 74 68 65 20 6c 65 66 74 2e 20 20 54 68 65 20 65  the left.  The e
5070: 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 63 61 75  rror will be cau
5080: 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 72  ght.    ** and r
5090: 65 70 6f 72 74 65 64 20 6c 61 74 65 72 2e 20 20  eported later.  
50a0: 42 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  But we need to m
50b0: 61 6b 65 20 73 75 72 65 20 65 6e 6f 75 67 68 20  ake sure enough 
50c0: 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63 61  memory is alloca
50d0: 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 61 76  ted.    ** to av
50e0: 6f 69 64 20 6f 74 68 65 72 20 73 70 75 72 69 6f  oid other spurio
50f0: 75 73 20 65 72 72 6f 72 73 20 69 6e 20 74 68 65  us errors in the
5100: 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f 0a 20 20   meantime. */.  
5110: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
5120: 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20  = nResultCol;.  
5130: 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74  }.  pDest->nSdst
5140: 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20   = nResultCol;. 
5150: 20 72 65 67 52 65 73 75 6c 74 20 3d 20 70 44 65   regResult = pDe
5160: 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20 69 66 28  st->iSdst;.  if(
5170: 20 73 72 63 54 61 62 3e 3d 30 20 29 7b 0a 20 20   srcTab>=0 ){.  
5180: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
5190: 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  sultCol; i++){. 
51a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
51b0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
51c0: 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20 69 2c 20  umn, srcTab, i, 
51d0: 72 65 67 52 65 73 75 6c 74 2b 69 29 3b 0a 20 20  regResult+i);.  
51e0: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
51f0: 28 76 2c 20 22 25 73 22 2c 20 70 45 4c 69 73 74  (v, "%s", pEList
5200: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 29 3b 0a  ->a[i].zName));.
5210: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
5220: 28 20 65 44 65 73 74 21 3d 53 52 54 5f 45 78 69  ( eDest!=SRT_Exi
5230: 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  sts ){.    /* If
5240: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
5250: 20 69 73 20 61 6e 20 45 58 49 53 54 53 28 2e 2e   is an EXISTS(..
5260: 2e 29 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74  .) expression, t
5270: 68 65 20 61 63 74 75 61 6c 0a 20 20 20 20 2a 2a  he actual.    **
5280: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
5290: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 61   by the SELECT a
52a0: 72 65 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  re not required.
52b0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
52c0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
52d0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
52e0: 73 74 2c 20 72 65 67 52 65 73 75 6c 74 2c 0a 20  st, regResult,. 
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5300: 20 20 20 20 20 20 20 20 20 20 20 28 65 44 65 73             (eDes
5310: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 29 3f 53  t==SRT_Output)?S
5320: 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 3a 30  QLITE_ECEL_DUP:0
5330: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
5340: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
5350: 77 6f 72 64 20 77 61 73 20 70 72 65 73 65 6e 74  word was present
5360: 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   on the SELECT s
5370: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e  tatement.  ** an
5380: 64 20 74 68 69 73 20 72 6f 77 20 68 61 73 20 62  d this row has b
5390: 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c  een seen before,
53a0: 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b   then do not mak
53b0: 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20  e this row.  ** 
53c0: 70 61 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  part of the resu
53d0: 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68  lt..  */.  if( h
53e0: 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  asDistinct ){.  
53f0: 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74 69    switch( pDisti
5400: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 29  nct->eTnctType )
5410: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45  {.      case WHE
5420: 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
5430: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 56  RED: {.        V
5440: 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20  dbeOp *pOp;     
5450: 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e         /* No lon
5460: 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70 65  ger required Ope
5470: 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74 72  nEphemeral instr
5480: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  . */.        int
5490: 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20 20   iJump;         
54a0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73       /* Jump des
54b0: 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  tination */.    
54c0: 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b      int regPrev;
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
54e0: 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74  revious row cont
54f0: 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ent */..        
5500: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
5510: 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  e for the previo
5520: 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20  us row */.      
5530: 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61 72    regPrev = pPar
5540: 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20  se->nMem+1;.    
5550: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
5560: 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a   += nResultCol;.
5570: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  .        /* Chan
5580: 67 65 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70  ge the OP_OpenEp
5590: 68 65 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61  hemeral coded ea
55a0: 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e  rlier to an OP_N
55b0: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  ull.        ** s
55c0: 65 74 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61  ets the MEM_Clea
55d0: 72 65 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66  red bit on the f
55e0: 69 72 73 74 20 72 65 67 69 73 74 65 72 20 6f 66  irst register of
55f0: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
5600: 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20  previous value. 
5610: 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65   This will cause
5620: 20 74 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77   the OP_Ne below
5630: 20 74 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20   to always.     
5640: 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68     ** fail on th
5650: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
5660: 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76  n of the loop ev
5670: 65 6e 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  en if the first.
5680: 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69          ** row i
5690: 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20  s all NULLs..   
56a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
56b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
56c0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
56d0: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
56e0: 0a 20 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73  .        pOp = s
56f0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
5700: 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64  v, pDistinct->ad
5710: 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20  drTnct);.       
5720: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
5730: 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20  P_Null;.        
5740: 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20  pOp->p1 = 1;.   
5750: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72       pOp->p2 = r
5760: 65 67 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20  egPrev;..       
5770: 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33   iJump = sqlite3
5780: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
5790: 76 29 20 2b 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  v) + nResultCol;
57a0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
57b0: 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 3b 20  ; i<nResultCol; 
57c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
57d0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
57e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
57f0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 4c 69  Seq(pParse, pELi
5800: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
5810: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
5820: 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 20 29 7b  <nResultCol-1 ){
5830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
5840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5850: 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73 75  , OP_Ne, regResu
5860: 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65 67  lt+i, iJump, reg
5870: 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20  Prev+i);.       
5880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
58a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
58b0: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
58c0: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
58d0: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
58e0: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
58f0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
5900: 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68  v, -1, (const ch
5910: 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43  ar *)pColl, P4_C
5920: 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20  OLLSEQ);.       
5930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5940: 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
5950: 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20  _NULLEQ);.      
5960: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
5970: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
5980: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69  urrentAddr(v)==i
5990: 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20 20  Jump );.        
59a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
59b0: 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  3(v, OP_Copy, re
59c0: 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76  gResult, regPrev
59d0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b  , nResultCol-1);
59e0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
59f0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63        }..      c
5a00: 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e  ase WHERE_DISTIN
5a10: 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20  CT_UNIQUE: {.   
5a20: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5a30: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
5a40: 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54  pDistinct->addrT
5a50: 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  nct);.        br
5a60: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
5a70: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
5a80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5a90: 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54  Distinct->eTnctT
5aa0: 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
5ab0: 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b  NCT_UNORDERED );
5ac0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44 69 73  .        codeDis
5ad0: 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44  tinct(pParse, pD
5ae0: 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74  istinct->tabTnct
5af0: 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65  , iContinue, nRe
5b00: 73 75 6c 74 43 6f 6c 2c 20 72 65 67 52 65 73 75  sultCol, regResu
5b10: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  lt);.        bre
5b20: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5b30: 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  }.    if( pOrder
5b40: 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  By==0 ){.      c
5b50: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
5b60: 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
5b70: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ue);.    }.  }..
5b80: 20 20 73 77 69 74 63 68 28 20 65 44 65 73 74 20    switch( eDest 
5b90: 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  ){.    /* In thi
5ba0: 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61  s mode, write ea
5bb0: 63 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 20  ch query result 
5bc0: 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  to the key of th
5bd0: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
5be0: 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ** table iParm..
5bf0: 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
5c00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
5c10: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63  UND_SELECT.    c
5c20: 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b  ase SRT_Union: {
5c30: 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
5c40: 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65       r1 = sqlite
5c50: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
5c60: 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
5c70: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5c80: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
5c90: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
5ca0: 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20  tCol, r1);.     
5cb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5cc0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
5cd0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
5ce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
5cf0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
5d00: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
5d10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
5d20: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
5d30: 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
5d40: 71 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75  query result, bu
5d50: 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  t instead of.   
5d60: 20 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20   ** saving that 
5d70: 72 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61  record, use it a
5d80: 73 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74  s a key to delet
5d90: 65 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a  e elements from.
5da0: 20 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f      ** the tempo
5db0: 72 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d  rary table iParm
5dc0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
5dd0: 65 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a  e SRT_Except: {.
5de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5df0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64  eAddOp3(v, OP_Id
5e00: 78 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20  xDelete, iParm, 
5e10: 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75  regResult, nResu
5e20: 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72  ltCol);.      br
5e30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5e40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
5e50: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
5e60: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72   */..    /* Stor
5e70: 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  e the result as 
5e80: 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69  data using a uni
5e90: 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a  que key..    */.
5ea0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 44 69 73      case SRT_Dis
5eb0: 74 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65  tTable:.    case
5ec0: 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20   SRT_Table:.    
5ed0: 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61  case SRT_EphemTa
5ee0: 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  b: {.      int r
5ef0: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
5f00: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5f10: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
5f20: 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20  Dest==SRT_Table 
5f30: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
5f40: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  e( eDest==SRT_Ep
5f50: 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20  hemTab );.      
5f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5f70: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
5f80: 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e  rd, regResult, n
5f90: 52 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a  ResultCol, r1);.
5fa0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5fb0: 4d 49 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66  MIT_CTE.      if
5fc0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
5fd0: 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
5fe0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
5ff0: 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 54  ination is DistT
6000: 61 62 6c 65 2c 20 74 68 65 6e 20 63 75 72 73 6f  able, then curso
6010: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
6020: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
6030: 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69  n an ephemeral i
6040: 6e 64 65 78 2e 20 49 66 20 74 68 65 20 63 75 72  ndex. If the cur
6050: 72 65 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65  rent row is alre
6060: 61 64 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20  ady present.    
6070: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e      ** in the in
6080: 64 65 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74  dex, do not writ
6090: 65 20 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70  e it to the outp
60a0: 75 74 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20  ut. If not, add 
60b0: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  the.        ** c
60c0: 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68  urrent row to th
60d0: 65 20 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63  e index and proc
60e0: 65 65 64 20 77 69 74 68 20 77 72 69 74 69 6e 67  eed with writing
60f0: 20 69 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20   it to the.     
6100: 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62     ** output tab
6110: 6c 65 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a  le as well.  */.
6120: 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
6130: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
6140: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34  rrentAddr(v) + 4
6150: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6160: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
6170: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72  , OP_Found, iPar
6180: 6d 2b 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30  m+1, addr, r1, 0
6190: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
61a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
61b0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
61c0: 61 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20 20  arm+1, r1);.    
61d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64      assert( pOrd
61e0: 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  erBy==0 );.     
61f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
6200: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
6210: 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f          pushOnto
6220: 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70  Sorter(pParse, p
6230: 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b  OrderBy, p, r1);
6240: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6250: 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
6260: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
6270: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
6280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6290: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
62a0: 69 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a  id, iParm, r2);.
62b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
62c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
62d0: 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72  Insert, iParm, r
62e0: 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20  1, r2);.        
62f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6300: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
6310: 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73  PEND);.        s
6320: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
6330: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
6340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6350: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
6360: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
6370: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6380: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
6390: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
63a0: 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  ERY.    /* If we
63b0: 20 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20   are creating a 
63c0: 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72  set for an "expr
63d0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
63e0: 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20  " construct,.   
63f0: 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73   ** then there s
6400: 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c  hould be a singl
6410: 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74  e item on the st
6420: 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73  ack.  Write this
6430: 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74  .    ** item int
6440: 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20  o the set table 
6450: 77 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e  with bogus data.
6460: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
6470: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
6480: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c    assert( nResul
6490: 74 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20  tCol==1 );.     
64a0: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
64b0: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
64c0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
64d0: 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73  reAffinity(pELis
64e0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
64f0: 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
6500: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
6510: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  By ){.        /*
6520: 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65   At first glance
6530: 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b   you would think
6540: 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69   we could optimi
6550: 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20  ze out the.     
6560: 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69     ** ORDER BY i
6570: 6e 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63  n this case sinc
6580: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65  e the order of e
6590: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65  ntries in the se
65a0: 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65  t.        ** doe
65b0: 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42  s not matter.  B
65c0: 75 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  ut there might b
65d0: 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  e a LIMIT clause
65e0: 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20  , in which.     
65f0: 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f     ** case the o
6600: 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72  rder does matter
6610: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68   */.        push
6620: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
6630: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
6640: 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  regResult);.    
6650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6660: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
6670: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
6680: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
6690: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
66a0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
66b0: 20 72 65 67 52 65 73 75 6c 74 2c 31 2c 72 31 2c   regResult,1,r1,
66c0: 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74   &pDest->affSdst
66d0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
66e0: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
66f0: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
6700: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
6710: 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
6720: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6730: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
6740: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
6750: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
6760: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6770: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   r1);.      }.  
6780: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6790: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20  ..    /* If any 
67a0: 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65  row exist in the
67b0: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63   result set, rec
67c0: 6f 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e  ord that fact an
67d0: 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a  d abort..    */.
67e0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69      case SRT_Exi
67f0: 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  sts: {.      sql
6800: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6810: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
6820: 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f   iParm);.      /
6830: 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
6840: 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
6850: 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
6860: 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
6870: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6880: 49 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61  If this is a sca
6890: 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20  lar select that 
68a0: 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78  is part of an ex
68b0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20  pression, then. 
68c0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20     ** store the 
68d0: 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61  results in the a
68e0: 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72  ppropriate memor
68f0: 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b  y cell and break
6900: 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74   out.    ** of t
6910: 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  he scan loop..  
6920: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
6930: 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61  T_Mem: {.      a
6940: 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f  ssert( nResultCo
6950: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  l==1 );.      if
6960: 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
6970: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
6980: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
6990: 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73  derBy, p, regRes
69a0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ult);.      }els
69b0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
69c0: 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
69d0: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
69e0: 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20  , iParm, 1);.   
69f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
6a00: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75  T clause will ju
6a10: 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  mp out of the lo
6a20: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
6a30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6a40: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
6a50: 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
6a60: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
6a70: 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  /..    case SRT_
6a80: 43 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20  Coroutine:      
6a90: 20 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f   /* Send data to
6aa0: 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f   a co-routine */
6ab0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75  .    case SRT_Ou
6ac0: 74 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f  tput: {        /
6ad0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73  * Return the res
6ae0: 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65  ults */.      te
6af0: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6b00: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
6b10: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6b20: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
6b30: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
6b40: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
6b50: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
6b60: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6b70: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
6b80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6b90: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6ba0: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  d, regResult, nR
6bb0: 65 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20  esultCol, r1);. 
6bc0: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
6bd0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
6be0: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
6bf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6c00: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
6c10: 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
6c20: 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74   }else if( eDest
6c30: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
6c40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6c50: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
6c60: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
6c70: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
6c80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6c90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6ca0: 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f  2(v, OP_ResultRo
6cb0: 77 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52  w, regResult, nR
6cc0: 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20  esultCol);.     
6cd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
6ce0: 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
6cf0: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
6d00: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29  ult, nResultCol)
6d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6d20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
6d30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6d40: 54 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69  T_CTE.    /* Wri
6d50: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  te the results i
6d60: 6e 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71  nto a priority q
6d70: 75 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64  ueue that is ord
6d80: 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a  er according to.
6d90: 20 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f      ** pDest->pO
6da0: 72 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e  rderBy (in pSO).
6db0: 20 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d    pDest->iSDParm
6dc0: 20 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74   (in iParm) is t
6dd0: 68 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e  he cursor for an
6de0: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69  .    ** index wi
6df0: 74 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20  th pSO->nExpr+2 
6e00: 63 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20  columns.  Build 
6e10: 61 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20  a key using pSO 
6e20: 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20  for the first.  
6e30: 20 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20    ** pSO->nExpr 
6e40: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61  columns, then ma
6e50: 6b 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73  ke sure all keys
6e60: 20 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61   are unique by a
6e70: 64 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66  dding a.    ** f
6e80: 69 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65  inal OP_Sequence
6e90: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61   column.  The la
6ea0: 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65  st column is the
6eb0: 20 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f   record as a blo
6ec0: 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
6ed0: 73 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65  se SRT_DistQueue
6ee0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51  :.    case SRT_Q
6ef0: 75 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ueue: {.      in
6f00: 74 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e  t nKey;.      in
6f10: 74 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20  t r1, r2, r3;.  
6f20: 20 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74      int addrTest
6f30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72   = 0;.      Expr
6f40: 4c 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20  List *pSO;.     
6f50: 20 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f   pSO = pDest->pO
6f60: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73  rderBy;.      as
6f70: 73 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20  sert( pSO );.   
6f80: 20 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e     nKey = pSO->n
6f90: 45 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d  Expr;.      r1 =
6fa0: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
6fb0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
6fc0: 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65    r2 = sqlite3Ge
6fd0: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
6fe0: 65 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20  e, nKey+2);.    
6ff0: 20 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31    r3 = r2+nKey+1
7000: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
7010: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7020: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
7030: 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f  esult, nResultCo
7040: 6c 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66  l, r3);.      if
7050: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73  ( eDest==SRT_Dis
7060: 74 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20  tQueue ){.      
7070: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
7080: 69 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51  ination is DistQ
7090: 75 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f  ueue, then curso
70a0: 72 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f  r (iParm+1) is o
70b0: 70 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  pen.        ** o
70c0: 6e 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d  n a second ephem
70d0: 65 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20  eral index that 
70e0: 68 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73  holds all values
70f0: 20 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c   every previousl
7100: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64  y.        ** add
7110: 65 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e  ed to the queue.
7120: 20 20 4f 6e 6c 79 20 61 64 64 20 74 68 69 73 20    Only add this 
7130: 6e 65 77 20 76 61 6c 75 65 20 69 66 20 69 74 20  new value if it 
7140: 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
7150: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 65 6e  .        ** been
7160: 20 61 64 64 65 64 20 2a 2f 0a 20 20 20 20 20 20   added */.      
7170: 20 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c    addrTest = sql
7180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
7190: 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69  t(v, OP_Found, i
71a0: 50 61 72 6d 2b 31 2c 20 30 2c 20 72 33 2c 20 30  Parm+1, 0, r3, 0
71b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
71c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
71d0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
71e0: 61 72 6d 2b 31 2c 20 72 33 29 3b 0a 20 20 20 20  arm+1, r3);.    
71f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7200: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
7210: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
7220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7230: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4b 65 79 3b  for(i=0; i<nKey;
7240: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73   i++){.        s
7250: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7260: 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 0a 20 20  (v, OP_SCopy,.  
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7280: 20 20 20 20 20 20 20 20 72 65 67 52 65 73 75 6c          regResul
7290: 74 20 2b 20 70 53 4f 2d 3e 61 5b 69 5d 2e 75 2e  t + pSO->a[i].u.
72a0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20  x.iOrderByCol - 
72b0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 32 2b               r2+
72d0: 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
72e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
72f0: 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e  Op2(v, OP_Sequen
7300: 63 65 2c 20 69 50 61 72 6d 2c 20 72 32 2b 6e 4b  ce, iParm, r2+nK
7310: 65 79 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ey);.      sqlit
7320: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7330: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
7340: 32 2c 20 6e 4b 65 79 2b 32 2c 20 72 31 29 3b 0a  2, nKey+2, r1);.
7350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7360: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
7370: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
7380: 72 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  r1);.      if( a
7390: 64 64 72 54 65 73 74 20 29 20 73 71 6c 69 74 65  ddrTest ) sqlite
73a0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
73b0: 20 61 64 64 72 54 65 73 74 29 3b 0a 20 20 20 20   addrTest);.    
73c0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
73d0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
73e0: 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
73f0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e  e3ReleaseTempRan
7400: 67 65 28 70 50 61 72 73 65 2c 20 72 32 2c 20 6e  ge(pParse, r2, n
7410: 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 62 72  Key+2);.      br
7420: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7430: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
7440: 5f 43 54 45 20 2a 2f 0a 0a 0a 0a 23 69 66 20 21  _CTE */....#if !
7450: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7460: 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20  MIT_TRIGGER).   
7470: 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
7480: 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73 20 69  results.  This i
7490: 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c 45 43  s used for SELEC
74a0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 73  T statements ins
74b0: 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  ide.    ** the b
74c0: 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47 45 52  ody of a TRIGGER
74d0: 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  .  The purpose o
74e0: 66 20 73 75 63 68 20 73 65 6c 65 63 74 73 20 69  f such selects i
74f0: 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  s to call.    **
7500: 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
7510: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 76  nctions that hav
7520: 65 20 73 69 64 65 20 65 66 66 65 63 74 73 2e 20  e side effects. 
7530: 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   We do not care.
7540: 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74 68 65      ** about the
7550: 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74 73 20   actual results 
7560: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 0a 20  of the select.. 
7570: 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c     */.    defaul
7580: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
7590: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69  t( eDest==SRT_Di
75a0: 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20 20 62  scard );.      b
75b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
75c0: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d  if.  }..  /* Jum
75d0: 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
75e0: 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
75f0: 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
7600: 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a 20 20  .  Except, if.  
7610: 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 73 6f  ** there is a so
7620: 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68 20 63  rter, in which c
7630: 61 73 65 20 74 68 65 20 73 6f 72 74 65 72 20 68  ase the sorter h
7640: 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d 69 74  as already limit
7650: 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75 74 70  ed.  ** the outp
7660: 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a 2f 0a  ut for us..  */.
7670: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
7680: 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74 20 29  0 && p->iLimit )
7690: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
76a0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
76b0: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 2c  Zero, p->iLimit,
76c0: 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20   iBreak, -1);.  
76d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
76e0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62  ate a KeyInfo ob
76f0: 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e 74 20  ject sufficient 
7700: 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f 66 20  for an index of 
7710: 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 61 6e  N key columns an
7720: 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63 6f 6c  d.** X extra col
7730: 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f  umns..*/.KeyInfo
7740: 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f   *sqlite3KeyInfo
7750: 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20 2a 64  Alloc(sqlite3 *d
7760: 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20 58 29  b, int N, int X)
7770: 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 20 3d  {.  KeyInfo *p =
7780: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
7790: 5a 65 72 6f 28 30 2c 20 0a 20 20 20 20 20 20 20  Zero(0, .       
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
77b0: 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 4e  of(KeyInfo) + (N
77c0: 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f 6c 6c  +X)*(sizeof(Coll
77d0: 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69 66 28  Seq*)+1));.  if(
77e0: 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61 53 6f   p ){.    p->aSo
77f0: 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
7800: 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20  p->aColl[N+X];. 
7810: 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 28     p->nField = (
7820: 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e 6e 58  u16)N;.    p->nX
7830: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58 3b 0a  Field = (u16)X;.
7840: 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45 4e 43      p->enc = ENC
7850: 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64 62 20  (db);.    p->db 
7860: 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = db;.    p->nRe
7870: 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f = 1;.  }else{.
7880: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
7890: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  iled = 1;.  }.  
78a0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
78b0: 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  ** Deallocate a 
78c0: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a  KeyInfo object.*
78d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4b 65  /.void sqlite3Ke
78e0: 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79 49 6e  yInfoUnref(KeyIn
78f0: 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  fo *p){.  if( p 
7900: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7910: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
7920: 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69  p->nRef--;.    i
7930: 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 20  f( p->nRef==0 ) 
7940: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c  sqlite3DbFree(0,
7950: 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   p);.  }.}../*.*
7960: 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70 6f 69  * Make a new poi
7970: 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66  nter to a KeyInf
7980: 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65 79 49  o object.*/.KeyI
7990: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
79a0: 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f 20 2a  nfoRef(KeyInfo *
79b0: 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
79c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52     assert( p->nR
79d0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  ef>0 );.    p->n
79e0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  Ref++;.  }.  ret
79f0: 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64 65 66  urn p;.}..#ifdef
7a00: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
7a10: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
7a20: 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  if a KeyInfo obj
7a30: 65 63 74 20 63 61 6e 20 62 65 20 63 68 61 6e 67  ect can be chang
7a40: 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  e.  The KeyInfo 
7a50: 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20 6f 6e  object.** can on
7a60: 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 69 66  ly be changed if
7a70: 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 61 20   this is just a 
7a80: 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e 63 65  single reference
7a90: 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 2e 0a   to the object..
7aa0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7ab0: 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
7ac0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
7ad0: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
7ae0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b 65 79  /.int sqlite3Key
7af0: 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28  InfoIsWriteable(
7b00: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72 65 74  KeyInfo *p){ ret
7b10: 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31 3b 20  urn p->nRef==1; 
7b20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
7b30: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  TE_DEBUG */../*.
7b40: 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72  ** Given an expr
7b50: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e  ession list, gen
7b60: 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  erate a KeyInfo 
7b70: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 72  structure that r
7b80: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f  ecords.** the co
7b90: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
7ba0: 20 66 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   for each expres
7bb0: 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70  sion in that exp
7bc0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
7bd0: 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c  .** If the ExprL
7be0: 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ist is an ORDER 
7bf0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
7c00: 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65 20 72  lause then the r
7c10: 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49  esulting.** KeyI
7c20: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
7c30: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
7c40: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20   initializing a 
7c50: 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f  virtual index to
7c60: 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  .** implement th
7c70: 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74  at clause.  If t
7c80: 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20 74  he ExprList is t
7c90: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
7ca0: 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65   a SELECT.** the
7cb0: 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  n the KeyInfo st
7cc0: 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f  ructure is appro
7cd0: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69  priate for initi
7ce0: 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61  alizing a virtua
7cf0: 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d  l.** index to im
7d00: 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e  plement a DISTIN
7d10: 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53  CT test..**.** S
7d20: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
7d30: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
7d40: 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f  re is obtain fro
7d50: 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63  m malloc.  The c
7d60: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
7d70: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
7d80: 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61  e for seeing tha
7d90: 74 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  t this structure
7da0: 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   is eventually.*
7db0: 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  * freed..*/.stat
7dc0: 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65 79 49  ic KeyInfo *keyI
7dd0: 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28  nfoFromExprList(
7de0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
7df0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
7e00: 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20 20 69  int nExtra){.  i
7e10: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 4b 65 79 49  nt nExpr;.  KeyI
7e20: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 73 74  nfo *pInfo;.  st
7e30: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
7e40: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c  em *pItem;.  sql
7e50: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
7e60: 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  e->db;.  int i;.
7e70: 0a 20 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  .  nExpr = pList
7e80: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f  ->nExpr;.  pInfo
7e90: 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
7ea0: 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
7eb0: 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20 69  +nExtra, 1);.  i
7ec0: 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20  f( pInfo ){.    
7ed0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b  assert( sqlite3K
7ee0: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
7ef0: 65 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20  e(pInfo) );.    
7f00: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
7f10: 4c 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72  List->a; i<nExpr
7f20: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
7f30: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
7f40: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f  pColl;.      pCo
7f50: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
7f60: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
7f70: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
7f80: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
7f90: 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44  ) pColl = db->pD
7fa0: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70  fltColl;.      p
7fb0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  Info->aColl[i] =
7fc0: 20 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49   pColl;.      pI
7fd0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
7fe0: 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74  i] = pItem->sort
7ff0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
8000: 0a 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b  .  return pInfo;
8010: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
8020: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
8030: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61  _SELECT./*.** Na
8040: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63  me of the connec
8050: 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75  tion operator, u
8060: 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  sed for error me
8070: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
8080: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65  c const char *se
8090: 6c 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69  lectOpName(int i
80a0: 64 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  d){.  char *z;. 
80b0: 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20   switch( id ){. 
80c0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20     case TK_ALL: 
80d0: 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e        z = "UNION
80e0: 20 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a   ALL";   break;.
80f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
8100: 52 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45  RSECT: z = "INTE
8110: 52 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b  RSECT";   break;
8120: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43  .    case TK_EXC
8130: 45 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43  EPT:    z = "EXC
8140: 45 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  EPT";      break
8150: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
8160: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e           z = "UN
8170: 49 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61  ION";       brea
8180: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
8190: 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
81a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
81b0: 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23  UND_SELECT */..#
81c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
81d0: 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a  IT_EXPLAIN./*.**
81e0: 20 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c   Unless an "EXPL
81f0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20  AIN QUERY PLAN" 
8200: 63 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67  command is being
8210: 20 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73   processed, this
8220: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
8230: 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69  a no-op. Otherwi
8240: 73 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69  se, it adds a si
8250: 6e 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70  ngle row of outp
8260: 75 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65  ut to the EQP re
8270: 73 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74  sult,.** where t
8280: 68 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66  he caption is of
8290: 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
82a0: 20 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54     "USE TEMP B-T
82b0: 52 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a  REE FOR xxx".**.
82c0: 2a 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20  ** where xxx is 
82d0: 6f 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54  one of "DISTINCT
82e0: 22 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72  ", "ORDER BY" or
82f0: 20 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61   "GROUP BY". Exa
8300: 63 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73  ctly which.** is
8310: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
8320: 68 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65  he zUsage argume
8330: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
8340: 69 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61  id explainTempTa
8350: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
8360: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
8370: 55 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  Usage){.  if( pP
8380: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  arse->explain==2
8390: 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20   ){.    Vdbe *v 
83a0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
83b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20  .    char *zMsg 
83c0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
83d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53  (pParse->db, "US
83e0: 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f  E TEMP B-TREE FO
83f0: 52 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a  R %s", zUsage);.
8400: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8410: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
8420: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
8430: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
8440: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
8450: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  .  }.}../*.** As
8460: 73 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  sign expression 
8470: 62 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41  b to lvalue a. A
8480: 20 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20   second, no-op, 
8490: 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20  version of this 
84a0: 6d 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76  macro.** is prov
84b0: 69 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  ided when SQLITE
84c0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
84d0: 20 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61   defined. This a
84e0: 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a  llows the code.*
84f0: 2a 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  * in sqlite3Sele
8500: 63 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76  ct() to assign v
8510: 61 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75  alues to structu
8520: 72 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  re member variab
8530: 6c 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79  les that.** only
8540: 20 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45   exist if SQLITE
8550: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73  _OMIT_EXPLAIN is
8560: 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74   not defined wit
8570: 68 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74  hout polluting t
8580: 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20  he.** code with 
8590: 23 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76  #ifndef directiv
85a0: 65 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20  es..*/.# define 
85b0: 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
85c0: 72 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23  r(a, b) a = b..#
85d0: 65 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65  else./* No-op ve
85e0: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78  rsions of the ex
85f0: 70 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74  plainXXX() funct
8600: 69 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e  ions and macros.
8610: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70   */.# define exp
8620: 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c  lainTempTable(y,
8630: 7a 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  z).# define expl
8640: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c  ainSetInteger(y,
8650: 7a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  z).#endif..#if !
8660: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8670: 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20  MIT_EXPLAIN) && 
8680: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8690: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
86a0: 4c 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  LECT)./*.** Unle
86b0: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
86c0: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
86d0: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
86e0: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
86f0: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
8700: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
8710: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
8720: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
8730: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
8740: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
8750: 70 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20  ption is of one 
8760: 6f 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73  of the two forms
8770: 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  :.**.**   "COMPO
8780: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
8790: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
87a0: 28 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50  (op)".**   "COMP
87b0: 4f 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53  OSITE SUBQUERIES
87c0: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
87d0: 20 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52   USING TEMP B-TR
87e0: 45 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77  EE (op)".**.** w
87f0: 68 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69  here iSub1 and i
8800: 53 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74  Sub2 are the int
8810: 65 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20  egers passed as 
8820: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8830: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61  g.** function pa
8840: 72 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70  rameters, and op
8850: 20 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70   is the text rep
8860: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
8870: 68 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  he parameter.** 
8880: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
8890: 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
88a0: 22 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65  "op" must be one
88b0: 20 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b   of TK_UNION, TK
88c0: 5f 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49  _EXCEPT,.** TK_I
88d0: 4e 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41  NTERSECT or TK_A
88e0: 4c 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f  LL. The first fo
88f0: 72 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72  rm is used if ar
8900: 67 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69  gument bUseTmp i
8910: 73 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20  s .** false, or 
8920: 74 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  the second form 
8930: 69 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a  if it is true..*
8940: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
8950: 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a  plainComposite(.
8960: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
8990: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  xt */.  int op, 
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
89c0: 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45  f TK_UNION, TK_E
89d0: 58 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20  XCEPT etc. */.  
89e0: 69 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20  int iSub1,      
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31  /* Subquery id 1
8a10: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c   */.  int iSub2,
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72        /* Subquer
8a40: 79 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20  y id 2 */.  int 
8a50: 62 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20  bUseTmp         
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8a70: 72 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61  rue if a temp ta
8a80: 62 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a  ble was used */.
8a90: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d  ){.  assert( op=
8aa0: 3d 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d  =TK_UNION || op=
8ab0: 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70  =TK_EXCEPT || op
8ac0: 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c  ==TK_INTERSECT |
8ad0: 7c 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a  | op==TK_ALL );.
8ae0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
8af0: 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
8b00: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
8b10: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61  ->pVdbe;.    cha
8b20: 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65  r *zMsg = sqlite
8b30: 33 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20  3MPrintf(.      
8b40: 20 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43    pParse->db, "C
8b50: 4f 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49  OMPOUND SUBQUERI
8b60: 45 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28  ES %d AND %d %s(
8b70: 25 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75  %s)", iSub1, iSu
8b80: 62 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65  b2,.        bUse
8b90: 54 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20  Tmp?"USING TEMP 
8ba0: 42 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c  B-TREE ":"", sel
8bb0: 65 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20  ectOpName(op).  
8bc0: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
8bd0: 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
8be0: 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65  _Explain, pParse
8bf0: 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20  ->iSelectId, 0, 
8c00: 30 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  0, zMsg, P4_DYNA
8c10: 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  MIC);.  }.}.#els
8c20: 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69  e./* No-op versi
8c30: 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61  ons of the expla
8c40: 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e  inXXX() function
8c50: 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f  s and macros. */
8c60: 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69  .# define explai
8c70: 6e 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78  nComposite(v,w,x
8c80: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,y,z).#endif../*
8c90: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72  .** If the inner
8ca0: 20 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61   loop was genera
8cb0: 74 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d  ted using a non-
8cc0: 6e 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72  null pOrderBy ar
8cd0: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20  gument,.** then 
8ce0: 74 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65  the results were
8cf0: 20 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72   placed in a sor
8d00: 74 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20  ter.  After the 
8d10: 6c 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74  loop is terminat
8d20: 65 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f  ed.** we need to
8d30: 20 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20   run the sorter 
8d40: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72  and output the r
8d50: 65 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c  esults.  The fol
8d60: 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e  lowing.** routin
8d70: 65 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  e generates the 
8d80: 63 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64  code needed to d
8d90: 6f 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69  o that..*/.stati
8da0: 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53  c void generateS
8db0: 6f 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65  ortTail(.  Parse
8dc0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
8dd0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8de0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
8df0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
8e00: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
8e10: 2f 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  /.  Vdbe *v,    
8e20: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
8e30: 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
8e40: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e   VDBE */.  int n
8e50: 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20  Column,      /* 
8e60: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
8e70: 73 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53  s of data */.  S
8e80: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
8e90: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f   /* Write the so
8ea0: 72 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72  rted results her
8eb0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64  e */.){.  int ad
8ec0: 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  drBreak = sqlite
8ed0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
8ee0: 29 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68  );     /* Jump h
8ef0: 65 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70  ere to exit loop
8f00: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
8f10: 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
8f20: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
8f30: 3b 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  ;  /* Jump here 
8f40: 66 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a  for next cycle *
8f50: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20  /.  int addr;.  
8f60: 69 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20  int iTab;.  int 
8f70: 70 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20  pseudoTab = 0;. 
8f80: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
8f90: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
8fa0: 79 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20  y;..  int eDest 
8fb0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
8fc0: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
8fd0: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 0a 20  est->iSDParm;.. 
8fe0: 20 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69   int regRow;.  i
8ff0: 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20  nt regRowid;..  
9000: 69 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d  iTab = pOrderBy-
9010: 3e 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65 67  >iECursor;.  reg
9020: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Row = sqlite3Get
9030: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
9040: 0a 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52  .  if( eDest==SR
9050: 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73  T_Output || eDes
9060: 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t==SRT_Coroutine
9070: 20 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61   ){.    pseudoTa
9080: 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
9090: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
90a0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
90b0: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75  OpenPseudo, pseu
90c0: 64 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 6e  doTab, regRow, n
90d0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65 67  Column);.    reg
90e0: 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c  Rowid = 0;.  }el
90f0: 73 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  se{.    regRowid
9100: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
9110: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
9120: 7d 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  }.  if( p->selFl
9130: 61 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74  ags & SF_UseSort
9140: 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  er ){.    int re
9150: 67 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61  gSortOut = ++pPa
9160: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69  rse->nMem;.    i
9170: 6e 74 20 70 74 61 62 32 20 3d 20 70 50 61 72 73  nt ptab2 = pPars
9180: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73  e->nTab++;.    s
9190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
91a0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64  (v, OP_OpenPseud
91b0: 6f 2c 20 70 74 61 62 32 2c 20 72 65 67 53 6f 72  o, ptab2, regSor
91c0: 74 4f 75 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e  tOut, pOrderBy->
91d0: 6e 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 61 64  nExpr+2);.    ad
91e0: 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33  dr = 1 + sqlite3
91f0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9200: 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61  _SorterSort, iTa
9210: 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20  b, addrBreak);. 
9220: 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c     codeOffset(v,
9230: 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64   p->iOffset, add
9240: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
9250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9260: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  2(v, OP_SorterDa
9270: 74 61 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72  ta, iTab, regSor
9280: 74 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  tOut);.    sqlit
9290: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
92a0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74 61 62 32  OP_Column, ptab2
92b0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
92c0: 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  r+1, regRow);.  
92d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
92e0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
92f0: 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20 7d  CLEARCACHE);.  }
9300: 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d  else{.    addr =
9310: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
9320: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
9330: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 42 72 65  t, iTab, addrBre
9340: 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66  ak);.    codeOff
9350: 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65  set(v, p->iOffse
9360: 74 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  t, addrContinue)
9370: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9380: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
9390: 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64  lumn, iTab, pOrd
93a0: 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72  erBy->nExpr+1, r
93b0: 65 67 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 77  egRow);.  }.  sw
93c0: 69 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20  itch( eDest ){. 
93d0: 20 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c     case SRT_Tabl
93e0: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
93f0: 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20  EphemTab: {.    
9400: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
9410: 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a  t==SRT_Table );.
9420: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9430: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
9440: 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  Tab );.      sql
9450: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9460: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
9470: 50 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b  Parm, regRowid);
9480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9490: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
94a0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
94b0: 67 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b  gRow, regRowid);
94c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
94d0: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
94e0: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
94f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9500: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9510: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
9520: 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20    case SRT_Set: 
9530: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
9540: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
9550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9560: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp4(v, OP_Make
9570: 52 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20  Record, regRow, 
9580: 31 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20  1, regRowid,.   
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66       &pDest->aff
95b0: 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Sdst, 1);.      
95c0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
95d0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
95e0: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31  Parse, regRow, 1
95f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9600: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
9610: 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72  _IdxInsert, iPar
9620: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
9630: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9640: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
9650: 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
9660: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
9670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
9680: 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
9690: 65 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d  e, regRow, iParm
96a0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
96b0: 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
96c0: 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  will terminate t
96d0: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
96e0: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
96f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9700: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
9710: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73   int i;.      as
9720: 73 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54  sert( eDest==SRT
9730: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
9740: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
9750: 29 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61  ); .      testca
9760: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  se( eDest==SRT_O
9770: 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74  utput );.      t
9780: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
9790: 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b  SRT_Coroutine );
97a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
97b0: 69 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  i<nColumn; i++){
97c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
97d0: 20 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e   regRow!=pDest->
97e0: 69 53 64 73 74 2b 69 20 29 3b 0a 20 20 20 20 20  iSdst+i );.     
97f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9800: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
9810: 6e 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c  n, pseudoTab, i,
9820: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69 29   pDest->iSdst+i)
9830: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  ;.        if( i=
9840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9850: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
9860: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c  eP5(v, OPFLAG_CL
9870: 45 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20  EARCACHE);.     
9880: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9890: 20 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52     if( eDest==SR
98a0: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
98b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
98c0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75  ddOp2(v, OP_Resu
98d0: 6c 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53  ltRow, pDest->iS
98e0: 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  dst, nColumn);. 
98f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
9900: 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
9910: 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44  hange(pParse, pD
9920: 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c  est->iSdst, nCol
9930: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
9940: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9950: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
9960: 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d  OP_Yield, pDest-
9970: 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
9980: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
9990: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
99a0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
99b0: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77  g(pParse, regRow
99c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
99d0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
99e0: 65 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20  e, regRowid);.. 
99f0: 20 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f   /* The bottom o
9a00: 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a  f the loop.  */.
9a10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
9a20: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
9a30: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66  rContinue);.  if
9a40: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
9a50: 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a  SF_UseSorter ){.
9a60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9a70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
9a80: 65 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  erNext, iTab, ad
9a90: 64 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  dr);.  }else{.  
9aa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9ab0: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
9ac0: 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d  iTab, addr);.  }
9ad0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
9ae0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
9af0: 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28 20  drBreak);.  if( 
9b00: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
9b10: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
9b20: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
9b30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9b40: 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p2(v, OP_Close, 
9b50: 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20  pseudoTab, 0);. 
9b60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
9b70: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
9b80: 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e  a string contain
9b90: 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72 61  ing the 'declara
9ba0: 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74 68  tion type' of th
9bb0: 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  e.** expression 
9bc0: 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69 6e  pExpr. The strin
9bd0: 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65 64  g may be treated
9be0: 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74 68   as static by th
9bf0: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
9c00: 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74 69  Also try to esti
9c10: 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  mate the size of
9c20: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   the returned va
9c30: 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  lue and return t
9c40: 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e  hat.** result in
9c50: 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a   *pEstWidth..**.
9c60: 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69  ** The declarati
9c70: 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20 65  on type is the e
9c80: 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64 65  xact datatype de
9c90: 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63 74  finition extract
9ca0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f  ed from the.** o
9cb0: 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20 54  riginal CREATE T
9cc0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69  ABLE statement i
9cd0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9ce0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68   is a column. Th
9cf0: 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e  e.** declaration
9d00: 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57 49   type for a ROWI
9d10: 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45 47  D field is INTEG
9d20: 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65 6e  ER. Exactly when
9d30: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a   an expression.*
9d40: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
9d50: 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  a column can be 
9d60: 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20 70  complex in the p
9d70: 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71 75  resence of subqu
9d80: 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65  eries. The.** re
9d90: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
9da0: 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68  ion in all of th
9db0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45  e following SELE
9dc0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73  CT statements is
9dd0: 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
9de0: 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73  a column by this
9df0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
9e00: 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46 52     SELECT col FR
9e10: 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c  OM tbl;.**   SEL
9e20: 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20  ECT (SELECT col 
9e30: 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53  FROM tbl;.**   S
9e40: 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f  ELECT (SELECT co
9e50: 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  l FROM tbl);.** 
9e60: 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52 4f    SELECT abc FRO
9e70: 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41 53  M (SELECT col AS
9e80: 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a   abc FROM tbl);.
9e90: 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61  ** .** The decla
9ea0: 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72 20  ration type for 
9eb0: 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  any expression o
9ec0: 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c 75  ther than a colu
9ed0: 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  mn is NULL..**.*
9ee0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
9ef0: 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20 36  as either 3 or 6
9f00: 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70 65   parameters depe
9f10: 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
9f20: 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53   or not.** the S
9f30: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
9f40: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d  UMN_METADATA com
9f50: 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
9f60: 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66   is used..*/.#if
9f70: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
9f80: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
9f90: 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d  A.# define colum
9fa0: 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c  nType(A,B,C,D,E,
9fb0: 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  F) columnTypeImp
9fc0: 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73  l(A,B,C,D,E,F).s
9fd0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
9fe0: 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c   *columnTypeImpl
9ff0: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
a000: 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a 70  *pNC, .  Expr *p
a010: 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Expr,.  const ch
a020: 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20  ar **pzOrigDb,. 
a030: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
a040: 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74  OrigTab,.  const
a050: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f   char **pzOrigCo
a060: 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69 64  l,.  u8 *pEstWid
a070: 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  th.){.  char con
a080: 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b  st *zOrigDb = 0;
a090: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
a0a0: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 63  OrigTab = 0;.  c
a0b0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67  har const *zOrig
a0c0: 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f  Col = 0;.#else /
a0d0: 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  * if !defined(SQ
a0e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
a0f0: 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a  MN_METADATA) */.
a100: 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54  # define columnT
a110: 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29  ype(A,B,C,D,E,F)
a120: 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28   columnTypeImpl(
a130: 41 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63 6f  A,B,F).static co
a140: 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e  nst char *column
a150: 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65  TypeImpl(.  Name
a160: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20  Context *pNC, . 
a170: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20 20   Expr *pExpr,.  
a180: 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b  u8 *pEstWidth.){
a190: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
a1a0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
a1b0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
a1c0: 41 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  A) */.  char con
a1d0: 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20  st *zType = 0;. 
a1e0: 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73 74   int j;.  u8 est
a1f0: 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66  Width = 1;..  if
a200: 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d 30  ( NEVER(pExpr==0
a210: 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ) || pNC->pSrcLi
a220: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
a230: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
a240: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
a250: 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a  e TK_AGG_COLUMN:
a260: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
a270: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  UMN: {.      /* 
a280: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
a290: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61  s a column. Loca
a2a0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68 65  te the table the
a2b0: 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67   column is being
a2c0: 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63  .      ** extrac
a2d0: 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65  ted from in Name
a2e0: 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74  Context.pSrcList
a2f0: 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79  . This table may
a300: 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a   be real.      *
a310: 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65  * database table
a320: 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a   or a subquery..
a330: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54        */.      T
a340: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
a350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
a360: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  ble structure co
a370: 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65  lumn is extracte
a380: 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20  d from */.      
a390: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20  Select *pS = 0; 
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a3b0: 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e  elect the column
a3c0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
a3d0: 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  om */.      int 
a3e0: 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43  iCol = pExpr->iC
a3f0: 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78  olumn;  /* Index
a400: 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54   of column in pT
a410: 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74  ab */.      test
a420: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
a430: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
a440: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a450: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
a460: 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
a470: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70  while( pNC && !p
a480: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53  Tab ){.        S
a490: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
a4a0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
a4b0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
a4c0: 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  0;j<pTabList->nS
a4d0: 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e  rc && pTabList->
a4e0: 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45  a[j].iCursor!=pE
a4f0: 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29  xpr->iTable;j++)
a500: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c  ;.        if( j<
a510: 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
a520: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62  {.          pTab
a530: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
a540: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
a550: 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d    pS = pTabList-
a560: 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[j].pSelect;. 
a570: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a580: 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e          pNC = pN
a590: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
a5a0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
a5b0: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
a5c0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20  {.        /* At 
a5d0: 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73  one time, code s
a5e0: 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e  uch as "SELECT n
a5f0: 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74  ew.x" within a t
a600: 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20  rigger would.   
a610: 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68       ** cause th
a620: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20  is condition to 
a630: 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e  run.  Since then
a640: 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72 75  , we have restru
a650: 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20  ctured how.     
a660: 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f     ** trigger co
a670: 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  de is generated 
a680: 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64  and so this cond
a690: 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67  ition is no long
a6a0: 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  er .        ** p
a6b0: 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72  ossible. However
a6c0: 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62  , it can still b
a6d0: 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74 65  e true for state
a6e0: 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20  ments like.     
a6f0: 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
a700: 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing:.        **.
a710: 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45          **   CRE
a720: 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c  ATE TABLE t1(col
a730: 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20   INTEGER);.     
a740: 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28     **   SELECT (
a750: 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46  SELECT t1.col) F
a760: 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  ROM FROM t1;.   
a770: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
a780: 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79  ** when columnTy
a790: 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  pe() is called o
a7a0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
a7b0: 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65   "t1.col" in the
a7c0: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62   .        ** sub
a7d0: 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73  -select. In this
a7e0: 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20 63   case, set the c
a7f0: 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55  olumn type to NU
a800: 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20  LL, even.       
a810: 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68   ** though it sh
a820: 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22  ould really be "
a830: 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20  INTEGER"..      
a840: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
a850: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72  This is not a pr
a860: 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f  oblem, as the co
a870: 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31  lumn type of "t1
a880: 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20  .col" is never. 
a890: 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20         ** used. 
a8a0: 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  When columnType(
a8b0: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
a8c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20  he expression . 
a8d0: 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45         ** "(SELE
a8e0: 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65  CT t1.col)", the
a8f0: 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69 73   correct type is
a900: 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20 74   returned (see t
a910: 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20  he TK_SELECT.   
a920: 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62       ** branch b
a930: 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20  elow.  */.      
a940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
a950: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
a960: 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70  pTab && pExpr->p
a970: 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  Tab==pTab );.   
a980: 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20     if( pS ){.   
a990: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62       /* The "tab
a9a0: 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20  le" is actually 
a9b0: 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20  a sub-select or 
a9c0: 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46 52  a view in the FR
a9d0: 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  OM clause.      
a9e0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45    ** of the SELE
a9f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65  CT statement. Re
aa00: 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61  turn the declara
aa10: 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72  tion type and or
aa20: 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  igin.        ** 
aa30: 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65 73  data for the res
aa40: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f  ult-set column o
aa50: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
aa60: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
aa70: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
aa80: 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c   && ALWAYS(iCol<
aa90: 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  pS->pEList->nExp
aaa0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
aab0: 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65  /* If iCol is le
aac0: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
aad0: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
aae0: 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a 20  n requests the. 
aaf0: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69           ** rowi
ab00: 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c  d of the sub-sel
ab10: 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69  ect or view. Thi
ab20: 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  s expression is 
ab30: 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20  legal (see .    
ab40: 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61        ** test ca
ab50: 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20  se misc2.2.2) - 
ab60: 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61  it always evalua
ab70: 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20  tes to NULL..   
ab80: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
ab90: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
aba0: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45  sNC;.          E
abb0: 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c  xpr *p = pS->pEL
abc0: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78  ist->a[iCol].pEx
abd0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  pr;.          sN
abe0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
abf0: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20  >pSrc;.         
ac00: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43   sNC.pNext = pNC
ac10: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
ac20: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
ac30: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
ac40: 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79  zType = columnTy
ac50: 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69  pe(&sNC, p,&zOri
ac60: 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a  gDb,&zOrigTab,&z
ac70: 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69 64  OrigCol, &estWid
ac80: 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a  th); .        }.
ac90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
aca0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b  pTab->pSchema ){
acb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65  .        /* A re
acc0: 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  al table */.    
acd0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 20      assert( !pS 
ace0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
acf0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
ad00: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
ad10: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
ad20: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
ad30: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
ad40: 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20 53  Col) );.#ifdef S
ad50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
ad60: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20  UMN_METADATA.   
ad70: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20       if( iCol<0 
ad80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  ){.          zTy
ad90: 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
ada0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 43            zOrigC
adb0: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
adc0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
add0: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
ade0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
adf0: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
ae00: 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61 62   zOrigCol = pTab
ae10: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
ae20: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73  me;.          es
ae30: 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61  tWidth = pTab->a
ae40: 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b  Col[iCol].szEst;
ae50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ae60: 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70 54     zOrigTab = pT
ae70: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
ae80: 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61 72     if( pNC->pPar
ae90: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
aea0: 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
aeb0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
aec0: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  NC->pParse->db, 
aed0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
aee0: 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 44            zOrigD
aef0: 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  b = pNC->pParse-
af00: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
af10: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ame;.        }.#
af20: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
af30: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
af40: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49 4e       zType = "IN
af50: 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20 20  TEGER";.        
af60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
af70: 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61   zType = pTab->a
af80: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b  Col[iCol].zType;
af90: 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57 69  .          estWi
afa0: 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  dth = pTab->aCol
afb0: 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20  [iCol].szEst;.  
afc0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
afd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
afe0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
aff0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
b000: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
b010: 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20  TK_SELECT: {.   
b020: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
b030: 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73 65  sion is a sub-se
b040: 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68 65  lect. Return the
b050: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
b060: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 6f  e and.      ** o
b070: 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20 74  rigin info for t
b080: 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e  he single column
b090: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
b0a0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
b0b0: 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
b0c0: 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
b0d0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
b0e0: 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65 63  sNC;.      Selec
b0f0: 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e 78  t *pS = pExpr->x
b100: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
b110: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
b120: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
b130: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b140: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
b150: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
b160: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e  ect) );.      sN
b170: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d  C.pSrcList = pS-
b180: 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e 43  >pSrc;.      sNC
b190: 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20  .pNext = pNC;.  
b1a0: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
b1b0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
b1c0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
b1d0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
b1e0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
b1f0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
b200: 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20 20  &estWidth); .   
b210: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b220: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 64  #endif.  }..#ifd
b230: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
b240: 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
b250: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 44    .  if( pzOrigD
b260: 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
b270: 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70 7a   pzOrigTab && pz
b280: 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20 2a  OrigCol );.    *
b290: 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69 67  pzOrigDb = zOrig
b2a0: 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 54  Db;.    *pzOrigT
b2b0: 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a 20  ab = zOrigTab;. 
b2c0: 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d 20     *pzOrigCol = 
b2d0: 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23 65  zOrigCol;.  }.#e
b2e0: 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74 57  ndif.  if( pEstW
b2f0: 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64 74  idth ) *pEstWidt
b300: 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20 20  h = estWidth;.  
b310: 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d 0a  return zType;.}.
b320: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b330: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
b340: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
b350: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70   declaration typ
b360: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
b370: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
b380: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  et..*/.static vo
b390: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
b3a0: 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65 20  nTypes(.  Parse 
b3b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
b3c0: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
b3d0: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
b3e0: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
b3f0: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
b400: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
b410: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
b420: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
b430: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
b440: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b450: 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
b460: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
b470: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
b480: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
b490: 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  sNC;.  sNC.pSrcL
b4a0: 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a  ist = pTabList;.
b4b0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
b4c0: 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Parse;.  for(i=0
b4d0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
b4e0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
b4f0: 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61  r *p = pEList->a
b500: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 63  [i].pExpr;.    c
b510: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
b520: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
b530: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
b540: 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73 74  TADATA.    const
b550: 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20 3d   char *zOrigDb =
b560: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
b570: 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20 30  ar *zOrigTab = 0
b580: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
b590: 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b 0a   *zOrigCol = 0;.
b5a0: 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75      zType = colu
b5b0: 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20  mnType(&sNC, p, 
b5c0: 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69 67  &zOrigDb, &zOrig
b5d0: 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c 20  Tab, &zOrigCol, 
b5e0: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0);..    /* The 
b5f0: 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69  vdbe must make i
b600: 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74  ts own copy of t
b610: 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61  he column-type a
b620: 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a  nd other .    **
b630: 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63   column specific
b640: 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73   strings, in cas
b650: 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  e the schema is 
b660: 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69  reset before thi
b670: 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c  s.    ** virtual
b680: 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65   machine is dele
b690: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
b6a0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
b6b0: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
b6c0: 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f  AME_DATABASE, zO
b6d0: 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52  rigDb, SQLITE_TR
b6e0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
b6f0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
b700: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
b710: 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61  E_TABLE, zOrigTa
b720: 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  b, SQLITE_TRANSI
b730: 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
b740: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
b750: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f  v, i, COLNAME_CO
b760: 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20  LUMN, zOrigCol, 
b770: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
b780: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79  );.#else.    zTy
b790: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
b7a0: 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30  &sNC, p, 0, 0, 0
b7b0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
b7c0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
b7d0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
b7e0: 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20 7a  NAME_DECLTYPE, z
b7f0: 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  Type, SQLITE_TRA
b800: 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e  NSIENT);.  }.#en
b810: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
b820: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
b830: 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  TYPE) */.}../*.*
b840: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
b850: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
b860: 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d 65  he VDBE the name
b870: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  s of columns.** 
b880: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
b890: 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  t.  This informa
b8a0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
b8b0: 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20 61  provide the.** a
b8c0: 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69 6e  zCol[] values in
b8d0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a   the callback..*
b8e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
b8f0: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
b900: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
b910: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
b920: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
b930: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
b940: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
b950: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
b960: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
b970: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
b980: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
b990: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  t set */.){.  Vd
b9a0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
b9b0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c 20  pVdbe;.  int i, 
b9c0: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
b9d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b9e0: 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c 20   int fullNames, 
b9f0: 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69 66  shortNames;..#if
ba00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ba10: 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49 66  _EXPLAIN.  /* If
ba20: 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
ba30: 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20 73  AIN, skip this s
ba40: 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  tep */.  if( pPa
ba50: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
ba60: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
ba70: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50  #endif..  if( pP
ba80: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
ba90: 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30 29  t || NEVER(v==0)
baa0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
bab0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
bac0: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
bad0: 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c 6c  sSet = 1;.  full
bae0: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
baf0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
bb00: 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20 20  ColNames)!=0;.  
bb10: 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64 62  shortNames = (db
bb20: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
bb30: 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21  _ShortColNames)!
bb40: 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  =0;.  sqlite3Vdb
bb50: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20 70  eSetNumCols(v, p
bb60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
bb70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
bb80: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
bb90: 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  .    Expr *p;.  
bba0: 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b    p = pEList->a[
bbb0: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  i].pExpr;.    if
bbc0: 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
bbd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
bbe0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ( pEList->a[i].z
bbf0: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63 68  Name ){.      ch
bc00: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c 69  ar *zName = pELi
bc10: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
bc20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bc30: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
bc40: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
bc50: 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54 52  zName, SQLITE_TR
bc60: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
bc70: 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d 3d  lse if( (p->op==
bc80: 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d 3e  TK_COLUMN || p->
bc90: 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  op==TK_AGG_COLUM
bca0: 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20 29  N) && pTabList )
bcb0: 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
bcc0: 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72 20  Tab;.      char 
bcd0: 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e 74  *zCol;.      int
bce0: 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c 75   iCol = p->iColu
bcf0: 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  mn;.      for(j=
bd00: 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61 62  0; ALWAYS(j<pTab
bd10: 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b 2b  List->nSrc); j++
bd20: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
bd30: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69 43  TabList->a[j].iC
bd40: 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c 65  ursor==p->iTable
bd50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
bd60: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
bd70: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
bd80: 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   );.      pTab =
bd90: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
bda0: 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20  pTab;.      if( 
bdb0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
bdc0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
bdd0: 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d     assert( iCol=
bde0: 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20  =-1 || (iCol>=0 
bdf0: 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  && iCol<pTab->nC
be00: 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ol) );.      if(
be10: 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20   iCol<0 ){.     
be20: 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69 64     zCol = "rowid
be30: 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ";.      }else{.
be40: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70          zCol = p
be50: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
be60: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
be70: 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74 4e       if( !shortN
be80: 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61 6d  ames && !fullNam
be90: 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  es ){.        sq
bea0: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
beb0: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
bec0: 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20 20  E_NAME, .       
bed0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53 74       sqlite3DbSt
bee0: 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
bef0: 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53 51  >a[i].zSpan), SQ
bf00: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
bf10: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66       }else if( f
bf20: 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20  ullNames ){.    
bf30: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
bf40: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = 0;.        zNa
bf50: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
bf60: 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c  ntf(db, "%s.%s",
bf70: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
bf80: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
bf90: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
bfa0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
bfb0: 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51  _NAME, zName, SQ
bfc0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  LITE_DYNAMIC);. 
bfd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bfe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
bff0: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
c000: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 43  COLNAME_NAME, zC
c010: 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ol, SQLITE_TRANS
c020: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a 20  IENT);.      }. 
c030: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c040: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
c050: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
c060: 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a 3d  an;.      z = z=
c070: 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72 69  =0 ? sqlite3MPri
c080: 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e 25  ntf(db, "column%
c090: 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69 74  d", i+1) : sqlit
c0a0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
c0b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c0c0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
c0d0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
c0e0: 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59 4e  E, z, SQLITE_DYN
c0f0: 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  AMIC);.    }.  }
c100: 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  .  generateColum
c110: 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20 70  nTypes(pParse, p
c120: 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
c130: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
c140: 20 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e   a an expression
c150: 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20   list (which is 
c160: 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74 20  really the list 
c170: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  of expressions.*
c180: 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  * that form the 
c190: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20  result set of a 
c1a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c1b0: 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f 70  ) compute approp
c1c0: 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  riate.** column 
c1d0: 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62 6c  names for a tabl
c1e0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c  e that would hol
c1f0: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
c200: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c   list..**.** All
c210: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69   column names wi
c220: 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a  ll be unique..**
c230: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c  .** Only the col
c240: 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63 6f  umn names are co
c250: 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e  mputed.  Column.
c260: 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43  zType, Column.zC
c270: 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65  oll,.** and othe
c280: 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75  r fields of Colu
c290: 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  mn are zeroed..*
c2a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
c2b0: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
c2c0: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
c2d0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
c2e0: 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65  occurs,.** store
c2f0: 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20   NULL in *paCol 
c300: 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20  and 0 in *pnCol 
c310: 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
c320: 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74  E_NOMEM..*/.stat
c330: 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c  ic int selectCol
c340: 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74  umnsFromExprList
c350: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c360: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
c370: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
c380: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
c390: 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 45  List,       /* E
c3a0: 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77 68  xpr list from wh
c3b0: 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63 6f  ich to derive co
c3c0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
c3d0: 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20  i16 *pnCol,     
c3e0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
c3f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
c400: 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20  olumns here */. 
c410: 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20   Column **paCol 
c420: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
c430: 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e  e the new column
c440: 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b   list here */.){
c450: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c460: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
c470: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
c480: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
c490: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
c4a0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c4b0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
c4c0: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
c4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
c4e0: 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65 20  x added to make 
c4f0: 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65 20  the name unique 
c500: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  */.  Column *aCo
c510: 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  l, *pCol;       
c520: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
c530: 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c 75  over result colu
c540: 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  mns */.  int nCo
c550: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
c560: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c570: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
c580: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
c590: 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20 20   Expr *p;       
c5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c5b0: 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 61  Expression for a
c5c0: 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20 63   single result c
c5d0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
c5e0: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
c5f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
c600: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
c610: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
c620: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
c630: 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b  f name in zName[
c640: 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69  ] */..  if( pELi
c650: 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  st ){.    nCol =
c660: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
c670: 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74      aCol = sqlit
c680: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
c690: 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30  b, sizeof(aCol[0
c6a0: 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65  ])*nCol);.    te
c6b0: 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20  stcase( aCol==0 
c6c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
c6d0: 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43  nCol = 0;.    aC
c6e0: 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  ol = 0;.  }.  *p
c6f0: 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a  nCol = nCol;.  *
c700: 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20  paCol = aCol;.. 
c710: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61   for(i=0, pCol=a
c720: 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  Col; i<nCol; i++
c730: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f  , pCol++){.    /
c740: 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70 72  * Get an appropr
c750: 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74 68  iate name for th
c760: 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a  e column.    */.
c770: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45      p = sqlite3E
c780: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
c790: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
c7a0: 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61  r);.    if( (zNa
c7b0: 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  me = pEList->a[i
c7c0: 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  ].zName)!=0 ){. 
c7d0: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
c7e0: 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61  olumn contains a
c7f0: 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68  n "AS <name>" ph
c800: 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e  rase, use <name>
c810: 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   as the name */.
c820: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
c830: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
c840: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
c850: 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
c860: 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20  *pColExpr = p;  
c870: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
c880: 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65  n that is the re
c890: 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  sult column name
c8a0: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
c8b0: 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f  *pTab;         /
c8c0: 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74  * Table associat
c8d0: 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70  ed with this exp
c8e0: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
c8f0: 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72   while( pColExpr
c900: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
c910: 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72          pColExpr
c920: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69   = pColExpr->pRi
c930: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ght;.        ass
c940: 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30  ert( pColExpr!=0
c950: 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
c960: 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e    if( pColExpr->
c970: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26  op==TK_COLUMN &&
c980: 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72   ALWAYS(pColExpr
c990: 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20  ->pTab!=0) ){.  
c9a0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c        /* For col
c9b0: 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c  umns use the col
c9c0: 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f  umn name name */
c9d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
c9e0: 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43  l = pColExpr->iC
c9f0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70  olumn;.        p
ca00: 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e  Tab = pColExpr->
ca10: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66  pTab;.        if
ca20: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
ca30: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
ca40: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73         zName = s
ca50: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
ca60: 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20  , "%s",.        
ca70: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30           iCol>=0
ca80: 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   ? pTab->aCol[iC
ca90: 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77  ol].zName : "row
caa0: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
cab0: 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e  e if( pColExpr->
cac0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
cad0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
cae0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43  prHasProperty(pC
caf0: 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  olExpr, EP_IntVa
cb00: 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
cb10: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
cb20: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c  Printf(db, "%s",
cb30: 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f   pColExpr->u.zTo
cb40: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ken);.      }els
cb50: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73  e{.        /* Us
cb60: 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74  e the original t
cb70: 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ext of the colum
cb80: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20  n expression as 
cb90: 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  its name */.    
cba0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
cbb0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
cbc0: 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  %s", pEList->a[i
cbd0: 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20  ].zSpan);.      
cbe0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
cbf0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cc00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
cc10: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
cc20: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
cc30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
cc40: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c  ake sure the col
cc50: 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  umn name is uniq
cc60: 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65  ue.  If the name
cc70: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a   is not unique,.
cc80: 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20      ** append a 
cc90: 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e  integer to the n
cca0: 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62  ame so that it b
ccb0: 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20  ecomes unique.. 
ccc0: 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20     */.    nName 
ccd0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
cce0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
ccf0: 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20  r(j=cnt=0; j<i; 
cd00: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
cd10: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61  sqlite3StrICmp(a
cd20: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  Col[j].zName, zN
cd30: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
cd40: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d     char *zNewNam
cd50: 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b  e;.        int k
cd60: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d  ;.        for(k=
cd70: 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20  nName-1; k>1 && 
cd80: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
cd90: 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d  Name[k]); k--){}
cda0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 61  .        if( zNa
cdb0: 6d 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61  me[k]==':' ) nNa
cdc0: 6d 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20  me = k;.        
cdd0: 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30  zName[nName] = 0
cde0: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e 61  ;.        zNewNa
cdf0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
ce00: 6e 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22 2c  ntf(db, "%s:%d",
ce10: 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a   zName, ++cnt);.
ce20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
ce30: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
ce40: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
ce50: 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20  = zNewName;.    
ce60: 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20      j = -1;.    
ce70: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
ce80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
ce90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  }.    }.    pCol
cea0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ->zName = zName;
ceb0: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d  .  }.  if( db->m
cec0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ced0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b     for(j=0; j<i;
cee0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   j++){.      sql
cef0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 61  ite3DbFree(db, a
cf00: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col[j].zName);. 
cf10: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
cf20: 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 29  DbFree(db, aCol)
cf30: 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30  ;.    *paCol = 0
cf40: 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30  ;.    *pnCol = 0
cf50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
cf60: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
cf70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cf80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  K;.}../*.** Add 
cf90: 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
cfa0: 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  on information t
cfb0: 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  o a column list 
cfc0: 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45  based on.** a SE
cfd0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
cfe0: 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d  ** .** The colum
cff0: 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62 6c  n list presumabl
d000: 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65  y came from sele
d010: 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f  ctColumnNamesFro
d020: 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20  mExprList()..** 
d030: 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  The column list 
d040: 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20  has only names, 
d050: 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f 6c  not types or col
d060: 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a  lations.  This.*
d070: 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  * routine goes t
d080: 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73 20  hrough and adds 
d090: 74 68 65 20 74 79 70 65 73 20 61 6e 64 20 63 6f  the types and co
d0a0: 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  llations..**.** 
d0b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 71  This routine req
d0c0: 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20 69  uires that all i
d0d0: 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74 68  dentifiers in th
d0e0: 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74  e SELECT.** stat
d0f0: 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76 65  ement be resolve
d100: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
d110: 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d  d selectAddColum
d120: 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f  nTypeAndCollatio
d130: 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  n(.  Parse *pPar
d140: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
d150: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a  rsing contexts *
d160: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
d170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d180: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66   column type inf
d190: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
d1a0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65   table */.  Sele
d1b0: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
d1c0: 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64    /* SELECT used
d1d0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79   to determine ty
d1e0: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
d1f0: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
d200: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
d210: 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
d220: 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
d230: 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
d240: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
d250: 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
d260: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
d270: 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73  item *a;.  u64 s
d280: 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73  zAll = 0;..  ass
d290: 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20  ert( pSelect!=0 
d2a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53  );.  assert( (pS
d2b0: 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
d2c0: 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d  & SF_Resolved)!=
d2d0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d2e0: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65  Tab->nCol==pSele
d2f0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
d300: 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
d310: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64  ailed );.  if( d
d320: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d330: 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73  ) return;.  mems
d340: 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65  et(&sNC, 0, size
d350: 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e  of(sNC));.  sNC.
d360: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65  pSrcList = pSele
d370: 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20  ct->pSrc;.  a = 
d380: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
d390: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  >a;.  for(i=0, p
d3a0: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
d3b0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
d3c0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
d3d0: 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  p = a[i].pExpr;.
d3e0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20      pCol->zType 
d3f0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
d400: 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65  p(db, columnType
d410: 28 26 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20  (&sNC, p,0,0,0, 
d420: 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a  &pCol->szEst));.
d430: 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f      szAll += pCo
d440: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70 43  l->szEst;.    pC
d450: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73  ol->affinity = s
d460: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
d470: 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70  ty(p);.    if( p
d480: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30  Col->affinity==0
d490: 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74   ) pCol->affinit
d4a0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
d4b0: 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ONE;.    pColl =
d4c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
d4d0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  Seq(pParse, p);.
d4e0: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
d4f0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f  .      pCol->zCo
d500: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ll = sqlite3DbSt
d510: 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e  rDup(db, pColl->
d520: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
d530: 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  }.  pTab->szTabR
d540: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
d550: 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a  st(szAll*4);.}..
d560: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53 45  /*.** Given a SE
d570: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
d580: 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c 65  generate a Table
d590: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
d5a0: 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68 65  describes.** the
d5b0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
d5c0: 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54  hat SELECT..*/.T
d5d0: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65 73  able *sqlite3Res
d5e0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 50  ultSetOfSelect(P
d5f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65  arse *pParse, Se
d600: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a  lect *pSelect){.
d610: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
d620: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
d630: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
d640: 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20   savedFlags;..  
d650: 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62 2d  savedFlags = db-
d660: 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c  >flags;.  db->fl
d670: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46  ags &= ~SQLITE_F
d680: 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64  ullColNames;.  d
d690: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
d6a0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
d6b0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
d6c0: 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53  tPrep(pParse, pS
d6d0: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
d6e0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
d6f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
d700: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
d710: 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20 70  or ) pSelect = p
d720: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
d730: 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61    db->flags = sa
d740: 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61 62  vedFlags;.  pTab
d750: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
d760: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
d770: 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69 66  f(Table) );.  if
d780: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
d790: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d7a0: 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52   /* The sqlite3R
d7b0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
d7c0: 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  () is only used 
d7d0: 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72 65  n contexts where
d7e0: 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20   lookaside.  ** 
d7f0: 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
d800: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
d810: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d  kaside.bEnabled=
d820: 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52  =0 );.  pTab->nR
d830: 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e  ef = 1;.  pTab->
d840: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61  zName = 0;.  pTa
d850: 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34  b->nRowEst = 104
d860: 38 35 37 36 3b 0a 20 20 73 65 6c 65 63 74 43 6f  8576;.  selectCo
d870: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
d880: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
d890: 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62  t->pEList, &pTab
d8a0: 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61  ->nCol, &pTab->a
d8b0: 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41 64  Col);.  selectAd
d8c0: 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f  dColumnTypeAndCo
d8d0: 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  llation(pParse, 
d8e0: 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  pTab, pSelect);.
d8f0: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
d900: 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  -1;.  if( db->ma
d910: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
d920: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
d930: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
d940: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d950: 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b  }.  return pTab;
d960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
d970: 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76  VDBE for the giv
d980: 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  en parser contex
d990: 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
d9a0: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
d9b0: 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  y..** If an erro
d9c0: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
d9d0: 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20   NULL and leave 
d9e0: 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  a message in pPa
d9f0: 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71  rse..*/.Vdbe *sq
da00: 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72  lite3GetVdbe(Par
da10: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
da20: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
da30: 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d  >pVdbe;.  if( v=
da40: 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50  =0 ){.    v = pP
da50: 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71  arse->pVdbe = sq
da60: 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28  lite3VdbeCreate(
da70: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
da80: 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65   v ) sqlite3Vdbe
da90: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e 69  AddOp0(v, OP_Ini
daa0: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  t);.    if( pPar
dab0: 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d 30  se->pToplevel==0
dac0: 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a  .     && Optimiz
dad0: 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50 61  ationEnabled(pPa
dae0: 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f 46  rse->db,SQLITE_F
daf0: 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a 20  actorOutConst). 
db00: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72     ){.      pPar
db10: 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f  se->okConstFacto
db20: 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  r = 1;.    }..  
db30: 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d 0a  }.  return v;.}.
db40: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
db50: 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  the iLimit and i
db60: 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f 66  Offset fields of
db70: 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73 65   the SELECT base
db80: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69 6d  d on the.** pLim
db90: 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20 65  it and pOffset e
dba0: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c 69  xpressions.  pLi
dbb0: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
dbc0: 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73 73  hold the express
dbd0: 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70 70  ions.** that app
dbe0: 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ear in the origi
dbf0: 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  nal SQL statemen
dc00: 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d 49  t after the LIMI
dc10: 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a 20  T and OFFSET.** 
dc20: 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e 55  keywords.  Or NU
dc30: 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79 77  LL if those keyw
dc40: 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65 64  ords are omitted
dc50: 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  . iLimit and iOf
dc60: 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68 65  fset .** are the
dc70: 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79 20   integer memory 
dc80: 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73  register numbers
dc90: 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75 73   for counters us
dca0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a 2a  ed to compute .*
dcb0: 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64 20  * the limit and 
dcc0: 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65 72  offset.  If ther
dcd0: 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61 6e  e is no limit an
dce0: 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68 65  d/or offset, the
dcf0: 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e 64  n .** iLimit and
dd00: 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65 67   iOffset are neg
dd10: 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ative..**.** Thi
dd20: 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67 65  s routine change
dd30: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  s the values of 
dd40: 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73  iLimit and iOffs
dd50: 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61 20  et only if.** a 
dd60: 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74 20  limit or offset 
dd70: 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70 4c  is defined by pL
dd80: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
dd90: 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a 2a  .  iLimit and.**
dda0: 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64 20   iOffset should 
ddb0: 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65 74  have been preset
ddc0: 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20   to appropriate 
ddd0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20 28  default values (
dde0: 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20 74  zero).** prior t
ddf0: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
de00: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
de10: 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73 74  e iOffset regist
de20: 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74 73  er (if it exists
de30: 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  ) is initialized
de40: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a   to the value.**
de50: 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e 20   of the OFFSET. 
de60: 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67 69   The iLimit regi
de70: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
de80: 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20 52  zed to LIMIT.  R
de90: 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66 73  egister.** iOffs
dea0: 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c 69  et+1 is initiali
deb0: 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46 46  zed to LIMIT+OFF
dec0: 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  SET..**.** Only 
ded0: 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20  if pLimit!=0 or 
dee0: 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74 68  pOffset!=0 do th
def0: 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72  e limit register
df00: 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e  s get.** redefin
df10: 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20 41  ed.  The UNION A
df20: 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65 73  LL operator uses
df30: 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20 74   this property t
df40: 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72  o force.** the r
df50: 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d 65  euse of the same
df60: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
df70: 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72 6f  t registers acro
df80: 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53  ss multiple.** S
df90: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
dfa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
dfb0: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
dfc0: 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70 50  isters(Parse *pP
dfd0: 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c  arse, Select *p,
dfe0: 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20 20   int iBreak){.  
dff0: 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69  Vdbe *v = 0;.  i
e000: 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20  nt iLimit = 0;. 
e010: 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20 20   int iOffset;.  
e020: 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20  int addr1, n;.  
e030: 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20  if( p->iLimit ) 
e040: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20  return;..  /* . 
e050: 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20 61   ** "LIMIT -1" a
e060: 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c 20  lways shows all 
e070: 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  rows.  There is 
e080: 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 6f  some.  ** contro
e090: 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61 74  versy about what
e0a0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65 68   the correct beh
e0b0: 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e  avior should be.
e0c0: 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  .  ** The curren
e0d0: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
e0e0: 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49 4d   interprets "LIM
e0f0: 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20  IT 0" to mean.  
e100: 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f  ** no rows..  */
e110: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61  .  sqlite3ExprCa
e120: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
e130: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
e140: 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e  Offset==0 || p->
e150: 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69  pLimit!=0 );.  i
e160: 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a  f( p->pLimit ){.
e170: 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20      p->iLimit = 
e180: 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73  iLimit = ++pPars
e190: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d  e->nMem;.    v =
e1a0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
e1b0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73 73  pParse);.    ass
e1c0: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 20  ert( v!=0 );.   
e1d0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
e1e0: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69  IsInteger(p->pLi
e1f0: 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  mit, &n) ){.    
e200: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e210: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
e220: 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
e230: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
e240: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
e250: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
e260: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
e270: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e280: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
e290: 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  0, iBreak);.    
e2a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30    }else if( n>=0
e2b0: 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
e2c0: 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20  w>(u64)n ){.    
e2d0: 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
e2e0: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  w = n;.      }. 
e2f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e300: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
e310: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
e320: 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
e330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e340: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
e350: 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  Int, iLimit);.  
e360: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
e370: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
e380: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
e390: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e3a0: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
e3b0: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
e3c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70    }.    if( p->p
e3d0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
e3e0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
e3f0: 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
e400: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
e410: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
e420: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
e430: 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
e440: 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
e450: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e460: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
e470: 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  ->pOffset, iOffs
e480: 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
e490: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e4a0: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
e4b0: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
e4c0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
e4d0: 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
e4e0: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
e4f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
e500: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
e510: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
e520: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e530: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
e540: 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  0, iOffset);.   
e550: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e560: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
e570: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e580: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
e590: 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  Add, iLimit, iOf
e5a0: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29  fset, iOffset+1)
e5b0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
e5c0: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
e5d0: 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20  FFSET"));.      
e5e0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
e5f0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e600: 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a  IfPos, iLimit);.
e610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e620: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
e630: 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73  teger, -1, iOffs
e640: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  et+1);.      sql
e650: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
e660: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
e670: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
e680: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
e690: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
e6a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
e6b0: 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
e6c0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
e6d0: 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
e6e0: 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  umn of.** the re
e6f0: 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65  sult set for the
e700: 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
e710: 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20   statement "p". 
e720: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a   Return NULL if.
e730: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  ** the column ha
e740: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
e750: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
e760: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
e770: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
e780: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  r the compound s
e790: 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66  elect is taken f
e7a0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d  rom the.** left-
e7b0: 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  most term of the
e7c0: 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73   select that has
e7d0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
e7e0: 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
e7f0: 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
e800: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
e810: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
e820: 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
e830: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
e840: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
e850: 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  or ){.    pRet =
e860: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
e870: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
e880: 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20  Prior, iCol);.  
e890: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20  }else{.    pRet 
e8a0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
e8b0: 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20  t( iCol>=0 );.  
e8c0: 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69  if( pRet==0 && i
e8d0: 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Col<p->pEList->n
e8e0: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74  Expr ){.    pRet
e8f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
e900: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
e910: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
e920: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
e930: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
e940: 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65 63 74 20  *.** The select 
e950: 73 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64  statement passed
e960: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
e970: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 63 6f  arameter is a co
e980: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a  mpound SELECT.**
e990: 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
e9a0: 59 20 63 6c 61 75 73 65 2e 20 54 68 69 73 20 66  Y clause. This f
e9b0: 75 6e 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65  unction allocate
e9c0: 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  s and returns a 
e9d0: 4b 65 79 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  KeyInfo.** struc
e9e0: 74 75 72 65 20 73 75 69 74 61 62 6c 65 20 66 6f  ture suitable fo
e9f0: 72 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74  r implementing t
ea00: 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2a 0a  he ORDER BY..**.
ea10: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
ea20: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
ea30: 75 63 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e  ucture is obtain
ea40: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
ea50: 54 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66  The calling.** f
ea60: 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f  unction is respo
ea70: 6e 73 69 62 6c 65 20 66 6f 72 20 65 6e 73 75 72  nsible for ensur
ea80: 69 6e 67 20 74 68 61 74 20 74 68 69 73 20 73 74  ing that this st
ea90: 72 75 63 74 75 72 65 20 69 73 20 65 76 65 6e 74  ructure is event
eaa0: 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 2e 0a  ually.** freed..
eab0: 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49 6e 66  */.static KeyInf
eac0: 6f 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  o *multiSelectOr
ead0: 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 50 61 72  derByKeyInfo(Par
eae0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
eaf0: 63 74 20 2a 70 2c 20 69 6e 74 20 6e 45 78 74 72  ct *p, int nExtr
eb00: 61 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  a){.  ExprList *
eb10: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
eb20: 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 6e 4f  rderBy;.  int nO
eb30: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
eb40: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 73  erBy->nExpr;.  s
eb50: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
eb60: 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e  rse->db;.  KeyIn
eb70: 66 6f 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  fo *pRet = sqlit
eb80: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64  e3KeyInfoAlloc(d
eb90: 62 2c 20 6e 4f 72 64 65 72 42 79 2b 6e 45 78 74  b, nOrderBy+nExt
eba0: 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 52  ra, 1);.  if( pR
ebb0: 65 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  et ){.    int i;
ebc0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
ebd0: 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
ebe0: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
ebf0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
ec00: 6d 20 3d 20 26 70 4f 72 64 65 72 42 79 2d 3e 61  m = &pOrderBy->a
ec10: 5b 69 5d 3b 0a 20 20 20 20 20 20 45 78 70 72 20  [i];.      Expr 
ec20: 2a 70 54 65 72 6d 20 3d 20 70 49 74 65 6d 2d 3e  *pTerm = pItem->
ec30: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c  pExpr;.      Col
ec40: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
ec50: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66      if( pTerm->f
ec60: 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74  lags & EP_Collat
ec70: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  e ){.        pCo
ec80: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
ec90: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
eca0: 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65  pTerm);.      }e
ecb0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
ecc0: 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
ecd0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
ece0: 70 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  p, pItem->u.x.iO
ecf0: 72 64 65 72 42 79 43 6f 6c 2d 31 29 3b 0a 20 20  rderByCol-1);.  
ed00: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d        if( pColl=
ed10: 3d 30 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  =0 ) pColl = db-
ed20: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
ed30: 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b      pOrderBy->a[
ed40: 69 5d 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20  i].pExpr =.     
ed50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ed60: 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67  AddCollateString
ed70: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
ed80: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pColl->zName);. 
ed90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
eda0: 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
edb0: 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
edc0: 52 65 74 29 20 29 3b 0a 20 20 20 20 20 20 70 52  Ret) );.      pR
edd0: 65 74 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70  et->aColl[i] = p
ede0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 52 65 74  Coll;.      pRet
edf0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
ee00: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
ee10: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  .sortOrder;.    
ee20: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
ee30: 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pRet;.}..#ifndef
ee40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
ee50: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ee60: 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 56 44  ine generates VD
ee70: 42 45 20 63 6f 64 65 20 74 6f 20 63 6f 6d 70 75  BE code to compu
ee80: 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  te the content o
ee90: 66 20 61 20 57 49 54 48 20 52 45 43 55 52 53 49  f a WITH RECURSI
eea0: 56 45 0a 2a 2a 20 71 75 65 72 79 20 6f 66 20 74  VE.** query of t
eeb0: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
eec0: 20 3c 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c   <recursive-tabl
eed0: 65 3e 20 41 53 20 28 3c 73 65 74 75 70 2d 71 75  e> AS (<setup-qu
eee0: 65 72 79 3e 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d  ery> UNION [ALL]
eef0: 20 3c 72 65 63 75 72 73 69 76 65 2d 71 75 65 72   <recursive-quer
ef00: 79 3e 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  y>).**          
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
ef20: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20  ___________/    
ef30: 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f           \______
ef40: 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20  _________/.**   
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef60: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f          p->pPrio
ef70: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
ef80: 20 20 20 20 20 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a         p.**.**.*
ef90: 2a 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  * There is exact
efa0: 6c 79 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  ly one reference
efb0: 20 74 6f 20 74 68 65 20 72 65 63 75 72 73 69 76   to the recursiv
efc0: 65 2d 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e-table in the F
efd0: 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 6f 66  ROM clause.** of
efe0: 20 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79   recursive-query
eff0: 2c 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68  , marked with th
f000: 65 20 53 72 63 4c 69 73 74 2d 3e 61 5b 5d 2e 69  e SrcList->a[].i
f010: 73 52 65 63 75 72 73 69 76 65 20 66 6c 61 67 2e  sRecursive flag.
f020: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 74 75 70  .**.** The setup
f030: 2d 71 75 65 72 79 20 72 75 6e 73 20 6f 6e 63 65  -query runs once
f040: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e 20   to generate an 
f050: 69 6e 69 74 69 61 6c 20 73 65 74 20 6f 66 20 72  initial set of r
f060: 6f 77 73 20 74 68 61 74 20 67 6f 0a 2a 2a 20 69  ows that go.** i
f070: 6e 74 6f 20 61 20 51 75 65 75 65 20 74 61 62 6c  nto a Queue tabl
f080: 65 2e 20 20 52 6f 77 73 20 61 72 65 20 65 78 74  e.  Rows are ext
f090: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
f0a0: 51 75 65 75 65 20 74 61 62 6c 65 20 6f 6e 65 20  Queue table one 
f0b0: 62 79 0a 2a 2a 20 6f 6e 65 2e 20 20 45 61 63 68  by.** one.  Each
f0c0: 20 72 6f 77 20 65 78 74 72 61 63 74 65 64 20 66   row extracted f
f0d0: 72 6f 6d 20 51 75 65 75 65 20 69 73 20 6f 75 74  rom Queue is out
f0e0: 70 75 74 20 74 6f 20 70 44 65 73 74 2e 20 20 54  put to pDest.  T
f0f0: 68 65 6e 20 74 68 65 20 73 69 6e 67 6c 65 0a 2a  hen the single.*
f100: 2a 20 65 78 74 72 61 63 74 65 64 20 72 6f 77 20  * extracted row 
f110: 28 6e 6f 77 20 69 6e 20 74 68 65 20 69 43 75 72  (now in the iCur
f120: 72 65 6e 74 20 74 61 62 6c 65 29 20 62 65 63 6f  rent table) beco
f130: 6d 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  mes the content 
f140: 6f 66 20 74 68 65 0a 2a 2a 20 72 65 63 75 72 73  of the.** recurs
f150: 69 76 65 2d 74 61 62 6c 65 20 66 6f 72 20 61 20  ive-table for a 
f160: 72 65 63 75 72 73 69 76 65 2d 71 75 65 72 79 20  recursive-query 
f170: 72 75 6e 2e 20 20 54 68 65 20 6f 75 74 70 75 74  run.  The output
f180: 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76   of the recursiv
f190: 65 2d 71 75 65 72 79 0a 2a 2a 20 69 73 20 61 64  e-query.** is ad
f1a0: 64 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ded back into th
f1b0: 65 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20  e Queue table.  
f1c0: 54 68 65 6e 20 61 6e 6f 74 68 65 72 20 72 6f 77  Then another row
f1d0: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
f1e0: 6f 6d 20 51 75 65 75 65 0a 2a 2a 20 61 6e 64 20  om Queue.** and 
f1f0: 74 68 65 20 69 74 65 72 61 74 69 6f 6e 20 63 6f  the iteration co
f200: 6e 74 69 6e 75 65 73 20 75 6e 74 69 6c 20 74 68  ntinues until th
f210: 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69 73  e Queue table is
f220: 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 49 66   empty..**.** If
f230: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
f240: 65 72 79 20 6f 70 65 72 61 74 6f 72 20 69 73 20  ery operator is 
f250: 55 4e 49 4f 4e 20 74 68 65 6e 20 6e 6f 20 64 75  UNION then no du
f260: 70 6c 69 63 61 74 65 20 72 6f 77 73 20 61 72 65  plicate rows are
f270: 20 65 76 65 72 0a 2a 2a 20 69 6e 73 65 72 74 65   ever.** inserte
f280: 64 20 69 6e 74 6f 20 74 68 65 20 51 75 65 75 65  d into the Queue
f290: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 69 44 69   table.  The iDi
f2a0: 73 74 69 6e 63 74 20 74 61 62 6c 65 20 6b 65 65  stinct table kee
f2b0: 70 73 20 61 20 63 6f 70 79 20 6f 66 20 61 6c 6c  ps a copy of all
f2c0: 20 72 6f 77 73 0a 2a 2a 20 74 68 61 74 20 68 61   rows.** that ha
f2d0: 76 65 20 65 76 65 72 20 62 65 65 6e 20 69 6e 73  ve ever been ins
f2e0: 65 72 74 65 64 20 69 6e 74 6f 20 51 75 65 75 65  erted into Queue
f2f0: 20 61 6e 64 20 63 61 75 73 65 73 20 64 75 70 6c   and causes dupl
f300: 69 63 61 74 65 73 20 74 6f 20 62 65 0a 2a 2a 20  icates to be.** 
f310: 64 69 73 63 61 72 64 65 64 2e 20 20 49 66 20 74  discarded.  If t
f320: 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  he operator is U
f330: 4e 49 4f 4e 20 41 4c 4c 2c 20 74 68 65 6e 20 64  NION ALL, then d
f340: 75 70 6c 69 63 61 74 65 73 20 61 72 65 20 61 6c  uplicates are al
f350: 6c 6f 77 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  lowed..** .** If
f360: 20 74 68 65 20 71 75 65 72 79 20 68 61 73 20 61   the query has a
f370: 6e 20 4f 52 44 45 52 20 42 59 2c 20 74 68 65 6e  n ORDER BY, then
f380: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
f390: 51 75 65 75 65 20 74 61 62 6c 65 20 61 72 65 20  Queue table are 
f3a0: 6b 65 70 74 20 69 6e 0a 2a 2a 20 4f 52 44 45 52  kept in.** ORDER
f3b0: 20 42 59 20 6f 72 64 65 72 20 61 6e 64 20 74 68   BY order and th
f3c0: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 73  e first entry is
f3d0: 20 65 78 74 72 61 63 74 65 64 20 66 6f 72 20 65   extracted for e
f3e0: 61 63 68 20 63 79 63 6c 65 2e 20 20 57 69 74 68  ach cycle.  With
f3f0: 6f 75 74 0a 2a 2a 20 61 6e 20 4f 52 44 45 52 20  out.** an ORDER 
f400: 42 59 2c 20 74 68 65 20 51 75 65 75 65 20 74 61  BY, the Queue ta
f410: 62 6c 65 20 69 73 20 6a 75 73 74 20 61 20 46 49  ble is just a FI
f420: 46 4f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4c  FO..**.** If a L
f430: 49 4d 49 54 20 63 6c 61 75 73 65 20 69 73 20 70  IMIT clause is p
f440: 72 6f 76 69 64 65 64 2c 20 74 68 65 6e 20 74 68  rovided, then th
f450: 65 20 69 74 65 72 61 74 69 6f 6e 20 73 74 6f 70  e iteration stop
f460: 73 20 61 66 74 65 72 20 4c 49 4d 49 54 20 72 6f  s after LIMIT ro
f470: 77 73 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  ws.** have been 
f480: 6f 75 74 70 75 74 20 74 6f 20 70 44 65 73 74 2e  output to pDest.
f490: 20 20 41 20 4c 49 4d 49 54 20 6f 66 20 7a 65 72    A LIMIT of zer
f4a0: 6f 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75  o means to outpu
f4b0: 74 20 6e 6f 20 72 6f 77 73 20 61 6e 64 20 61 0a  t no rows and a.
f4c0: 2a 2a 20 6e 65 67 61 74 69 76 65 20 4c 49 4d 49  ** negative LIMI
f4d0: 54 20 6d 65 61 6e 73 20 74 6f 20 6f 75 74 70 75  T means to outpu
f4e0: 74 20 61 6c 6c 20 72 6f 77 73 2e 20 20 49 66 20  t all rows.  If 
f4f0: 74 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 6e  there is also an
f500: 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 0a 2a   OFFSET clause.*
f510: 2a 20 77 69 74 68 20 61 20 70 6f 73 69 74 69 76  * with a positiv
f520: 65 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  e value, then th
f530: 65 20 66 69 72 73 74 20 4f 46 46 53 45 54 20 6f  e first OFFSET o
f540: 75 74 70 75 74 73 20 61 72 65 20 64 69 73 63 61  utputs are disca
f550: 72 64 65 64 20 72 61 74 68 65 72 0a 2a 2a 20 74  rded rather.** t
f560: 68 61 6e 20 62 65 69 6e 67 20 73 65 6e 74 20 74  han being sent t
f570: 6f 20 70 44 65 73 74 2e 20 20 54 68 65 20 4c 49  o pDest.  The LI
f580: 4d 49 54 20 63 6f 75 6e 74 20 64 6f 65 73 20 6e  MIT count does n
f590: 6f 74 20 62 65 67 69 6e 20 75 6e 74 69 6c 20 61  ot begin until a
f5a0: 66 74 65 72 20 4f 46 46 53 45 54 0a 2a 2a 20 72  fter OFFSET.** r
f5b0: 6f 77 73 20 68 61 76 65 20 62 65 65 6e 20 73 6b  ows have been sk
f5c0: 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ipped..*/.static
f5d0: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 57 69   void generateWi
f5e0: 74 68 52 65 63 75 72 73 69 76 65 51 75 65 72 79  thRecursiveQuery
f5f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f600: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
f610: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
f620: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
f630: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
f640: 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54 20  ecursive SELECT 
f650: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
f660: 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
f670: 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  st     /* What t
f680: 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20  o do with query 
f690: 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20  results */.){.  
f6a0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
f6b0: 70 2d 3e 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  p->pSrc;      /*
f6c0: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
f6d0: 20 6f 66 20 74 68 65 20 72 65 63 75 72 73 69 76   of the recursiv
f6e0: 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  e query */.  int
f6f0: 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73   nCol = p->pELis
f700: 74 2d 3e 6e 45 78 70 72 3b 20 20 2f 2a 20 4e 75  t->nExpr;  /* Nu
f710: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f720: 69 6e 20 74 68 65 20 72 65 63 75 72 73 69 76 65  in the recursive
f730: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 56 64 62 65   table */.  Vdbe
f740: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
f750: 64 62 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  dbe;      /* The
f760: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
f770: 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ent under constr
f780: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  uction */.  Sele
f790: 63 74 20 2a 70 53 65 74 75 70 20 3d 20 70 2d 3e  ct *pSetup = p->
f7a0: 70 50 72 69 6f 72 3b 20 20 20 2f 2a 20 54 68 65  pPrior;   /* The
f7b0: 20 73 65 74 75 70 20 71 75 65 72 79 20 2a 2f 0a   setup query */.
f7c0: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f  /* Top of the lo
f7f0: 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
f800: 43 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 3b  Cont, addrBreak;
f810: 20 20 20 20 20 20 2f 2a 20 43 4f 4e 54 49 4e 55        /* CONTINU
f820: 45 20 61 6e 64 20 42 52 45 41 4b 20 61 64 64 72  E and BREAK addr
f830: 65 73 73 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  esses */.  int i
f840: 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  Current = 0;    
f850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f860: 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
f870: 0a 20 20 69 6e 74 20 72 65 67 43 75 72 72 65 6e  .  int regCurren
f880: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
f890: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
f8a0: 64 69 6e 67 20 43 75 72 72 65 6e 74 20 74 61 62  ding Current tab
f8b0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 51 75 65  le */.  int iQue
f8c0: 75 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ue;             
f8d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 51 75 65        /* The Que
f8e0: 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ue table */.  in
f8f0: 74 20 69 44 69 73 74 69 6e 63 74 20 3d 20 30 3b  t iDistinct = 0;
f900: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f910: 6f 20 65 6e 73 75 72 65 20 75 6e 69 71 75 65 20  o ensure unique 
f920: 72 65 73 75 6c 74 73 20 69 66 20 55 4e 49 4f 4e  results if UNION
f930: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
f940: 3d 20 53 52 54 5f 54 61 62 6c 65 3b 20 20 20 20  = SRT_Table;    
f950: 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 77 72      /* How to wr
f960: 69 74 65 20 74 6f 20 51 75 65 75 65 20 2a 2f 0a  ite to Queue */.
f970: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
f980: 74 51 75 65 75 65 3b 20 20 20 20 20 20 20 20 20  tQueue;         
f990: 2f 2a 20 53 65 6c 65 63 74 44 65 73 74 20 74 61  /* SelectDest ta
f9a0: 72 67 65 74 74 69 6e 67 20 74 68 65 20 51 75 65  rgetting the Que
f9b0: 75 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ue table */.  in
f9c0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f9e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
f9f0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fa10: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
fa20: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
fa30: 64 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20  derBy;          
fa40: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
fa50: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
fa60: 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
fa70: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 61  set;       /* Sa
fa80: 76 65 64 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  ved LIMIT and OF
fa90: 46 53 45 54 20 2a 2f 0a 20 20 69 6e 74 20 72 65  FSET */.  int re
faa0: 67 4c 69 6d 69 74 2c 20 72 65 67 4f 66 66 73 65  gLimit, regOffse
fab0: 74 3b 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73  t;      /* Regis
fac0: 74 65 72 73 20 75 73 65 64 20 62 79 20 4c 49 4d  ters used by LIM
fad0: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f  IT and OFFSET */
fae0: 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 75  ..  /* Obtain au
faf0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 64  thorization to d
fb00: 6f 20 61 20 72 65 63 75 72 73 69 76 65 20 71 75  o a recursive qu
fb10: 65 72 79 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ery */.  if( sql
fb20: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
fb30: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 43  arse, SQLITE_REC
fb40: 55 52 53 49 56 45 2c 20 30 2c 20 30 2c 20 30 29  URSIVE, 0, 0, 0)
fb50: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
fb60: 20 50 72 6f 63 65 73 73 20 74 68 65 20 4c 49 4d   Process the LIM
fb70: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c  IT and OFFSET cl
fb80: 61 75 73 65 73 2c 20 69 66 20 74 68 65 79 20 65  auses, if they e
fb90: 78 69 73 74 20 2a 2f 0a 20 20 61 64 64 72 42 72  xist */.  addrBr
fba0: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
fbb0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
fbc0: 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67   computeLimitReg
fbd0: 69 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70  isters(pParse, p
fbe0: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
fbf0: 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
fc00: 69 74 3b 0a 20 20 70 4f 66 66 73 65 74 20 3d 20  it;.  pOffset = 
fc10: 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 72 65  p->pOffset;.  re
fc20: 67 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d  gLimit = p->iLim
fc30: 69 74 3b 0a 20 20 72 65 67 4f 66 66 73 65 74 20  it;.  regOffset 
fc40: 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
fc50: 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  p->pLimit = p->p
fc60: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 2d  Offset = 0;.  p-
fc70: 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4f 66  >iLimit = p->iOf
fc80: 66 73 65 74 20 3d 20 30 3b 0a 20 20 70 4f 72 64  fset = 0;.  pOrd
fc90: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
fca0: 42 79 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65  By;..  /* Locate
fcb0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
fcc0: 65 72 20 6f 66 20 74 68 65 20 43 75 72 72 65 6e  er of the Curren
fcd0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 6f 72  t table */.  for
fce0: 28 69 3d 30 3b 20 41 4c 57 41 59 53 28 69 3c 70  (i=0; ALWAYS(i<p
fcf0: 53 72 63 2d 3e 6e 53 72 63 29 3b 20 69 2b 2b 29  Src->nSrc); i++)
fd00: 7b 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  {.    if( pSrc->
fd10: 61 5b 69 5d 2e 69 73 52 65 63 75 72 73 69 76 65  a[i].isRecursive
fd20: 20 29 7b 0a 20 20 20 20 20 20 69 43 75 72 72 65   ){.      iCurre
fd30: 6e 74 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 2e  nt = pSrc->a[i].
fd40: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 62  iCursor;.      b
fd50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
fd60: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
fd70: 75 72 73 6f 72 73 20 6e 75 6d 62 65 72 73 20 66  ursors numbers f
fd80: 6f 72 20 51 75 65 75 65 20 61 6e 64 20 44 69 73  or Queue and Dis
fd90: 74 69 6e 63 74 2e 20 20 54 68 65 20 63 75 72 73  tinct.  The curs
fda0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 0a 20 20  or number for.  
fdb0: 2a 2a 20 74 68 65 20 44 69 73 74 69 6e 63 74 20  ** the Distinct 
fdc0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 65 78  table must be ex
fdd0: 61 63 74 6c 79 20 6f 6e 65 20 67 72 65 61 74 65  actly one greate
fde0: 72 20 74 68 61 6e 20 51 75 65 75 65 20 69 6e 20  r than Queue in 
fdf0: 6f 72 64 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  order.  ** for t
fe00: 68 65 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65  he SRT_DistTable
fe10: 20 61 6e 64 20 53 52 54 5f 44 69 73 74 51 75 65   and SRT_DistQue
fe20: 75 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 73 20  ue destinations 
fe30: 74 6f 20 77 6f 72 6b 2e 20 2a 2f 0a 20 20 69 51  to work. */.  iQ
fe40: 75 65 75 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  ueue = pParse->n
fe50: 54 61 62 2b 2b 3b 0a 20 20 69 66 28 20 70 2d 3e  Tab++;.  if( p->
fe60: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a  op==TK_UNION ){.
fe70: 20 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64      eDest = pOrd
fe80: 65 72 42 79 20 3f 20 53 52 54 5f 44 69 73 74 51  erBy ? SRT_DistQ
fe90: 75 65 75 65 20 3a 20 53 52 54 5f 44 69 73 74 54  ueue : SRT_DistT
fea0: 61 62 6c 65 3b 0a 20 20 20 20 69 44 69 73 74 69  able;.    iDisti
feb0: 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
fec0: 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ab++;.  }else{. 
fed0: 20 20 20 65 44 65 73 74 20 3d 20 70 4f 72 64 65     eDest = pOrde
fee0: 72 42 79 20 3f 20 53 52 54 5f 51 75 65 75 65 20  rBy ? SRT_Queue 
fef0: 3a 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20 7d  : SRT_Table;.  }
ff00: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
ff10: 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 51 75  DestInit(&destQu
ff20: 65 75 65 2c 20 65 44 65 73 74 2c 20 69 51 75 65  eue, eDest, iQue
ff30: 75 65 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  ue);..  /* Alloc
ff40: 61 74 65 20 63 75 72 73 6f 72 73 20 66 6f 72 20  ate cursors for 
ff50: 43 75 72 72 65 6e 74 2c 20 51 75 65 75 65 2c 20  Current, Queue, 
ff60: 61 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 2a 2f  and Distinct. */
ff70: 0a 20 20 72 65 67 43 75 72 72 65 6e 74 20 3d 20  .  regCurrent = 
ff80: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
ff90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ffa0: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73  Op3(v, OP_OpenPs
ffb0: 65 75 64 6f 2c 20 69 43 75 72 72 65 6e 74 2c 20  eudo, iCurrent, 
ffc0: 72 65 67 43 75 72 72 65 6e 74 2c 20 6e 43 6f 6c  regCurrent, nCol
ffd0: 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  );.  if( pOrderB
ffe0: 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
fff0: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6d 75 6c   *pKeyInfo = mul
10000 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
10010 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
10020 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
10030 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10040 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
10050 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72 42   iQueue, pOrderB
10060 79 2d 3e 6e 45 78 70 72 2b 32 2c 20 30 2c 0a 20  y->nExpr+2, 0,. 
10070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10080 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
10090 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  Info, P4_KEYINFO
100a0 29 3b 0a 20 20 20 20 64 65 73 74 51 75 65 75 65  );.    destQueue
100b0 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  .pOrderBy = pOrd
100c0 65 72 42 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erBy;.  }else{. 
100d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
100e0 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
100f0 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65 75 65  phemeral, iQueue
10100 2c 20 6e 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 56  , nCol);.  }.  V
10110 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
10120 51 75 65 75 65 20 74 61 62 6c 65 22 29 29 3b 0a  Queue table"));.
10130 20 20 69 66 28 20 69 44 69 73 74 69 6e 63 74 20    if( iDistinct 
10140 29 7b 0a 20 20 20 20 70 2d 3e 61 64 64 72 4f 70  ){.    p->addrOp
10150 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 73 71 6c 69  enEphm[0] = sqli
10160 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10170 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
10180 6c 2c 20 69 44 69 73 74 69 6e 63 74 2c 20 30 29  l, iDistinct, 0)
10190 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67  ;.    p->selFlag
101a0 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65  s |= SF_UsesEphe
101b0 6d 65 72 61 6c 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  meral;.  }..  /*
101c0 20 44 65 74 61 63 68 20 74 68 65 20 4f 52 44 45   Detach the ORDE
101d0 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
101e0 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
101f0 4c 45 43 54 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  LECT */.  p->pOr
10200 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a  derBy = 0;..  /*
10210 20 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   Store the resul
10220 74 73 20 6f 66 20 74 68 65 20 73 65 74 75 70 2d  ts of the setup-
10230 71 75 65 72 79 20 69 6e 20 51 75 65 75 65 2e 20  query in Queue. 
10240 2a 2f 0a 20 20 70 53 65 74 75 70 2d 3e 70 4e 65  */.  pSetup->pNe
10250 78 74 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73  xt = 0;.  rc = s
10260 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
10270 72 73 65 2c 20 70 53 65 74 75 70 2c 20 26 64 65  rse, pSetup, &de
10280 73 74 51 75 65 75 65 29 3b 0a 20 20 70 53 65 74  stQueue);.  pSet
10290 75 70 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  up->pNext = p;. 
102a0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
102b0 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65 5f  nd_of_recursive_
102c0 71 75 65 72 79 3b 0a 0a 20 20 2f 2a 20 46 69 6e  query;..  /* Fin
102d0 64 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  d the next row i
102e0 6e 20 74 68 65 20 51 75 65 75 65 20 61 6e 64 20  n the Queue and 
102f0 6f 75 74 70 75 74 20 74 68 61 74 20 72 6f 77 20  output that row 
10300 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20 3d 20 73  */.  addrTop = s
10310 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
10320 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
10330 51 75 65 75 65 2c 20 61 64 64 72 42 72 65 61 6b  Queue, addrBreak
10340 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 66 65  );..  /* Transfe
10350 72 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 69  r the next row i
10360 6e 20 51 75 65 75 65 20 6f 76 65 72 20 74 6f 20  n Queue over to 
10370 43 75 72 72 65 6e 74 20 2a 2f 0a 20 20 73 71 6c  Current */.  sql
10380 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10390 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 69 43  , OP_NullRow, iC
103a0 75 72 72 65 6e 74 29 3b 20 2f 2a 20 54 6f 20 72  urrent); /* To r
103b0 65 73 65 74 20 63 6f 6c 75 6d 6e 20 63 61 63 68  eset column cach
103c0 65 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65  e */.  if( pOrde
103d0 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
103e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
103f0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 51 75 65 75  OP_Column, iQueu
10400 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  e, pOrderBy->nEx
10410 70 72 2b 31 2c 20 72 65 67 43 75 72 72 65 6e 74  pr+1, regCurrent
10420 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10430 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10440 32 28 76 2c 20 4f 50 5f 52 6f 77 44 61 74 61 2c  2(v, OP_RowData,
10450 20 69 51 75 65 75 65 2c 20 72 65 67 43 75 72 72   iQueue, regCurr
10460 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ent);.  }.  sqli
10470 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
10480 20 4f 50 5f 44 65 6c 65 74 65 2c 20 69 51 75 65   OP_Delete, iQue
10490 75 65 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ue);..  /* Outpu
104a0 74 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f 77  t the single row
104b0 20 69 6e 20 43 75 72 72 65 6e 74 20 2a 2f 0a 20   in Current */. 
104c0 20 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69   addrCont = sqli
104d0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
104e0 28 76 29 3b 0a 20 20 63 6f 64 65 4f 66 66 73 65  (v);.  codeOffse
104f0 74 28 76 2c 20 72 65 67 4f 66 66 73 65 74 2c 20  t(v, regOffset, 
10500 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 73 65 6c  addrCont);.  sel
10510 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
10520 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
10530 74 2c 20 69 43 75 72 72 65 6e 74 2c 0a 20 20 20  t, iCurrent,.   
10540 20 20 20 30 2c 20 30 2c 20 70 44 65 73 74 2c 20     0, 0, pDest, 
10550 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72 42 72  addrCont, addrBr
10560 65 61 6b 29 3b 0a 20 20 69 66 28 20 72 65 67 4c  eak);.  if( regL
10570 69 6d 69 74 20 29 20 73 71 6c 69 74 65 33 56 64  imit ) sqlite3Vd
10580 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
10590 66 5a 65 72 6f 2c 20 72 65 67 4c 69 6d 69 74 2c  fZero, regLimit,
105a0 20 61 64 64 72 42 72 65 61 6b 2c 20 2d 31 29 3b   addrBreak, -1);
105b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
105c0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64  solveLabel(v, ad
105d0 64 72 43 6f 6e 74 29 3b 0a 0a 20 20 2f 2a 20 45  drCont);..  /* E
105e0 78 65 63 75 74 65 20 74 68 65 20 72 65 63 75 72  xecute the recur
105f0 73 69 76 65 20 53 45 4c 45 43 54 20 74 61 6b 69  sive SELECT taki
10600 6e 67 20 74 68 65 20 73 69 6e 67 6c 65 20 72 6f  ng the single ro
10610 77 20 69 6e 20 43 75 72 72 65 6e 74 20 61 73 0a  w in Current as.
10620 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 66    ** the value f
10630 6f 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65  or the recursive
10640 2d 74 61 62 6c 65 2e 20 53 74 6f 72 65 20 74 68  -table. Store th
10650 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
10660 20 51 75 65 75 65 2e 0a 20 20 2a 2f 0a 20 20 70   Queue..  */.  p
10670 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
10680 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
10690 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 51 75  arse, p, &destQu
106a0 65 75 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  eue);.  assert( 
106b0 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 0a  p->pPrior==0 );.
106c0 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 53    p->pPrior = pS
106d0 65 74 75 70 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70  etup;..  /* Keep
106e0 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 6c 6f 6f   running the loo
106f0 70 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65 75  p until the Queu
10700 65 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  e is empty */.  
10710 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10720 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
10730 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c   addrTop);.  sql
10740 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10750 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
10760 6b 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 72 65 63 75  k);..end_of_recu
10770 72 73 69 76 65 5f 71 75 65 72 79 3a 0a 20 20 70  rsive_query:.  p
10780 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
10790 64 65 72 42 79 3b 0a 20 20 70 2d 3e 70 4c 69 6d  derBy;.  p->pLim
107a0 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 70  it = pLimit;.  p
107b0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
107c0 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  set;.  return;.}
107d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
107e0 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a 0a 2f  E_OMIT_CTE */../
107f0 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
10800 6e 63 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  nces */.static i
10810 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  nt multiSelectOr
10820 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
10830 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
10840 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
10850 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
10860 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10870 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f  The right-most o
10880 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20  f SELECTs to be 
10890 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63  coded */.  Selec
108a0 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20  tDest *pDest    
108b0 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
108c0 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74  ith query result
108d0 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  s */.);.../*.** 
108e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
108f0 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
10900 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  s a compound que
10910 72 79 20 66 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20  ry form from.** 
10920 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  two or more sepa
10930 72 61 74 65 20 71 75 65 72 69 65 73 20 75 73 69  rate queries usi
10940 6e 67 20 55 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20  ng UNION, UNION 
10950 41 4c 4c 2c 20 45 58 43 45 50 54 2c 20 6f 72 0a  ALL, EXCEPT, or.
10960 2a 2a 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 0a  ** INTERSECT.**.
10970 2a 2a 20 22 70 22 20 70 6f 69 6e 74 73 20 74 6f  ** "p" points to
10980 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
10990 6f 66 20 74 68 65 20 74 77 6f 20 71 75 65 72 69  of the two queri
109a0 65 73 2e 20 20 74 68 65 20 71 75 65 72 79 20 6f  es.  the query o
109b0 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 20 69 73  n the.** left is
109c0 20 70 2d 3e 70 50 72 69 6f 72 2e 20 20 54 68 65   p->pPrior.  The
109d0 20 6c 65 66 74 20 71 75 65 72 79 20 63 6f 75 6c   left query coul
109e0 64 20 61 6c 73 6f 20 62 65 20 61 20 63 6f 6d 70  d also be a comp
109f0 6f 75 6e 64 20 71 75 65 72 79 0a 2a 2a 20 69 6e  ound query.** in
10a00 20 77 68 69 63 68 20 63 61 73 65 20 74 68 69 73   which case this
10a10 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65   routine will be
10a20 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
10a30 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ely. .**.** The 
10a40 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 74  results of the t
10a50 6f 74 61 6c 20 71 75 65 72 79 20 61 72 65 20 74  otal query are t
10a60 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  o be written int
10a70 6f 20 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a  o a destination.
10a80 2a 2a 20 6f 66 20 74 79 70 65 20 65 44 65 73 74  ** of type eDest
10a90 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 20   with parameter 
10aa0 69 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  iParm..**.** Exa
10ab0 6d 70 6c 65 20 31 3a 20 20 43 6f 6e 73 69 64 65  mple 1:  Conside
10ac0 72 20 61 20 74 68 72 65 65 2d 77 61 79 20 63 6f  r a three-way co
10ad0 6d 70 6f 75 6e 64 20 53 51 4c 20 73 74 61 74 65  mpound SQL state
10ae0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ment..**.**     
10af0 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
10b00 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20 62 20   UNION SELECT b 
10b10 46 52 4f 4d 20 74 32 20 55 4e 49 4f 4e 20 53 45  FROM t2 UNION SE
10b20 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
10b30 2a 0a 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d  *.** This statem
10b40 65 6e 74 20 69 73 20 70 61 72 73 65 64 20 75 70  ent is parsed up
10b50 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
10b60 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 63 20  **     SELECT c 
10b70 46 52 4f 4d 20 74 33 0a 2a 2a 20 20 20 20 20 20  FROM t3.**      
10b80 7c 0a 2a 2a 20 20 20 20 20 20 60 2d 2d 2d 2d 2d  |.**      `-----
10b90 3e 20 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  >  SELECT b FROM
10ba0 20 74 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   t2.**          
10bb0 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20        |.**      
10bc0 20 20 20 20 20 20 20 20 20 20 60 2d 2d 2d 2d 2d            `-----
10bd0 2d 3e 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f  ->  SELECT a FRO
10be0 4d 20 74 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  M t1.**.** The a
10bf0 72 72 6f 77 73 20 69 6e 20 74 68 65 20 64 69 61  rrows in the dia
10c00 67 72 61 6d 20 61 62 6f 76 65 20 72 65 70 72 65  gram above repre
10c10 73 65 6e 74 20 74 68 65 20 53 65 6c 65 63 74 2e  sent the Select.
10c20 70 50 72 69 6f 72 20 70 6f 69 6e 74 65 72 2e 0a  pPrior pointer..
10c30 2a 2a 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f  ** So if this ro
10c40 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
10c50 77 69 74 68 20 70 20 65 71 75 61 6c 20 74 6f 20  with p equal to 
10c60 74 68 65 20 74 33 20 71 75 65 72 79 2c 20 74 68  the t3 query, th
10c70 65 6e 0a 2a 2a 20 70 50 72 69 6f 72 20 77 69 6c  en.** pPrior wil
10c80 6c 20 62 65 20 74 68 65 20 74 32 20 71 75 65 72  l be the t2 quer
10c90 79 2e 20 20 70 2d 3e 6f 70 20 77 69 6c 6c 20 62  y.  p->op will b
10ca0 65 20 54 4b 5f 55 4e 49 4f 4e 20 69 6e 20 74 68  e TK_UNION in th
10cb0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e  is case..**.** N
10cc0 6f 74 69 63 65 20 74 68 61 74 20 62 65 63 61 75  otice that becau
10cd0 73 65 20 6f 66 20 74 68 65 20 77 61 79 20 53 51  se of the way SQ
10ce0 4c 69 74 65 20 70 61 72 73 65 73 20 63 6f 6d 70  Lite parses comp
10cf0 6f 75 6e 64 20 53 45 4c 45 43 54 73 2c 20 74 68  ound SELECTs, th
10d00 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
10d10 73 65 6c 65 63 74 73 20 61 6c 77 61 79 73 20 67  selects always g
10d20 72 6f 75 70 20 66 72 6f 6d 20 6c 65 66 74 20 74  roup from left t
10d30 6f 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  o right..*/.stat
10d40 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
10d50 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ct(.  Parse *pPa
10d60 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
10d70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10d80 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10da0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53   right-most of S
10db0 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64  ELECTs to be cod
10dc0 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ed */.  SelectDe
10dd0 73 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a  st *pDest     /*
10de0 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68   What to do with
10df0 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
10e00 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
10e10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20  SQLITE_OK;   /* 
10e20 53 75 63 63 65 73 73 20 63 6f 64 65 20 66 72 6f  Success code fro
10e30 6d 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  m a subroutine *
10e40 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72 69  /.  Select *pPri
10e50 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 6f  or;       /* Ano
10e60 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d 65  ther SELECT imme
10e70 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20 6c  diately to our l
10e80 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  eft */.  Vdbe *v
10e90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
10ea0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10eb0 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f 0a  to this VDBE */.
10ec0 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
10ed0 74 3b 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72  t;      /* Alter
10ee0 6e 61 74 69 76 65 20 64 61 74 61 20 64 65 73 74  native data dest
10ef0 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ination */.  Sel
10f00 65 63 74 20 2a 70 44 65 6c 65 74 65 20 3d 20 30  ect *pDelete = 0
10f10 3b 20 20 2f 2a 20 43 68 61 69 6e 20 6f 66 20 73  ;  /* Chain of s
10f20 69 6d 70 6c 65 20 73 65 6c 65 63 74 73 20 74 6f  imple selects to
10f30 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 73 71 6c   delete */.  sql
10f40 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
10f50 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
10f60 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 23 69 66  onnection */.#if
10f70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10f80 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69  _EXPLAIN.  int i
10f90 53 75 62 31 20 3d 20 30 3b 20 20 20 20 20 20 20  Sub1 = 0;       
10fa0 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65   /* EQP id of le
10fb0 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ft-hand query */
10fc0 0a 20 20 69 6e 74 20 69 53 75 62 32 20 3d 20 30  .  int iSub2 = 0
10fd0 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20  ;        /* EQP 
10fe0 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64  id of right-hand
10ff0 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66   query */.#endif
11000 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
11010 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
11020 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54 20 63  ER BY or LIMIT c
11030 6c 61 75 73 65 20 6f 6e 20 70 72 69 6f 72 20 53  lause on prior S
11040 45 4c 45 43 54 73 2e 20 20 4f 6e 6c 79 0a 20 20  ELECTs.  Only.  
11050 2a 2a 20 74 68 65 20 6c 61 73 74 20 28 72 69 67  ** the last (rig
11060 68 74 2d 6d 6f 73 74 29 20 53 45 4c 45 43 54 20  ht-most) SELECT 
11070 69 6e 20 74 68 65 20 73 65 72 69 65 73 20 6d 61  in the series ma
11080 79 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20  y have an ORDER 
11090 42 59 20 6f 72 20 4c 49 4d 49 54 2e 0a 20 20 2a  BY or LIMIT..  *
110a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 20 26 26  /.  assert( p &&
110b0 20 70 2d 3e 70 50 72 69 6f 72 20 29 3b 20 20 2f   p->pPrior );  /
110c0 2a 20 43 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * Calling functi
110d0 6f 6e 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  on guarantees th
110e0 69 73 20 6d 75 63 68 20 2a 2f 0a 20 20 61 73 73  is much */.  ass
110f0 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
11100 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
11110 29 3d 3d 30 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  )==0 || p->op==T
11120 4b 5f 41 4c 4c 20 7c 7c 20 70 2d 3e 6f 70 3d 3d  K_ALL || p->op==
11130 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 64 62  TK_UNION );.  db
11140 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
11150 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72   pPrior = p->pPr
11160 69 6f 72 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70  ior;.  dest = *p
11170 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50 72 69  Dest;.  if( pPri
11180 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  or->pOrderBy ){.
11190 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
111a0 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52 44 45  Msg(pParse,"ORDE
111b0 52 20 42 59 20 63 6c 61 75 73 65 20 73 68 6f 75  R BY clause shou
111c0 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73  ld come after %s
111d0 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20   not before",.  
111e0 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65      selectOpName
111f0 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63  (p->op));.    rc
11200 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d   = 1;.    goto m
11210 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
11220 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72 69 6f  .  }.  if( pPrio
11230 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  r->pLimit ){.   
11240 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11250 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54 20 63  (pParse,"LIMIT c
11260 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d  lause should com
11270 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20 62  e after %s not b
11280 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73 65  efore",.      se
11290 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70  lectOpName(p->op
112a0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a  ));.    rc = 1;.
112b0 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
112c0 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
112d0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
112e0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
112f0 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20  assert( v!=0 ); 
11300 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61 6c 72   /* The VDBE alr
11310 65 61 64 79 20 63 72 65 61 74 65 64 20 62 79 20  eady created by 
11320 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
11330 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   */..  /* Create
11340 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
11350 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
11360 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a 20 20   if necessary.  
11370 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e 65 44  */.  if( dest.eD
11380 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
11390 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
113a0 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
113b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
113c0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
113d0 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e 69 53  hemeral, dest.iS
113e0 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74  DParm, p->pEList
113f0 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->nExpr);.    sq
11400 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
11410 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44  5(v, BTREE_UNORD
11420 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73 74 2e  ERED);.    dest.
11430 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
11440 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  e;.  }..  /* Mak
11450 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c 45 43  e sure all SELEC
11460 54 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  Ts in the statem
11470 65 6e 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  ent have the sam
11480 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
11490 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ents.  ** in the
114a0 69 72 20 72 65 73 75 6c 74 20 73 65 74 73 2e 0a  ir result sets..
114b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
114c0 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50 72 69  ->pEList && pPri
114d0 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20  or->pEList );.  
114e0 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  if( p->pEList->n
114f0 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45  Expr!=pPrior->pE
11500 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
11510 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
11520 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73 20 29  gs & SF_Values )
11530 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11540 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11550 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75 73 74  "all VALUES must
11560 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
11570 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 22 29  umber of terms")
11580 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
11590 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
115a0 73 67 28 70 50 61 72 73 65 2c 20 22 53 45 4c 45  sg(pParse, "SELE
115b0 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  CTs to the left 
115c0 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25 73 22  and right of %s"
115d0 0a 20 20 20 20 20 20 20 20 22 20 64 6f 20 6e 6f  .        " do no
115e0 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
115f0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74  number of result
11600 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63   columns", selec
11610 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
11620 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
11630 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
11640 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
11650 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11660 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 69 66 28  E_OMIT_CTE.  if(
11670 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
11680 46 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  F_Recursive ){. 
11690 20 20 20 67 65 6e 65 72 61 74 65 57 69 74 68 52     generateWithR
116a0 65 63 75 72 73 69 76 65 51 75 65 72 79 28 70 50  ecursiveQuery(pP
116b0 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
116c0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
116d0 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53  .  /* Compound S
116e0 45 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65  ELECTs that have
116f0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
11700 75 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  use are handled 
11710 73 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f  separately..  */
11720 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
11730 42 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  By ){.    return
11740 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
11750 72 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rBy(pParse, p, p
11760 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  Dest);.  }else..
11770 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
11780 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
11790 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
117a0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
117b0 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
117c0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
117d0 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
117e0 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
117f0 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
11800 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
11810 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
11820 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
11830 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
11840 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
11850 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
11860 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  set;.      pPrio
11870 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
11880 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
11890 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
118a0 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
118b0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
118c0 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
118d0 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
118e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
118f0 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
11900 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
11910 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
11920 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
11930 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
11940 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
11950 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
11960 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
11970 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
11980 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
11990 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
119a0 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
119b0 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
119c0 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
119d0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
119e0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
119f0 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
11a00 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
11a10 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  Zero, p->iLimit)
11a20 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
11a30 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
11a40 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
11a50 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
11a60 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e   }.      explain
11a70 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
11a80 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
11a90 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
11aa0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
11ab0 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
11ac0 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
11ad0 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
11ae0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
11af0 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
11b00 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
11b10 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
11b20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
11b30 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
11b40 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
11b50 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
11b60 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
11b70 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
11b80 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26  Prior->pLimit, &
11b90 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
11ba0 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
11bb0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75  >nSelectRow > (u
11bc0 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20  64)nLimit .     
11bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
11be0 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d  SelectRow = nLim
11bf0 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
11c00 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
11c10 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11c20 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
11c30 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
11c40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
11c50 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
11c60 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
11c70 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
11c80 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
11c90 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
11ca0 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
11cb0 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
11cc0 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
11cd0 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
11ce0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
11cf0 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
11d00 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
11d10 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
11d20 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
11d30 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
11d40 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
11d50 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
11d60 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
11d70 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
11d80 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
11d90 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
11da0 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
11db0 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
11dc0 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
11dd0 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74  est;..      test
11de0 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
11df0 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
11e00 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
11e10 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
11e20 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
11e30 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
11e40 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
11e50 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20  iorOp ){.       
11e60 20 2f 2a 20 57 65 20 63 61 6e 20 72 65 75 73 65   /* We can reuse
11e70 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
11e80 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  le generated by 
11e90 61 20 53 45 4c 45 43 54 20 74 6f 20 6f 75 72 0a  a SELECT to our.
11ea0 20 20 20 20 20 20 20 20 2a 2a 20 72 69 67 68 74          ** right
11eb0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
11ec0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
11ed0 70 4c 69 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20  pLimit==0 );    
11ee0 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64    /* Not allowed
11ef0 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65 6c 65   on leftward ele
11f00 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
11f10 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
11f20 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a  set==0 );     /*
11f30 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   Not allowed on 
11f40 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74  leftward element
11f50 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69  s */.        uni
11f60 6f 6e 54 61 62 20 3d 20 64 65 73 74 2e 69 53 44  onTab = dest.iSD
11f70 50 61 72 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Parm;.      }els
11f80 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  e{.        /* We
11f90 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72   will need to cr
11fa0 65 61 74 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d  eate our own tem
11fb0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 74 6f 20  porary table to 
11fc0 68 6f 6c 64 20 74 68 65 0a 20 20 20 20 20 20 20  hold the.       
11fd0 20 2a 2a 20 69 6e 74 65 72 6d 65 64 69 61 74 65   ** intermediate
11fe0 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 20 20   results..      
11ff0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 6e 69    */.        uni
12000 6f 6e 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  onTab = pParse->
12010 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nTab++;.        
12020 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
12030 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
12040 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
12050 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12060 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
12070 75 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20  unionTab, 0);.  
12080 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
12090 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
120a0 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
120b0 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
120c0 6d 5b 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20  m[0] = addr;.   
120d0 20 20 20 20 20 66 69 6e 64 52 69 67 68 74 6d 6f       findRightmo
120e0 73 74 28 70 29 2d 3e 73 65 6c 46 6c 61 67 73 20  st(p)->selFlags 
120f0 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d 65  |= SF_UsesEpheme
12100 72 61 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ral;.        ass
12110 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
12120 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
12130 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53 45 4c   /* Code the SEL
12140 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
12150 6f 20 6f 75 72 20 6c 65 66 74 0a 20 20 20 20 20  o our left.     
12160 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
12170 28 20 21 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  ( !pPrior->pOrde
12180 72 42 79 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  rBy );.      sql
12190 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
121a0 69 74 28 26 75 6e 69 6f 6e 64 65 73 74 2c 20 70  it(&uniondest, p
121b0 72 69 6f 72 4f 70 2c 20 75 6e 69 6f 6e 54 61 62  riorOp, unionTab
121c0 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e  );.      explain
121d0 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31  SetInteger(iSub1
121e0 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
121f0 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
12200 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
12210 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  ct(pParse, pPrio
12220 72 2c 20 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a  r, &uniondest);.
12230 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
12240 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
12250 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
12260 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
12270 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
12280 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
12290 6e 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  nt.      */.    
122a0 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
122b0 45 58 43 45 50 54 20 29 7b 0a 20 20 20 20 20 20  EXCEPT ){.      
122c0 20 20 6f 70 20 3d 20 53 52 54 5f 45 78 63 65 70    op = SRT_Excep
122d0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
122e0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
122f0 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
12300 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  );.        op = 
12310 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20  SRT_Union;.     
12320 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69   }.      p->pPri
12330 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  or = 0;.      pL
12340 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
12350 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69  ;.      p->pLimi
12360 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 66  t = 0;.      pOf
12370 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  fset = p->pOffse
12380 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
12390 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  set = 0;.      u
123a0 6e 69 6f 6e 64 65 73 74 2e 65 44 65 73 74 20 3d  niondest.eDest =
123b0 20 6f 70 3b 0a 20 20 20 20 20 20 65 78 70 6c 61   op;.      expla
123c0 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
123d0 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
123e0 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
123f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65    rc = sqlite3Se
12400 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20  lect(pParse, p, 
12410 26 75 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20  &uniondest);.   
12420 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
12430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
12440 20 20 20 20 2f 2a 20 51 75 65 72 79 20 66 6c 61      /* Query fla
12450 74 74 65 6e 69 6e 67 20 69 6e 20 73 71 6c 69 74  ttening in sqlit
12460 65 33 53 65 6c 65 63 74 28 29 20 6d 69 67 68 74  e3Select() might
12470 20 72 65 66 69 6c 6c 20 70 2d 3e 70 4f 72 64 65   refill p->pOrde
12480 72 42 79 2e 0a 20 20 20 20 20 20 2a 2a 20 42 65  rBy..      ** Be
12490 20 73 75 72 65 20 74 6f 20 64 65 6c 65 74 65 20   sure to delete 
124a0 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 74 68 65  p->pOrderBy, the
124b0 72 65 66 6f 72 65 2c 20 74 6f 20 61 76 6f 69 64  refore, to avoid
124c0 20 61 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 2e 20   a memory leak. 
124d0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
124e0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
124f0 62 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  b, p->pOrderBy);
12500 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
12510 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
12520 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
12530 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
12540 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
12550 20 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b     if( p->op==TK
12560 5f 55 4e 49 4f 4e 20 29 20 70 2d 3e 6e 53 65 6c  _UNION ) p->nSel
12570 65 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72  ectRow += pPrior
12580 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
12590 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
125a0 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69  elete(db, p->pLi
125b0 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  mit);.      p->p
125c0 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
125d0 20 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74        p->pOffset
125e0 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 20 20   = pOffset;.    
125f0 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 30 3b    p->iLimit = 0;
12600 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
12610 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  t = 0;..      /*
12620 20 43 6f 6e 76 65 72 74 20 74 68 65 20 64 61 74   Convert the dat
12630 61 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  a in the tempora
12640 72 79 20 74 61 62 6c 65 20 69 6e 74 6f 20 77 68  ry table into wh
12650 61 74 65 76 65 72 20 66 6f 72 6d 0a 20 20 20 20  atever form.    
12660 20 20 2a 2a 20 69 74 20 69 73 20 74 68 61 74 20    ** it is that 
12670 77 65 20 63 75 72 72 65 6e 74 6c 79 20 6e 65 65  we currently nee
12680 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
12690 20 20 61 73 73 65 72 74 28 20 75 6e 69 6f 6e 54    assert( unionT
126a0 61 62 3d 3d 64 65 73 74 2e 69 53 44 50 61 72 6d  ab==dest.iSDParm
126b0 20 7c 7c 20 64 65 73 74 2e 65 44 65 73 74 21 3d   || dest.eDest!=
126c0 70 72 69 6f 72 4f 70 20 29 3b 0a 20 20 20 20 20  priorOp );.     
126d0 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 21   if( dest.eDest!
126e0 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20 20 20 20  =priorOp ){.    
126f0 20 20 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69      int iCont, i
12700 42 72 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20  Break, iStart;. 
12710 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12720 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
12730 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
12740 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
12750 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
12760 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
12770 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
12780 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20   pFirst->pPrior 
12790 29 20 70 46 69 72 73 74 20 3d 20 70 46 69 72 73  ) pFirst = pFirs
127a0 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20  t->pPrior;.     
127b0 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c       generateCol
127c0 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
127d0 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69   0, pFirst->pELi
127e0 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
127f0 20 20 20 20 20 20 20 69 42 72 65 61 6b 20 3d 20         iBreak = 
12800 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
12810 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20  abel(v);.       
12820 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
12830 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
12840 3b 0a 20 20 20 20 20 20 20 20 63 6f 6d 70 75 74  ;.        comput
12850 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
12860 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61  pParse, p, iBrea
12870 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
12880 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12890 20 4f 50 5f 52 65 77 69 6e 64 2c 20 75 6e 69 6f   OP_Rewind, unio
128a0 6e 54 61 62 2c 20 69 42 72 65 61 6b 29 3b 0a 20  nTab, iBreak);. 
128b0 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
128c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
128d0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
128e0 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f     selectInnerLo
128f0 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  op(pParse, p, p-
12900 3e 70 45 4c 69 73 74 2c 20 75 6e 69 6f 6e 54 61  >pEList, unionTa
12910 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
12920 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c             0, 0,
12930 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69   &dest, iCont, i
12940 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
12950 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
12960 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
12970 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12980 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12990 4f 50 5f 4e 65 78 74 2c 20 75 6e 69 6f 6e 54 61  OP_Next, unionTa
129a0 62 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  b, iStart);.    
129b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
129c0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
129d0 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20 20  Break);.        
129e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
129f0 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 75  2(v, OP_Close, u
12a00 6e 69 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20  nionTab, 0);.   
12a10 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
12a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
12a30 75 6c 74 3a 20 61 73 73 65 72 74 28 20 70 2d 3e  ult: assert( p->
12a40 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54  op==TK_INTERSECT
12a50 20 29 3b 20 7b 0a 20 20 20 20 20 20 69 6e 74 20   ); {.      int 
12a60 74 61 62 31 2c 20 74 61 62 32 3b 0a 20 20 20 20  tab1, tab2;.    
12a70 20 20 69 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72    int iCont, iBr
12a80 65 61 6b 2c 20 69 53 74 61 72 74 3b 0a 20 20 20  eak, iStart;.   
12a90 20 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c     Expr *pLimit,
12aa0 20 2a 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20   *pOffset;.     
12ab0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
12ac0 20 53 65 6c 65 63 74 44 65 73 74 20 69 6e 74 65   SelectDest inte
12ad0 72 73 65 63 74 64 65 73 74 3b 0a 20 20 20 20 20  rsectdest;.     
12ae0 20 69 6e 74 20 72 31 3b 0a 0a 20 20 20 20 20 20   int r1;..      
12af0 2f 2a 20 49 4e 54 45 52 53 45 43 54 20 69 73 20  /* INTERSECT is 
12b00 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
12b10 68 65 20 6f 74 68 65 72 73 20 73 69 6e 63 65 20  he others since 
12b20 69 74 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  it requires.    
12b30 20 20 2a 2a 20 74 77 6f 20 74 65 6d 70 6f 72 61    ** two tempora
12b40 72 79 20 74 61 62 6c 65 73 2e 20 20 48 65 6e 63  ry tables.  Henc
12b50 65 20 69 74 20 68 61 73 20 69 74 73 20 6f 77 6e  e it has its own
12b60 20 63 61 73 65 2e 20 20 42 65 67 69 6e 0a 20 20   case.  Begin.  
12b70 20 20 20 20 2a 2a 20 62 79 20 61 6c 6c 6f 63 61      ** by alloca
12b80 74 69 6e 67 20 74 68 65 20 74 61 62 6c 65 73 20  ting the tables 
12b90 77 65 20 77 69 6c 6c 20 6e 65 65 64 2e 0a 20 20  we will need..  
12ba0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 61 62      */.      tab
12bb0 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  1 = pParse->nTab
12bc0 2b 2b 3b 0a 20 20 20 20 20 20 74 61 62 32 20 3d  ++;.      tab2 =
12bd0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
12be0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12bf0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
12c00 0a 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ..      addr = s
12c10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12c20 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
12c30 65 72 61 6c 2c 20 74 61 62 31 2c 20 30 29 3b 0a  eral, tab1, 0);.
12c40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
12c50 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d  >addrOpenEphm[0]
12c60 20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20   == -1 );.      
12c70 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
12c80 30 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20  0] = addr;.     
12c90 20 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70   findRightmost(p
12ca0 29 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  )->selFlags |= S
12cb0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b  F_UsesEphemeral;
12cc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12cd0 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 0a 20 20 20  ->pEList );..   
12ce0 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 53     /* Code the S
12cf0 45 4c 45 43 54 73 20 74 6f 20 6f 75 72 20 6c 65  ELECTs to our le
12d00 66 74 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72  ft into temporar
12d10 79 20 74 61 62 6c 65 20 22 74 61 62 31 22 2e 0a  y table "tab1"..
12d20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
12d30 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
12d40 49 6e 69 74 28 26 69 6e 74 65 72 73 65 63 74 64  Init(&intersectd
12d50 65 73 74 2c 20 53 52 54 5f 55 6e 69 6f 6e 2c 20  est, SRT_Union, 
12d60 74 61 62 31 29 3b 0a 20 20 20 20 20 20 65 78 70  tab1);.      exp
12d70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
12d80 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub1, pParse->iN
12d90 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
12da0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12db0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
12dc0 50 72 69 6f 72 2c 20 26 69 6e 74 65 72 73 65 63  Prior, &intersec
12dd0 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66  tdest);.      if
12de0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
12df0 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63  goto multi_selec
12e00 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  t_end;.      }..
12e10 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68        /* Code th
12e20 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54  e current SELECT
12e30 20 69 6e 74 6f 20 74 65 6d 70 6f 72 61 72 79 20   into temporary 
12e40 74 61 62 6c 65 20 22 74 61 62 32 22 0a 20 20 20  table "tab2".   
12e50 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
12e60 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
12e70 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp2(v, OP_OpenE
12e80 70 68 65 6d 65 72 61 6c 2c 20 74 61 62 32 2c 20  phemeral, tab2, 
12e90 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0);.      assert
12ea0 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  ( p->addrOpenEph
12eb0 6d 5b 31 5d 20 3d 3d 20 2d 31 20 29 3b 0a 20 20  m[1] == -1 );.  
12ec0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
12ed0 70 68 6d 5b 31 5d 20 3d 20 61 64 64 72 3b 0a 20  phm[1] = addr;. 
12ee0 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d       p->pPrior =
12ef0 20 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74   0;.      pLimit
12f00 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20   = p->pLimit;.  
12f10 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
12f20 30 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74  0;.      pOffset
12f30 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20   = p->pOffset;. 
12f40 20 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20       p->pOffset 
12f50 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 65 72  = 0;.      inter
12f60 73 65 63 74 64 65 73 74 2e 69 53 44 50 61 72 6d  sectdest.iSDParm
12f70 20 3d 20 74 61 62 32 3b 0a 20 20 20 20 20 20 65   = tab2;.      e
12f80 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
12f90 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
12fa0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
12fb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12fc0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
12fd0 20 70 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65   p, &intersectde
12fe0 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  st);.      testc
12ff0 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ase( rc!=SQLITE_
13000 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65 6c  OK );.      pDel
13010 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b  ete = p->pPrior;
13020 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72  .      p->pPrior
13030 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20   = pPrior;.     
13040 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52   if( p->nSelectR
13050 6f 77 3e 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  ow>pPrior->nSele
13060 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c 65  ctRow ) p->nSele
13070 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d 3e  ctRow = pPrior->
13080 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
13090 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
130a0 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69  ete(db, p->pLimi
130b0 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69  t);.      p->pLi
130c0 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
130d0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
130e0 20 70 4f 66 66 73 65 74 3b 0a 0a 20 20 20 20 20   pOffset;..     
130f0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
13100 65 20 74 6f 20 74 61 6b 65 20 74 68 65 20 69 6e  e to take the in
13110 74 65 72 73 65 63 74 69 6f 6e 20 6f 66 20 74 68  tersection of th
13120 65 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 0a  e two temporary.
13130 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 2e        ** tables.
13140 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13150 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
13160 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t );.      if( d
13170 65 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f  est.eDest==SRT_O
13180 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
13190 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
131a0 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = p;.        whi
131b0 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
131c0 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
131d0 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
131e0 20 20 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f        generateCo
131f0 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
13200 2c 20 30 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c  , 0, pFirst->pEL
13210 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
13220 20 20 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c      iBreak = sql
13230 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
13240 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 43 6f 6e  l(v);.      iCon
13250 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
13260 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
13270 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52     computeLimitR
13280 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
13290 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   p, iBreak);.   
132a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
132b0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
132c0 64 2c 20 74 61 62 31 2c 20 69 42 72 65 61 6b 29  d, tab1, iBreak)
132d0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
132e0 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
132f0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 53  Parse);.      iS
13300 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
13310 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
13320 6f 77 4b 65 79 2c 20 74 61 62 31 2c 20 72 31 29  owKey, tab1, r1)
13330 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13340 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
13350 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 74 61 62  OP_NotFound, tab
13360 32 2c 20 69 43 6f 6e 74 2c 20 72 31 2c 20 30 29  2, iCont, r1, 0)
13370 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
13380 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
13390 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
133a0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
133b0 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70  (pParse, p, p->p
133c0 45 4c 69 73 74 2c 20 74 61 62 31 2c 0a 20 20 20  EList, tab1,.   
133d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133e0 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
133f0 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
13400 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13410 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
13420 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20 73   iCont);.      s
13430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
13440 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 74 61 62  (v, OP_Next, tab
13450 31 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20  1, iStart);.    
13460 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
13470 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72  olveLabel(v, iBr
13480 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
13490 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
134a0 20 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 32 2c   OP_Close, tab2,
134b0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
134c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
134d0 4f 50 5f 43 6c 6f 73 65 2c 20 74 61 62 31 2c 20  OP_Close, tab1, 
134e0 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
134f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 65 78  .    }.  }..  ex
13500 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 70  plainComposite(p
13510 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20 69 53  Parse, p->op, iS
13520 75 62 31 2c 20 69 53 75 62 32 2c 20 70 2d 3e 6f  ub1, iSub2, p->o
13530 70 21 3d 54 4b 5f 41 4c 4c 29 3b 0a 0a 20 20 2f  p!=TK_ALL);..  /
13540 2a 20 43 6f 6d 70 75 74 65 20 63 6f 6c 6c 61 74  * Compute collat
13550 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
13560 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 65 6d 70  ed by .  ** temp
13570 6f 72 61 72 79 20 74 61 62 6c 65 73 20 6e 65 65  orary tables nee
13580 64 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ded to implement
13590 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
135a0 6c 65 63 74 2e 0a 20 20 2a 2a 20 41 74 74 61 63  lect..  ** Attac
135b0 68 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74  h the KeyInfo st
135c0 72 75 63 74 75 72 65 20 74 6f 20 61 6c 6c 20 74  ructure to all t
135d0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 2e  emporary tables.
135e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
135f0 73 65 63 74 69 6f 6e 20 69 73 20 72 75 6e 20 62  section is run b
13600 79 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  y the right-most
13610 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
13620 74 20 6f 6e 6c 79 2e 0a 20 20 2a 2a 20 53 45 4c  t only..  ** SEL
13630 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74  ECT statements t
13640 6f 20 74 68 65 20 6c 65 66 74 20 61 6c 77 61 79  o the left alway
13650 73 20 73 6b 69 70 20 74 68 69 73 20 70 61 72 74  s skip this part
13660 2e 20 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  .  The right-mos
13670 74 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 6d 69  t.  ** SELECT mi
13680 67 68 74 20 61 6c 73 6f 20 73 6b 69 70 20 74 68  ght also skip th
13690 69 73 20 70 61 72 74 20 69 66 20 69 74 20 68 61  is part if it ha
136a0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
136b0 61 75 73 65 20 61 6e 64 0a 20 20 2a 2a 20 6e 6f  ause and.  ** no
136c0 20 74 65 6d 70 20 74 61 62 6c 65 73 20 61 72 65   temp tables are
136d0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
136e0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
136f0 73 20 26 20 53 46 5f 55 73 65 73 45 70 68 65 6d  s & SF_UsesEphem
13700 65 72 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  eral ){.    int 
13710 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
13720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
13730 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
13740 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
13750 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  fo;            /
13760 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
13770 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 65 73  ence for the res
13780 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 20 20 53  ult set */.    S
13790 65 6c 65 63 74 20 2a 70 4c 6f 6f 70 3b 20 20 20  elect *pLoop;   
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
137b0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f  For looping thro
137c0 75 67 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ugh SELECT state
137d0 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 43 6f 6c  ments */.    Col
137e0 6c 53 65 71 20 2a 2a 61 70 43 6f 6c 6c 3b 20 20  lSeq **apColl;  
137f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
13800 72 20 6c 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67  r looping throug
13810 68 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  h pKeyInfo->aCol
13820 6c 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  l[] */.    int n
13830 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
13840 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13850 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
13860 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
13870 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
13880 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20 20 6e  Next==0 );.    n
13890 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
138a0 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
138b0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65  Info = sqlite3Ke
138c0 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e  yInfoAlloc(db, n
138d0 43 6f 6c 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  Col, 1);.    if(
138e0 20 21 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20   !pKeyInfo ){.  
138f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13900 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
13910 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65  o multi_select_e
13920 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  nd;.    }.    fo
13930 72 28 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b  r(i=0, apColl=pK
13940 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69  eyInfo->aColl; i
13950 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f  <nCol; i++, apCo
13960 6c 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70  ll++){.      *ap
13970 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65  Coll = multiSele
13980 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
13990 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  , p, i);.      i
139a0 66 28 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b  f( 0==*apColl ){
139b0 0a 20 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  .        *apColl
139c0 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
139d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
139e0 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70  .    for(pLoop=p
139f0 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70  ; pLoop; pLoop=p
13a00 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 29 7b 0a 20  Loop->pPrior){. 
13a10 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13a20 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  2; i++){.       
13a30 20 69 6e 74 20 61 64 64 72 20 3d 20 70 4c 6f 6f   int addr = pLoo
13a40 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13a50 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
13a60 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 20 20  addr<0 ){.      
13a70 20 20 20 20 2f 2a 20 49 66 20 5b 30 5d 20 69 73      /* If [0] is
13a80 20 75 6e 75 73 65 64 20 74 68 65 6e 20 5b 31 5d   unused then [1]
13a90 20 69 73 20 61 6c 73 6f 20 75 6e 75 73 65 64 2e   is also unused.
13aa0 20 20 53 6f 20 77 65 20 63 61 6e 0a 20 20 20 20    So we can.    
13ab0 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
13ac0 73 61 66 65 6c 79 20 61 62 6f 72 74 20 61 73 20  safely abort as 
13ad0 73 6f 6f 6e 20 61 73 20 74 68 65 20 66 69 72 73  soon as the firs
13ae0 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20 69 73  t unused slot is
13af0 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   found */.      
13b00 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 6f      assert( pLoo
13b10 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  p->addrOpenEphm[
13b20 31 5d 3c 30 20 29 3b 0a 20 20 20 20 20 20 20 20  1]<0 );.        
13b30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13b40 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
13b50 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
13b60 2c 20 61 64 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20  , addr, nCol);. 
13b70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13b80 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 61 64  beChangeP4(v, ad
13b90 64 72 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  dr, (char*)sqlit
13ba0 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
13bb0 79 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20  yInfo),.        
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bd0 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
13be0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
13bf0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 20  addrOpenEphm[i] 
13c00 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
13c10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4b    }.    sqlite3K
13c20 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
13c30 49 6e 66 6f 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74  Info);.  }..mult
13c40 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20  i_select_end:.  
13c50 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 64  pDest->iSdst = d
13c60 65 73 74 2e 69 53 64 73 74 3b 0a 20 20 70 44 65  est.iSdst;.  pDe
13c70 73 74 2d 3e 6e 53 64 73 74 20 3d 20 64 65 73 74  st->nSdst = dest
13c80 2e 6e 53 64 73 74 3b 0a 20 20 73 71 6c 69 74 65  .nSdst;.  sqlite
13c90 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
13ca0 2c 20 70 44 65 6c 65 74 65 29 3b 0a 20 20 72 65  , pDelete);.  re
13cb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
13cc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
13cd0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
13ce0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20   */../*.** Code 
13cf0 61 6e 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75  an output subrou
13d00 74 69 6e 65 20 66 6f 72 20 61 20 63 6f 72 6f 75  tine for a corou
13d10 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tine implementat
13d20 69 6f 6e 20 6f 66 20 61 0a 2a 2a 20 53 45 4c 45  ion of a.** SELE
13d30 43 54 20 73 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a  CT statment..**.
13d40 2a 2a 20 54 68 65 20 64 61 74 61 20 74 6f 20 62  ** The data to b
13d50 65 20 6f 75 74 70 75 74 20 69 73 20 63 6f 6e 74  e output is cont
13d60 61 69 6e 65 64 20 69 6e 20 70 49 6e 2d 3e 69 53  ained in pIn->iS
13d70 64 73 74 2e 20 20 54 68 65 72 65 20 61 72 65 0a  dst.  There are.
13d80 2a 2a 20 70 49 6e 2d 3e 6e 53 64 73 74 20 63 6f  ** pIn->nSdst co
13d90 6c 75 6d 6e 73 20 74 6f 20 62 65 20 6f 75 74 70  lumns to be outp
13da0 75 74 2e 20 20 70 44 65 73 74 20 69 73 20 77 68  ut.  pDest is wh
13db0 65 72 65 20 74 68 65 20 6f 75 74 70 75 74 20 73  ere the output s
13dc0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 6e 74  hould.** be sent
13dd0 2e 0a 2a 2a 0a 2a 2a 20 72 65 67 52 65 74 75 72  ..**.** regRetur
13de0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
13df0 6f 66 20 74 68 65 20 72 65 67 69 73 74 65 72 20  of the register 
13e00 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 75 62 72  holding the subr
13e10 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
13e20 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
13e30 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68 65  If regPrev>0 the
13e40 6e 20 69 74 20 69 73 20 74 68 65 20 66 69 72 73  n it is the firs
13e50 74 20 72 65 67 69 73 74 65 72 20 69 6e 20 61 20  t register in a 
13e60 76 65 63 74 6f 72 20 74 68 61 74 0a 2a 2a 20 72  vector that.** r
13e70 65 63 6f 72 64 73 20 74 68 65 20 70 72 65 76 69  ecords the previ
13e80 6f 75 73 20 6f 75 74 70 75 74 2e 20 20 6d 65 6d  ous output.  mem
13e90 5b 72 65 67 50 72 65 76 5d 20 69 73 20 61 20 66  [regPrev] is a f
13ea0 6c 61 67 20 74 68 61 74 20 69 73 20 66 61 6c 73  lag that is fals
13eb0 65 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61  e.** if there ha
13ec0 73 20 62 65 65 6e 20 6e 6f 20 70 72 65 76 69 6f  s been no previo
13ed0 75 73 20 6f 75 74 70 75 74 2e 20 20 49 66 20 72  us output.  If r
13ee0 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 63 6f  egPrev>0 then co
13ef0 64 65 20 69 73 0a 2a 2a 20 67 65 6e 65 72 61 74  de is.** generat
13f00 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 64  ed to suppress d
13f10 75 70 6c 69 63 61 74 65 73 2e 20 20 70 4b 65 79  uplicates.  pKey
13f20 49 6e 66 6f 20 69 73 20 75 73 65 64 20 66 6f 72  Info is used for
13f30 20 63 6f 6d 70 61 72 69 6e 67 0a 2a 2a 20 6b 65   comparing.** ke
13f40 79 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ys..**.** If the
13f50 20 4c 49 4d 49 54 20 66 6f 75 6e 64 20 69 6e 20   LIMIT found in 
13f60 70 2d 3e 69 4c 69 6d 69 74 20 69 73 20 72 65 61  p->iLimit is rea
13f70 63 68 65 64 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  ched, jump immed
13f80 69 61 74 65 6c 79 20 74 6f 0a 2a 2a 20 69 42 72  iately to.** iBr
13f90 65 61 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  eak..*/.static i
13fa0 6e 74 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75  nt generateOutpu
13fb0 74 53 75 62 72 6f 75 74 69 6e 65 28 0a 20 20 50  tSubroutine(.  P
13fc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13fd0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
13fe0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
13ff0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
14000 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
14010 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
14020 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
14030 70 49 6e 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  pIn,        /* C
14040 6f 72 6f 75 74 69 6e 65 20 73 75 70 70 6c 79 69  oroutine supplyi
14050 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c  ng data */.  Sel
14060 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20  ectDest *pDest, 
14070 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
14080 20 73 65 6e 64 20 74 68 65 20 64 61 74 61 20 2a   send the data *
14090 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 74 75 72  /.  int regRetur
140a0 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  n,          /* T
140b0 68 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  he return addres
140c0 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20  s register */.  
140d0 69 6e 74 20 72 65 67 50 72 65 76 2c 20 20 20 20  int regPrev,    
140e0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69          /* Previ
140f0 6f 75 73 20 72 65 73 75 6c 74 20 72 65 67 69 73  ous result regis
14100 74 65 72 2e 20 20 4e 6f 20 75 6e 69 71 75 65 6e  ter.  No uniquen
14110 65 73 73 20 69 66 20 30 20 2a 2f 0a 20 20 4b 65  ess if 0 */.  Ke
14120 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
14130 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6d        /* For com
14140 70 61 72 69 6e 67 20 77 69 74 68 20 70 72 65 76  paring with prev
14150 69 6f 75 73 20 65 6e 74 72 79 20 2a 2f 0a 20 20  ious entry */.  
14160 69 6e 74 20 69 42 72 65 61 6b 20 20 20 20 20 20  int iBreak      
14170 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
14180 68 65 72 65 20 69 66 20 77 65 20 68 69 74 20 74  here if we hit t
14190 68 65 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20  he LIMIT */.){. 
141a0 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
141b0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
141c0 69 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74  iContinue;.  int
141d0 20 61 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d   addr;..  addr =
141e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
141f0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43  entAddr(v);.  iC
14200 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
14210 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
14220 29 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  );..  /* Suppres
14230 73 20 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72  s duplicates for
14240 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
14250 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20  and INTERSECT . 
14260 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65   */.  if( regPre
14270 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c  v ){.    int j1,
14280 20 6a 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71   j2;.    j1 = sq
14290 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
142a0 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67  v, OP_IfNot, reg
142b0 50 72 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20  Prev);.    j2 = 
142c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
142d0 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
142e0 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67   pIn->iSdst, reg
142f0 50 72 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64  Prev+1, pIn->nSd
14300 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  st,.            
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14320 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33    (char*)sqlite3
14330 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49  KeyInfoRef(pKeyI
14340 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  nfo), P4_KEYINFO
14350 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
14360 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a  beAddOp3(v, OP_J
14370 75 6d 70 2c 20 6a 32 2b 32 2c 20 69 43 6f 6e 74  ump, j2+2, iCont
14380 69 6e 75 65 2c 20 6a 32 2b 32 29 3b 0a 20 20 20  inue, j2+2);.   
14390 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
143a0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
143b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
143c0 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70  p3(v, OP_Copy, p
143d0 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
143e0 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
143f0 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
14400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14410 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 72 65 67  _Integer, 1, reg
14420 50 72 65 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Prev);.  }.  if(
14430 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
14440 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
14450 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70  rn 0;..  /* Supp
14460 72 65 73 73 20 74 68 65 20 66 69 72 73 74 20 4f  ress the first O
14470 46 46 53 45 54 20 65 6e 74 72 69 65 73 20 69 66  FFSET entries if
14480 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 46 46   there is an OFF
14490 53 45 54 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a  SET clause.  */.
144a0 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
144b0 70 2d 3e 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e  p->iOffset, iCon
144c0 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63  tinue);..  switc
144d0 68 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20  h( pDest->eDest 
144e0 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ){.    /* Store 
144f0 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
14500 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
14510 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
14520 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
14530 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
14540 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
14550 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
14560 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
14570 73 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  se);.      int r
14580 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
14590 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
145a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
145b0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
145c0 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
145d0 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
145e0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65  >eDest==SRT_Ephe
145f0 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
14600 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
14610 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
14620 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
14630 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20  n->nSdst, r1);. 
14640 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14650 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
14660 52 6f 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53  Rowid, pDest->iS
14670 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20  DParm, r2);.    
14680 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14690 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
146a0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
146b0 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20  , r1, r2);.     
146c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
146d0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
146e0 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71  PPEND);.      sq
146f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
14700 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
14710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65  .      sqlite3Re
14720 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
14730 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
14740 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
14750 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14760 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f  T_SUBQUERY.    /
14770 2a 20 49 66 20 77 65 20 61 72 65 20 63 72 65 61  * If we are crea
14780 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61  ting a set for a
14790 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45  n "expr IN (SELE
147a0 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75  CT ...)" constru
147b0 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ct,.    ** then 
147c0 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
147d0 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e  a single item on
147e0 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69   the stack.  Wri
147f0 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  te this.    ** i
14800 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74  tem into the set
14810 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75   table with bogu
14820 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20  s data..    */. 
14830 20 20 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a     case SRT_Set:
14840 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
14850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
14860 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a  In->nSdst==1 );.
14870 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66        pDest->aff
14880 53 64 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20  Sdst = .        
14890 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
148a0 66 66 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73  ffinity(p->pELis
148b0 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70  t->a[0].pExpr, p
148c0 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a  Dest->affSdst);.
148d0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
148e0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
148f0 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
14900 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14910 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
14920 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72  pIn->iSdst, 1, r
14930 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
14940 73 74 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  st,1);.      sql
14950 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
14960 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
14970 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
14980 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
14990 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
149a0 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65  P_IdxInsert, pDe
149b0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29  st->iSDParm, r1)
149c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
149d0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
149e0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
149f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
14a00 69 66 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f  if 0  /* Never o
14a10 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45  ccurs on an ORDE
14a20 52 20 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20  R BY query */.  
14a30 20 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20    /* If any row 
14a40 65 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73  exist in the res
14a50 75 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20  ult set, record 
14a60 74 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62  that fact and ab
14a70 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ort..    */.    
14a80 63 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a  case SRT_Exists:
14a90 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
14aa0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14ab0 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65  _Integer, 1, pDe
14ac0 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
14ad0 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
14ae0 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72   clause will ter
14af0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20  minate the loop 
14b00 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20  for us */.      
14b10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
14b20 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
14b30 68 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20  his is a scalar 
14b40 73 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70  select that is p
14b50 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
14b60 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a  sion, then.    *
14b70 2a 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  * store the resu
14b80 6c 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f  lts in the appro
14b90 70 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65  priate memory ce
14ba0 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74  ll and break out
14bb0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73  .    ** of the s
14bc0 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f  can loop..    */
14bd0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65  .    case SRT_Me
14be0 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  m: {.      asser
14bf0 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31  t( pIn->nSdst==1
14c00 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
14c10 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
14c20 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74  arse, pIn->iSdst
14c30 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
14c40 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  , 1);.      /* T
14c50 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20  he LIMIT clause 
14c60 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66  will jump out of
14c70 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
14c80 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
14c90 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
14ca0 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
14cb0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
14cc0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73  ..    /* The res
14cd0 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
14ce0 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
14cf0 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
14d00 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 44  * starting at pD
14d10 65 73 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65  est->iSdst.  The
14d20 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
14d30 20 79 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   yields..    */.
14d40 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72      case SRT_Cor
14d50 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  outine: {.      
14d60 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74  if( pDest->iSdst
14d70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
14d80 44 65 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71  Dest->iSdst = sq
14d90 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
14da0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e  e(pParse, pIn->n
14db0 53 64 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Sdst);.        p
14dc0 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49  Dest->nSdst = pI
14dd0 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20  n->nSdst;.      
14de0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
14df0 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
14e00 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
14e10 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44  pDest->iSdst, pD
14e20 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  est->nSdst);.   
14e30 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14e40 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
14e50 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
14e60 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14e70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
14e80 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f   none of the abo
14e90 76 65 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73  ve, then the res
14ea0 75 6c 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ult destination 
14eb0 6d 75 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53  must be.    ** S
14ec0 52 54 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73  RT_Output.  This
14ed0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65   routine is neve
14ee0 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  r called with an
14ef0 79 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64  y other.    ** d
14f00 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72  estination other
14f10 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68   than the ones h
14f20 61 6e 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20  andled above or 
14f30 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20  SRT_Output..    
14f40 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52  **.    ** For SR
14f50 54 5f 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74  T_Output, result
14f60 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
14f70 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
14f80 67 69 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a  gisters.  .    *
14f90 2a 20 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65  * Then the OP_Re
14fa0 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69  sultRow opcode i
14fb0 73 20 75 73 65 64 20 74 6f 20 63 61 75 73 65 20  s used to cause 
14fc0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74  sqlite3_step() t
14fd0 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  o.    ** return 
14fe0 74 68 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20  the next row of 
14ff0 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20  result..    */. 
15000 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
15010 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73      assert( pDes
15020 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t->eDest==SRT_Ou
15030 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71  tput );.      sq
15040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15050 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
15060 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e   pIn->iSdst, pIn
15070 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
15080 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
15090 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
150a0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
150b0 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a  t, pIn->nSdst);.
150c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
150d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d   }.  }..  /* Jum
150e0 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  p to the end of 
150f0 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20  the loop if the 
15100 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68 65 64  LIMIT is reached
15110 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
15120 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
15130 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15140 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
15150 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
15160 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   -1);.  }..  /* 
15170 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 75 62  Generate the sub
15180 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20  routine return. 
15190 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
151a0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
151b0 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73   iContinue);.  s
151c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
151d0 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
151e0 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65  egReturn);..  re
151f0 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a  turn addr;.}../*
15200 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20  .** Alternative 
15210 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
15220 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66  code generator f
15230 6f 72 20 63 61 73 65 73 20 77 68 65 6e 20 74 68  or cases when th
15240 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44  ere.** is an ORD
15250 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  ER BY clause..**
15260 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20  .** We assume a 
15270 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c  query of the fol
15280 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a  lowing form:.**.
15290 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41  **      <selectA
152a0 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c  >  <operator>  <
152b0 73 65 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20  selectB>  ORDER 
152c0 42 59 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e  BY <orderbylist>
152d0 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72  .**.** <operator
152e0 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f  > is one of UNIO
152f0 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58  N ALL, UNION, EX
15300 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45  CEPT, or INTERSE
15310 43 54 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a  CT.  The idea.**
15320 20 69 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68   is to code both
15330 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c   <selectA> and <
15340 73 65 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68  selectB> with th
15350 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
15360 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69  e as.** co-routi
15370 6e 65 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74  nes.  Then run t
15380 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69  he co-routines i
15390 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d  n parallel and m
153a0 65 72 67 65 20 74 68 65 20 72 65 73 75 6c 74 73  erge the results
153b0 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  .** into the out
153c0 70 75 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f  put.  In additio
153d0 6e 20 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72  n to the two cor
153e0 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20  outines (called 
153f0 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73  selectA and.** s
15400 65 6c 65 63 74 42 29 20 74 68 65 72 65 20 61 72  electB) there ar
15410 65 20 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a  e 7 subroutines:
15420 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20  .**.**    outA: 
15430 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70     Move the outp
15440 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ut of the select
15450 41 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f  A coroutine into
15460 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20   the output.**  
15470 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
15480 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  e compound query
15490 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a  ..**.**    outB:
154a0 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74      Move the out
154b0 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63  put of the selec
154c0 74 42 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74  tB coroutine int
154d0 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20  o the output.** 
154e0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
154f0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72  he compound quer
15500 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61  y.  (Only genera
15510 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e  ted for UNION an
15520 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
15530 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43   UNION ALL.  EXC
15540 45 50 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45  EPT and INSERTSE
15550 43 54 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20  CT never output 
15560 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20  a row that.**   
15570 20 20 20 20 20 20 20 20 20 20 61 70 70 65 61 72            appear
15580 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a  s only in B.).**
15590 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20  .**    AltB:    
155a0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
155b0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
155c0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
155d0 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A<B..**.**   
155e0 20 41 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64   AeqB:    Called
155f0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 64   when there is d
15600 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f  ata from both co
15610 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d  routines and A==
15620 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42  B..**.**    AgtB
15630 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
15640 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
15650 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
15660 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a  nes and A>B..**.
15670 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43  **    EofA:    C
15680 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20  alled when data 
15690 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72 6f  is exhausted fro
156a0 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a  m selectA..**.**
156b0 20 20 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c      EofB:    Cal
156c0 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
156d0 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
156e0 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54  selectB..**.** T
156f0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
15700 6e 20 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20  n of the latter 
15710 66 69 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73  five subroutines
15720 20 64 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68   depend on which
15730 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20   .** <operator> 
15740 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a  is used:.**.**.*
15750 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55 4e  *             UN
15760 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20  ION ALL         
15770 55 4e 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20  UNION           
15780 20 45 58 43 45 50 54 20 20 20 20 20 20 20 20 20   EXCEPT         
15790 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20   INTERSECT.**   
157a0 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
157b0 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----  ----------
157c0 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
157d0 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
157f0 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AltB:   outA, ne
15800 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  xtA      outA, n
15810 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c  extA       outA,
15820 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20 6e   nextA         n
15830 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71  extA.**.**   Aeq
15840 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41  B:   outA, nextA
15850 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
15860 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 41             nextA
15870 20 20 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e           outA, n
15880 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74  extA.**.**   Agt
15890 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  B:   outB, nextB
158a0 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
158b0 42 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42  B          nextB
158c0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
158d0 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20  B.**.**   EofA: 
158e0 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20    outB, nextB   
158f0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
15900 20 20 20 20 20 20 20 20 68 61 6c 74 20 20 20 20          halt    
15910 20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a           halt.**
15920 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75  .**   EofB:   ou
15930 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f  tA, nextA      o
15940 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
15950 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
15960 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20       halt.**.** 
15970 49 6e 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71  In the AltB, Aeq
15980 42 2c 20 61 6e 64 20 41 67 74 42 20 73 75 62 72  B, and AgtB subr
15990 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20  outines, an EOF 
159a0 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e  on A following n
159b0 65 78 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61  extA.** causes a
159c0 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70  n immediate jump
159d0 20 74 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20   to EofA and an 
159e0 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69  EOF on B followi
159f0 6e 67 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a  ng nextB causes.
15a00 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  ** an immediate 
15a10 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57  jump to EofB.  W
15a20 69 74 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45  ithin EofA and E
15a30 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20  ofB, and EOF on 
15a40 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c  entry or.** foll
15a50 6f 77 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73  owing nextX caus
15a60 65 73 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65  es a jump to the
15a70 20 65 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65   end of the sele
15a80 63 74 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  ct processing..*
15a90 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72  *.** Duplicate r
15aa0 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e  emoval in the UN
15ab0 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64  ION, EXCEPT, and
15ac0 20 49 4e 54 45 52 53 45 43 54 20 63 61 73 65 73   INTERSECT cases
15ad0 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77   is handled.** w
15ae0 69 74 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ithin the output
15af0 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
15b00 65 20 72 65 67 50 72 65 76 20 72 65 67 69 73 74  e regPrev regist
15b10 65 72 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65  er set holds the
15b20 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f   previously.** o
15b30 75 74 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20  utput value.  A 
15b40 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61  comparison is ma
15b50 64 65 20 61 67 61 69 6e 73 74 20 74 68 69 73 20  de against this 
15b60 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75  value and the ou
15b70 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70  tput.** is skipp
15b80 65 64 20 69 66 20 74 68 65 20 6e 65 78 74 20 72  ed if the next r
15b90 65 73 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20  esults would be 
15ba0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
15bb0 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20  previous..**.** 
15bc0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
15bd0 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d  on plan is to im
15be0 70 6c 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20  plement the two 
15bf0 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73  coroutines and s
15c00 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69  even.** subrouti
15c10 6e 65 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20  nes first, then 
15c20 70 75 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20  put the control 
15c30 6c 6f 67 69 63 20 61 74 20 74 68 65 20 62 6f 74  logic at the bot
15c40 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a  tom.  Like this:
15c50 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
15c60 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20  goto Init.**    
15c70 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20   coA: coroutine 
15c80 66 6f 72 20 6c 65 66 74 20 71 75 65 72 79 20 28  for left query (
15c90 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63  A).**     coB: c
15ca0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
15cb0 68 74 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20  ht query (B).** 
15cc0 20 20 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20     outA: output 
15cd0 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20  one row of A.** 
15ce0 20 20 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20     outB: output 
15cf0 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e  one row of B (UN
15d00 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c  ION and UNION AL
15d10 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f  L only).**    Eo
15d20 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f  fA: ....**    Eo
15d30 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c  fB: ....**    Al
15d40 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65  tB: ....**    Ae
15d50 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67  qB: ....**    Ag
15d60 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e  tB: ....**    In
15d70 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63  it: initialize c
15d80 6f 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65  oroutine registe
15d90 72 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79  rs.**          y
15da0 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20  ield coA.**     
15db0 20 20 20 20 20 69 66 20 65 6f 66 28 41 29 20 67       if eof(A) g
15dc0 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20  oto EofA.**     
15dd0 20 20 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a       yield coB.*
15de0 2a 20 20 20 20 20 20 20 20 20 20 69 66 20 65 6f  *          if eo
15df0 66 28 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a  f(B) goto EofB.*
15e00 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61  *    Cmpr: Compa
15e10 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20  re A, B.**      
15e20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41      Jump AltB, A
15e30 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20  eqB, AgtB.**    
15e40 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   End: ....**.** 
15e50 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65  We call AltB, Ae
15e60 71 42 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20  qB, AgtB, EofA, 
15e70 61 6e 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75  and EofB "subrou
15e80 74 69 6e 65 73 22 20 62 75 74 20 74 68 65 79 20  tines" but they 
15e90 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61  are not.** actua
15ea0 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67  lly called using
15eb0 20 47 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20   Gosub and they 
15ec0 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20  do not Return.  
15ed0 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f  EofA and EofB lo
15ee0 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20  op.** until all 
15ef0 64 61 74 61 20 69 73 20 65 78 68 61 75 73 74 65  data is exhauste
15f00 64 20 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74  d then jump to t
15f10 68 65 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20  he "end" labe.  
15f20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61  AltB, AeqB,.** a
15f30 6e 64 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20  nd AgtB jump to 
15f40 65 69 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20  either L2 or to 
15f50 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45  one of EofA or E
15f60 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ofB..*/.#ifndef 
15f70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
15f80 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74  OUND_SELECT.stat
15f90 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65  ic int multiSele
15fa0 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ctOrderBy(.  Par
15fb0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
15fc0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
15fd0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
15fe0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
15ff0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
16000 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
16010 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
16020 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
16030 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
16040 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
16050 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
16060 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
16070 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
16080 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ters */.  Select
16090 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20   *pPrior;       
160a0 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43  /* Another SELEC
160b0 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  T immediately to
160c0 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56   our left */.  V
160d0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
160e0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
160f0 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44   code to this VD
16100 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  BE */.  SelectDe
16110 73 74 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a  st destA;     /*
16120 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72   Destination for
16130 20 63 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a   coroutine A */.
16140 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
16150 74 42 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69  tB;     /* Desti
16160 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75  nation for corou
16170 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20  tine B */.  int 
16180 72 65 67 41 64 64 72 41 3b 20 20 20 20 20 20 20  regAddrA;       
16190 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67    /* Address reg
161a0 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74  ister for select
161b0 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a  -A coroutine */.
161c0 20 20 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20    int regAddrB; 
161d0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
161e0 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
161f0 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
16200 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
16210 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a  SelectA;      /*
16220 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
16230 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
16240 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
16250 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a  SelectB;      /*
16260 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
16270 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
16280 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
16290 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utA;          /*
162a0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
162b0 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
162c0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
162d0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20  .  int regOutB; 
162e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
162f0 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
16300 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
16310 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
16320 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20  t addrOutA;     
16330 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
16340 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  f the output-A s
16350 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
16360 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b  nt addrOutB = 0;
16370 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
16380 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  of the output-B 
16390 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
163a0 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20  int addrEofA;   
163b0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
163c0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
163d0 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
163e0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
163f0 64 64 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20  ddrEofA_noB;    
16400 20 2f 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64   /* Alternate ad
16410 64 72 45 6f 66 41 20 69 66 20 42 20 69 73 20 75  drEofA if B is u
16420 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a  ninitialized */.
16430 20 20 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20    int addrEofB; 
16440 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
16450 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ss of the select
16460 2d 42 2d 65 78 68 61 75 73 74 65 64 20 73 75 62  -B-exhausted sub
16470 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
16480 20 61 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20   addrAltB;      
16490 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
164a0 20 74 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74   the A<B subrout
164b0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
164c0 72 41 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f  rAeqB;         /
164d0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
164e0 20 41 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65   A==B subroutine
164f0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67   */.  int addrAg
16500 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
16510 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e  ddress of the A>
16520 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
16530 20 20 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b    int regLimitA;
16540 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74          /* Limit
16550 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
16560 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20  lect-A */.  int 
16570 72 65 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20  regLimitB;      
16580 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73    /* Limit regis
16590 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
165a0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65   */.  int regPre
165b0 76 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  v;          /* A
165c0 20 72 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74   range of regist
165d0 65 72 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76  ers to hold prev
165e0 69 6f 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20  ious output */. 
165f0 20 69 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b   int savedLimit;
16600 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
16610 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d  value of p->iLim
16620 69 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  it */.  int save
16630 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  dOffset;      /*
16640 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
16650 70 2d 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20  p->iOffset */.  
16660 69 6e 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20  int labelCmpr;  
16670 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66        /* Label f
16680 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  or the start of 
16690 74 68 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69  the merge algori
166a0 74 68 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  thm */.  int lab
166b0 65 6c 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f  elEnd;         /
166c0 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
166d0 65 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61  end of the overa
166e0 6c 6c 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a  ll SELECT stmt *
166f0 2f 0a 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20  /.  int j1;     
16700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
16710 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74  p instructions t
16720 68 61 74 20 67 65 74 20 72 65 74 61 72 67 65 74  hat get retarget
16730 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b  ted */.  int op;
16740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16750 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c  * One of TK_ALL,
16760 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
16770 43 45 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45  CEPT, TK_INTERSE
16780 43 54 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  CT */.  KeyInfo 
16790 2a 70 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a  *pKeyDup = 0; /*
167a0 20 43 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f   Comparison info
167b0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c  rmation for dupl
167c0 69 63 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f  icate removal */
167d0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
167e0 4d 65 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70  Merge;   /* Comp
167f0 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
16800 6f 6e 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72  on for merging r
16810 6f 77 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ows */.  sqlite3
16820 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f   *db;          /
16830 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
16840 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c  ction */.  ExprL
16850 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20  ist *pOrderBy;  
16860 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
16870 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
16880 20 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20   nOrderBy;      
16890 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
168a0 74 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44  terms in the ORD
168b0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
168c0 20 20 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b    int *aPermute;
168d0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69          /* Mappi
168e0 6e 67 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59  ng from ORDER BY
168f0 20 74 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74   terms to result
16900 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a   set columns */.
16910 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16920 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
16930 74 20 69 53 75 62 31 3b 20 20 20 20 20 20 20 20  t iSub1;        
16940 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
16950 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79   left-hand query
16960 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b   */.  int iSub2;
16970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
16980 51 50 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68  QP id of right-h
16990 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e  and query */.#en
169a0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
169b0 2d 3e 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b  ->pOrderBy!=0 );
169c0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 44  .  assert( pKeyD
169d0 75 70 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e  up==0 ); /* "Man
169e0 61 67 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73  aged" code needs
169f0 20 74 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23   this.  Ticket #
16a00 33 33 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20  3382. */.  db = 
16a10 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20  pParse->db;.  v 
16a20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
16a30 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
16a40 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65  );       /* Alre
16a50 61 64 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65  ady thrown the e
16a60 72 72 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c  rror if VDBE all
16a70 6f 63 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c  oc failed */.  l
16a80 61 62 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65  abelEnd = sqlite
16a90 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
16aa0 29 3b 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d  );.  labelCmpr =
16ab0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
16ac0 4c 61 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a  Label(v);...  /*
16ad0 20 50 61 74 63 68 20 75 70 20 74 68 65 20 4f 52   Patch up the OR
16ae0 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
16af0 2a 2f 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b  */.  op = p->op;
16b00 20 20 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d    .  pPrior = p-
16b10 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72  >pPrior;.  asser
16b20 74 28 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  t( pPrior->pOrde
16b30 72 42 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64  rBy==0 );.  pOrd
16b40 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
16b50 42 79 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  By;.  assert( pO
16b60 72 64 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64  rderBy );.  nOrd
16b70 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d  erBy = pOrderBy-
16b80 3e 6e 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f  >nExpr;..  /* Fo
16b90 72 20 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65  r operators othe
16ba0 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c  r than UNION ALL
16bb0 20 77 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65   we have to make
16bc0 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20   sure that.  ** 
16bd0 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
16be0 75 73 65 20 63 6f 76 65 72 73 20 65 76 65 72 79  use covers every
16bf0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73   term of the res
16c00 75 6c 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20  ult set.  Add.  
16c10 2a 2a 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20  ** terms to the 
16c20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
16c30 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
16c40 2a 2f 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f  */.  if( op!=TK_
16c50 41 4c 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ALL ){.    for(i
16c60 3d 31 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  =1; db->mallocFa
16c70 69 6c 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d  iled==0 && i<=p-
16c80 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
16c90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
16ca0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
16cb0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66   *pItem;.      f
16cc0 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(j=0, pItem=pO
16cd0 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72  rderBy->a; j<nOr
16ce0 64 65 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65  derBy; j++, pIte
16cf0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  m++){.        as
16d00 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78  sert( pItem->u.x
16d10 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29  .iOrderByCol>0 )
16d20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
16d30 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
16d40 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b  yCol==i ) break;
16d50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16d60 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29  f( j==nOrderBy )
16d70 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
16d80 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
16d90 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  pr(db, TK_INTEGE
16da0 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  R, 0);.        i
16db0 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
16dc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
16dd0 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
16de0 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
16df0 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
16e00 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
16e10 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
16e20 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
16e30 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
16e40 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65  e, pOrderBy, pNe
16e50 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  w);.        if( 
16e60 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64 65  pOrderBy ) pOrde
16e70 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b  rBy->a[nOrderBy+
16e80 2b 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  +].u.x.iOrderByC
16e90 6f 6c 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20  ol = (u16)i;.   
16ea0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16eb0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
16ec0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d   comparison perm
16ed0 75 74 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69  utation and keyi
16ee0 6e 66 6f 20 74 68 61 74 20 69 73 20 75 73 65 64  nfo that is used
16ef0 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70   with.  ** the p
16f00 65 72 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20  ermutation used 
16f10 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
16f20 74 68 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f  the next.  ** ro
16f30 77 20 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d  w of results com
16f40 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20  es from selectA 
16f50 6f 72 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73  or selectB.  Als
16f60 6f 20 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20  o add explicit. 
16f70 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74   ** collations t
16f80 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
16f90 6c 61 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74  lause terms so t
16fa0 68 61 74 20 77 68 65 6e 20 74 68 65 20 73 75 62  hat when the sub
16fb0 71 75 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20  queries.  ** to 
16fc0 74 68 65 20 72 69 67 68 74 20 61 6e 64 20 74 68  the right and th
16fd0 65 20 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75  e left are evalu
16fe0 61 74 65 64 2c 20 74 68 65 79 20 75 73 65 20 74  ated, they use t
16ff0 68 65 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20  he correct.  ** 
17000 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  collation..  */.
17010 20 20 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c    aPermute = sql
17020 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
17030 64 62 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  db, sizeof(int)*
17040 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28  nOrderBy);.  if(
17050 20 61 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20   aPermute ){.   
17060 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17070 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
17080 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
17090 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
170a0 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70  nOrderBy; i++, p
170b0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61  Item++){.      a
170c0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e  ssert( pItem->u.
170d0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a  x.iOrderByCol>0.
170e0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 74            && pIt
170f0 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
17100 43 6f 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e  Col<=p->pEList->
17110 6e 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61  nExpr );.      a
17120 50 65 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74  Permute[i] = pIt
17130 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
17140 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20  Col - 1;.    }. 
17150 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d     pKeyMerge = m
17160 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42  ultiSelectOrderB
17170 79 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c  yKeyInfo(pParse,
17180 20 70 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b   p, 1);.  }else{
17190 0a 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d  .    pKeyMerge =
171a0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
171b0 61 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52  attach the ORDER
171c0 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68   BY clause to th
171d0 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
171e0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f  p->pOrderBy = pO
171f0 72 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72  rderBy;.  pPrior
17200 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c  ->pOrderBy = sql
17210 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
17220 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64  pParse->db, pOrd
17230 65 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  erBy, 0);..  /* 
17240 41 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65  Allocate a range
17250 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65   of temporary re
17260 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20  gisters and the 
17270 4b 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20  KeyInfo needed. 
17280 20 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69   ** for the logi
17290 63 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64  c that removes d
172a0 75 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20  uplicate result 
172b0 72 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20  rows when the.  
172c0 2a 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55  ** operator is U
172d0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72  NION, EXCEPT, or
172e0 20 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20   INTERSECT (but 
172f0 6e 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a  not UNION ALL)..
17300 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
17310 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67  K_ALL ){.    reg
17320 50 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Prev = 0;.  }els
17330 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72  e{.    int nExpr
17340 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
17350 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  xpr;.    assert(
17360 20 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72   nOrderBy>=nExpr
17370 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
17380 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50  iled );.    regP
17390 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  rev = pParse->nM
173a0 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65  em+1;.    pParse
173b0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b  ->nMem += nExpr+
173c0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
173d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
173e0 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72  nteger, 0, regPr
173f0 65 76 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70  ev);.    pKeyDup
17400 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
17410 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72  oAlloc(db, nExpr
17420 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  , 1);.    if( pK
17430 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61  eyDup ){.      a
17440 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
17450 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
17460 28 70 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20  (pKeyDup) );.   
17470 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
17480 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
17490 20 20 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c     pKeyDup->aCol
174a0 6c 5b 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65  l[i] = multiSele
174b0 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
174c0 2c 20 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  , p, i);.       
174d0 20 70 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f   pKeyDup->aSortO
174e0 72 64 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  rder[i] = 0;.   
174f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17500 0a 20 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74  .  /* Separate t
17510 68 65 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20  he left and the 
17520 72 69 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d  right query from
17530 20 6f 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a   one another.  *
17540 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
17550 30 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65  0;.  pPrior->pNe
17560 78 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  xt = 0;.  sqlite
17570 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
17580 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20  upBy(pParse, p, 
17590 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
175a0 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72  DER");.  if( pPr
175b0 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ior->pPrior==0 )
175c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
175d0 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
175e0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
175f0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
17600 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d  y, "ORDER");.  }
17610 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
17620 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
17630 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c  rs */.  computeL
17640 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
17650 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e  arse, p, labelEn
17660 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69  d);.  if( p->iLi
17670 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c  mit && op==TK_AL
17680 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69  L ){.    regLimi
17690 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tA = ++pParse->n
176a0 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69  Mem;.    regLimi
176b0 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  tB = ++pParse->n
176c0 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
176d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
176e0 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65  _Copy, p->iOffse
176f0 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31  t ? p->iOffset+1
17700 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20   : p->iLimit,.  
17710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17730 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20  regLimitA);.    
17740 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17750 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65  2(v, OP_Copy, re
17760 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69  gLimitA, regLimi
17770 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tB);.  }else{.  
17780 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65    regLimitA = re
17790 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d  gLimitB = 0;.  }
177a0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
177b0 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d  lete(db, p->pLim
177c0 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74  it);.  p->pLimit
177d0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
177e0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
177f0 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e  >pOffset);.  p->
17800 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  pOffset = 0;..  
17810 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61  regAddrA = ++pPa
17820 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67  rse->nMem;.  reg
17830 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65  AddrB = ++pParse
17840 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74  ->nMem;.  regOut
17850 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  A = ++pParse->nM
17860 65 6d 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20  em;.  regOutB = 
17870 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
17880 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
17890 65 73 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20  estInit(&destA, 
178a0 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72  SRT_Coroutine, r
178b0 65 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69  egAddrA);.  sqli
178c0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
178d0 74 28 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f  t(&destB, SRT_Co
178e0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
178f0 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  B);..  /* Genera
17900 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74  te a coroutine t
17910 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53  o evaluate the S
17920 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
17930 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74  to the.  ** left
17940 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
17950 20 6f 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20   operator - the 
17960 22 41 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f  "A" select..  */
17970 0a 20 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d  .  addrSelectA =
17980 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
17990 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
179a0 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
179b0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
179c0 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  nitCoroutine, re
179d0 67 41 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53  gAddrA, 0, addrS
179e0 65 6c 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43  electA);.  VdbeC
179f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74  omment((v, "left
17a00 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50   SELECT"));.  pP
17a10 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  rior->iLimit = r
17a20 65 67 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c  egLimitA;.  expl
17a30 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
17a40 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
17a50 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73  xtSelectId);.  s
17a60 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
17a70 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65  rse, pPrior, &de
17a80 73 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  stA);.  sqlite3V
17a90 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17aa0 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  EndCoroutine, re
17ab0 67 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74  gAddrA);.  sqlit
17ac0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
17ad0 2c 20 6a 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  , j1);..  /* Gen
17ae0 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e  erate a coroutin
17af0 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
17b00 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
17b10 6e 74 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20  nt on .  ** the 
17b20 72 69 67 68 74 20 2d 20 74 68 65 20 22 42 22 20  right - the "B" 
17b30 73 65 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64  select.  */.  ad
17b40 64 72 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69  drSelectB = sqli
17b50 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
17b60 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20  dr(v) + 1;.  j1 
17b70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
17b80 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
17b90 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
17ba0 42 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  B, 0, addrSelect
17bb0 42 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  B);.  VdbeCommen
17bc0 74 28 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c  t((v, "right SEL
17bd0 45 43 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c  ECT"));.  savedL
17be0 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74  imit = p->iLimit
17bf0 3b 0a 20 20 73 61 76 65 64 4f 66 66 73 65 74 20  ;.  savedOffset 
17c00 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20  = p->iOffset;.  
17c10 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c  p->iLimit = regL
17c20 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66  imitB;.  p->iOff
17c30 73 65 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70  set = 0;  .  exp
17c40 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69  lainSetInteger(i
17c50 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e  Sub2, pParse->iN
17c60 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
17c70 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
17c80 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29  arse, p, &destB)
17c90 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
17ca0 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d  savedLimit;.  p-
17cb0 3e 69 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64  >iOffset = saved
17cc0 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65  Offset;.  sqlite
17cd0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17ce0 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20  P_EndCoroutine, 
17cf0 72 65 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a  regAddrB);..  /*
17d00 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
17d10 6f 75 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70  outine that outp
17d20 75 74 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  uts the current 
17d30 72 6f 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a  row of the A.  *
17d40 2a 20 73 65 6c 65 63 74 20 61 73 20 74 68 65 20  * select as the 
17d50 6e 65 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20  next output row 
17d60 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  of the compound 
17d70 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56  select..  */.  V
17d80 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
17d90 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
17da0 6e 65 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61  ne for A"));.  a
17db0 64 64 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61  ddrOutA = genera
17dc0 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69  teOutputSubrouti
17dd0 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  ne(pParse,.     
17de0 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26              p, &
17df0 64 65 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65  destA, pDest, re
17e00 67 4f 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20  gOutA,.         
17e10 20 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c          regPrev,
17e20 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45   pKeyDup, labelE
17e30 6e 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e  nd);.  .  /* Gen
17e40 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
17e50 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20  ne that outputs 
17e60 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
17e70 6f 66 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65  of the B.  ** se
17e80 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74  lect as the next
17e90 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74   output row of t
17ea0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  he compound sele
17eb0 63 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ct..  */.  if( o
17ec0 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d  p==TK_ALL || op=
17ed0 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20  =TK_UNION ){.   
17ee0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
17ef0 28 28 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75  ((v, "Output rou
17f00 74 69 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20  tine for B"));. 
17f10 20 20 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65     addrOutB = ge
17f20 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
17f30 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20  outine(pParse,. 
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 70 2c 20 26 64 65 73 74 42 2c 20 70 44 65 73 74  p, &destB, pDest
17f60 2c 20 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20  , regOutB,.     
17f70 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67 50              regP
17f80 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61  rev, pKeyDup, la
17f90 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73  belEnd);.  }.  s
17fa0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
17fb0 65 66 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20  ef(pKeyDup);..  
17fc0 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75  /* Generate a su
17fd0 62 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20  broutine to run 
17fe0 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73  when the results
17ff0 20 66 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20   from select A. 
18000 20 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65   ** are exhauste
18010 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20  d and only data 
18020 69 6e 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61  in select B rema
18030 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ins..  */.  if( 
18040 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c  op==TK_EXCEPT ||
18050 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
18060 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66  T ){.    addrEof
18070 41 5f 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41  A_noB = addrEofA
18080 20 3d 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d   = labelEnd;.  }
18090 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
180a0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
180b0 22 65 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e  "eof-A subroutin
180c0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
180d0 66 41 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fA = sqlite3Vdbe
180e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
180f0 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64  ub, regOutB, add
18100 72 4f 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72  rOutB);.    addr
18110 45 6f 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74  EofA_noB = sqlit
18120 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18130 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
18140 72 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  rB, labelEnd);. 
18150 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18160 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
18170 20 30 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20   0, addrEofA);. 
18180 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
18190 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
181a0 65 63 74 52 6f 77 3b 0a 20 20 7d 0a 0a 20 20 2f  ectRow;.  }..  /
181b0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62  * Generate a sub
181c0 72 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77  routine to run w
181d0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  hen the results 
181e0 66 72 6f 6d 20 73 65 6c 65 63 74 20 42 0a 20 20  from select B.  
181f0 2a 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64  ** are exhausted
18200 20 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69   and only data i
18210 6e 20 73 65 6c 65 63 74 20 41 20 72 65 6d 61 69  n select A remai
18220 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f  ns..  */.  if( o
18230 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
18240 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20  ){.    addrEofB 
18250 3d 20 61 64 64 72 45 6f 66 41 3b 0a 20 20 20 20  = addrEofA;.    
18260 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  if( p->nSelectRo
18270 77 20 3e 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w > pPrior->nSel
18280 65 63 74 52 6f 77 20 29 20 70 2d 3e 6e 53 65 6c  ectRow ) p->nSel
18290 65 63 74 52 6f 77 20 3d 20 70 50 72 69 6f 72 2d  ectRow = pPrior-
182a0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
182b0 65 6c 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65  else{  .    Vdbe
182c0 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
182d0 22 65 6f 66 2d 42 20 73 75 62 72 6f 75 74 69 6e  "eof-B subroutin
182e0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  e"));.    addrEo
182f0 66 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  fB = sqlite3Vdbe
18300 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
18310 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64  ub, regOutA, add
18320 72 4f 75 74 41 29 3b 0a 20 20 20 20 73 71 6c 69  rOutA);.    sqli
18330 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18340 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
18350 64 72 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  drA, labelEnd);.
18360 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18370 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
18380 2c 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a  , 0, addrEofB);.
18390 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61    }..  /* Genera
183a0 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
183b0 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c  e the case of A<
183c0 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  B.  */.  VdbeNoo
183d0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d  pComment((v, "A-
183e0 6c 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22  lt-B subroutine"
183f0 29 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d  ));.  addrAltB =
18400 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18410 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
18420 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74  regOutA, addrOut
18430 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
18440 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
18450 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61  eld, regAddrA, a
18460 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  ddrEofA);.  sqli
18470 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18480 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62   OP_Goto, 0, lab
18490 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a 20 47  elCmpr);..  /* G
184a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
184b0 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
184c0 6f 66 20 41 3d 3d 42 0a 20 20 2a 2f 0a 20 20 69  of A==B.  */.  i
184d0 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b  f( op==TK_ALL ){
184e0 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
184f0 61 64 64 72 41 6c 74 42 3b 0a 20 20 7d 65 6c 73  addrAltB;.  }els
18500 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54  e if( op==TK_INT
18510 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
18520 64 72 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74  drAeqB = addrAlt
18530 42 3b 0a 20 20 20 20 61 64 64 72 41 6c 74 42 2b  B;.    addrAltB+
18540 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
18550 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
18560 28 76 2c 20 22 41 2d 65 71 2d 42 20 73 75 62 72  (v, "A-eq-B subr
18570 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
18580 64 64 72 41 65 71 42 20 3d 0a 20 20 20 20 73 71  ddrAeqB =.    sq
18590 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
185a0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
185b0 41 64 64 72 41 2c 20 61 64 64 72 45 6f 66 41 29  AddrA, addrEofA)
185c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
185d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
185e0 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
185f0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
18600 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
18610 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
18620 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A>B.  */.  Vdbe
18630 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
18640 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-gt-B subrouti
18650 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67 74  ne"));.  addrAgt
18660 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
18670 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
18680 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
18690 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  || op==TK_UNION 
186a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
186b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
186c0 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
186d0 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20 20  ddrOutB);.  }.  
186e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
186f0 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
18700 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66  egAddrB, addrEof
18710 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
18720 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
18730 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72  to, 0, labelCmpr
18740 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f  );..  /* This co
18750 64 65 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20  de runs once to 
18760 69 6e 69 74 69 61 6c 69 7a 65 20 65 76 65 72 79  initialize every
18770 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71  thing..  */.  sq
18780 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
18790 65 28 76 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69  e(v, j1);.  sqli
187a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
187b0 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
187c0 64 72 41 2c 20 61 64 64 72 45 6f 66 41 5f 6e 6f  drA, addrEofA_no
187d0 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  B);.  sqlite3Vdb
187e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
187f0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 61  eld, regAddrB, a
18800 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20  ddrEofB);..  /* 
18810 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61  Implement the ma
18820 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20  in merge loop.  
18830 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
18840 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
18850 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71  labelCmpr);.  sq
18860 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
18870 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f  v, OP_Permutatio
18880 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61  n, 0, 0, 0, (cha
18890 72 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f  r*)aPermute, P4_
188a0 49 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c  INTARRAY);.  sql
188b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
188c0 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65  , OP_Compare, de
188d0 73 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42  stA.iSdst, destB
188e0 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79  .iSdst, nOrderBy
188f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18900 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
18910 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f  *)pKeyMerge, P4_
18920 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69  KEYINFO);.  sqli
18930 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
18940 76 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54  v, OPFLAG_PERMUT
18950 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  E);.  sqlite3Vdb
18960 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
18970 6d 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64  mp, addrAltB, ad
18980 64 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42  drAeqB, addrAgtB
18990 29 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f  );..  /* Jump to
189a0 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20   the this point 
189b0 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d  in order to term
189c0 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e  inate the query.
189d0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
189e0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
189f0 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20  v, labelEnd);.. 
18a00 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62   /* Set the numb
18a10 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c  er of output col
18a20 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  umns.  */.  if( 
18a30 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
18a40 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
18a50 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d  Select *pFirst =
18a60 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69   pPrior;.    whi
18a70 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69  le( pFirst->pPri
18a80 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46  or ) pFirst = pF
18a90 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  irst->pPrior;.  
18aa0 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e    generateColumn
18ab0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c  Names(pParse, 0,
18ac0 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29   pFirst->pEList)
18ad0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73  ;.  }..  /* Reas
18ae0 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f  sembly the compo
18af0 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61  und query so tha
18b00 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65  t it will be fre
18b10 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
18b20 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
18b30 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
18b40 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  f( p->pPrior ){.
18b50 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
18b60 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  tDelete(db, p->p
18b70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d  Prior);.  }.  p-
18b80 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
18b90 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ;.  pPrior->pNex
18ba0 74 20 3d 20 70 3b 0a 0a 20 20 2f 2a 2a 2a 20 54  t = p;..  /*** T
18bb0 42 44 3a 20 20 49 6e 73 65 72 74 20 73 75 62 72  BD:  Insert subr
18bc0 6f 75 74 69 6e 65 20 63 61 6c 6c 73 20 74 6f 20  outine calls to 
18bd0 63 6c 6f 73 65 20 63 75 72 73 6f 72 73 20 6f 6e  close cursors on
18be0 20 69 6e 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a   incomplete.  **
18bf0 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 2a 2a  ** subqueries **
18c00 2a 2a 2f 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d  **/.  explainCom
18c10 70 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70  posite(pParse, p
18c20 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75  ->op, iSub1, iSu
18c30 62 32 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  b2, 0);.  return
18c40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
18c50 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
18c60 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
18c70 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
18c80 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
18c90 5f 56 49 45 57 29 0a 2f 2a 20 46 6f 72 77 61 72  _VIEW)./* Forwar
18ca0 64 20 44 65 63 6c 61 72 61 74 69 6f 6e 73 20 2a  d Declarations *
18cb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  /.static void su
18cc0 62 73 74 45 78 70 72 4c 69 73 74 28 73 71 6c 69  bstExprList(sqli
18cd0 74 65 33 2a 2c 20 45 78 70 72 4c 69 73 74 2a 2c  te3*, ExprList*,
18ce0 20 69 6e 74 2c 20 45 78 70 72 4c 69 73 74 2a 29   int, ExprList*)
18cf0 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 75  ;.static void su
18d00 62 73 74 53 65 6c 65 63 74 28 73 71 6c 69 74 65  bstSelect(sqlite
18d10 33 2a 2c 20 53 65 6c 65 63 74 20 2a 2c 20 69 6e  3*, Select *, in
18d20 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a  t, ExprList *);.
18d30 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 72 6f  ./*.** Scan thro
18d40 75 67 68 20 74 68 65 20 65 78 70 72 65 73 73 69  ugh the expressi
18d50 6f 6e 20 70 45 78 70 72 2e 20 20 52 65 70 6c 61  on pExpr.  Repla
18d60 63 65 20 65 76 65 72 79 20 72 65 66 65 72 65 6e  ce every referen
18d70 63 65 20 74 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d  ce to.** a colum
18d80 6e 20 69 6e 20 74 61 62 6c 65 20 6e 75 6d 62 65  n in table numbe
18d90 72 20 69 54 61 62 6c 65 20 77 69 74 68 20 61 20  r iTable with a 
18da0 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
18db0 75 6d 6e 2d 74 68 0a 2a 2a 20 65 6e 74 72 79 20  umn-th.** entry 
18dc0 69 6e 20 70 45 4c 69 73 74 2e 20 20 28 42 75 74  in pEList.  (But
18dd0 20 6c 65 61 76 65 20 72 65 66 65 72 65 6e 63 65   leave reference
18de0 73 20 74 6f 20 74 68 65 20 52 4f 57 49 44 20 63  s to the ROWID c
18df0 6f 6c 75 6d 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  olumn .** unchan
18e00 67 65 64 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ged.).**.** This
18e10 20 72 6f 75 74 69 6e 65 20 69 73 20 70 61 72 74   routine is part
18e20 20 6f 66 20 74 68 65 20 66 6c 61 74 74 65 6e 69   of the flatteni
18e30 6e 67 20 70 72 6f 63 65 64 75 72 65 2e 20 20 41  ng procedure.  A
18e40 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 77 68 6f   subquery.** who
18e50 73 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 73  se result set is
18e60 20 64 65 66 69 6e 65 64 20 62 79 20 70 45 4c 69   defined by pELi
18e70 73 74 20 61 70 70 65 61 72 73 20 61 73 20 65 6e  st appears as en
18e80 74 72 79 20 69 6e 20 74 68 65 0a 2a 2a 20 46 52  try in the.** FR
18e90 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
18ea0 45 4c 45 43 54 20 73 75 63 68 20 74 68 61 74 20  ELECT such that 
18eb0 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
18ec0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 61 74  assigned to that
18ed0 0a 2a 2a 20 46 4f 52 4d 20 63 6c 61 75 73 65 20  .** FORM clause 
18ee0 65 6e 74 72 79 20 69 73 20 69 54 61 62 6c 65 2e  entry is iTable.
18ef0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
18f00 61 6b 65 20 74 68 65 20 6e 65 63 65 73 73 61 72  ake the necessar
18f10 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
18f20 20 70 45 78 70 72 20 73 6f 20 74 68 61 74 20 69   pExpr so that i
18f30 74 20 72 65 66 65 72 73 20 64 69 72 65 63 74 6c  t refers directl
18f40 79 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  y to the source 
18f50 74 61 62 6c 65 0a 2a 2a 20 6f 66 20 74 68 65 20  table.** of the 
18f60 73 75 62 71 75 65 72 79 20 72 61 74 68 65 72 20  subquery rather 
18f70 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
18f80 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
18f90 2a 2f 0a 73 74 61 74 69 63 20 45 78 70 72 20 2a  */.static Expr *
18fa0 73 75 62 73 74 45 78 70 72 28 0a 20 20 73 71 6c  substExpr(.  sql
18fb0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
18fc0 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
18fd0 63 20 65 72 72 6f 72 73 20 74 6f 20 74 68 69 73  c errors to this
18fe0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
18ff0 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
19000 20 20 20 20 20 2f 2a 20 45 78 70 72 20 69 6e 20       /* Expr in 
19010 77 68 69 63 68 20 73 75 62 73 74 69 74 75 74 69  which substituti
19020 6f 6e 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 69  on occurs */.  i
19030 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
19040 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
19050 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
19060 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
19070 69 73 74 20 20 20 20 2f 2a 20 53 75 62 73 74 69  ist    /* Substi
19080 74 75 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  tute expressions
19090 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 45 78   */.){.  if( pEx
190a0 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
190b0 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  ;.  if( pExpr->o
190c0 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
190d0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 69  pExpr->iTable==i
190e0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28  Table ){.    if(
190f0 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c   pExpr->iColumn<
19100 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
19110 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
19120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19130 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 20   Expr *pNew;.   
19140 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
19150 74 21 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 69  t!=0 && pExpr->i
19160 43 6f 6c 75 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e  Column<pEList->n
19170 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 73  Expr );.      as
19180 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
19190 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
191a0 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
191b0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
191c0 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 4c  3ExprDup(db, pEL
191d0 69 73 74 2d 3e 61 5b 70 45 78 70 72 2d 3e 69 43  ist->a[pExpr->iC
191e0 6f 6c 75 6d 6e 5d 2e 70 45 78 70 72 2c 20 30 29  olumn].pExpr, 0)
191f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19200 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
19210 78 70 72 29 3b 0a 20 20 20 20 20 20 70 45 78 70  xpr);.      pExp
19220 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d 0a  r = pNew;.    }.
19230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 45 78    }else{.    pEx
19240 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 75 62 73  pr->pLeft = subs
19250 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2d  tExpr(db, pExpr-
19260 3e 70 4c 65 66 74 2c 20 69 54 61 62 6c 65 2c 20  >pLeft, iTable, 
19270 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 70 45 78  pEList);.    pEx
19280 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 73 75 62  pr->pRight = sub
19290 73 74 45 78 70 72 28 64 62 2c 20 70 45 78 70 72  stExpr(db, pExpr
192a0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 62 6c 65  ->pRight, iTable
192b0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 69  , pEList);.    i
192c0 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
192d0 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
192e0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
192f0 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c   substSelect(db,
19300 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
19310 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
19320 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
19330 20 20 20 20 20 73 75 62 73 74 45 78 70 72 4c 69       substExprLi
19340 73 74 28 64 62 2c 20 70 45 78 70 72 2d 3e 78 2e  st(db, pExpr->x.
19350 70 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70  pList, iTable, p
19360 45 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  EList);.    }.  
19370 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  }.  return pExpr
19380 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
19390 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 0a 20  substExprList(. 
193a0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
193b0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
193c0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
193d0 72 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  re */.  ExprList
193e0 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20   *pList,     /* 
193f0 4c 69 73 74 20 74 6f 20 73 63 61 6e 20 61 6e 64  List to scan and
19400 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
19410 65 20 73 75 62 73 74 69 74 75 74 65 73 20 2a 2f  e substitutes */
19420 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
19430 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
19440 20 74 6f 20 62 65 20 73 75 62 73 74 69 74 75 74   to be substitut
19450 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
19460 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
19470 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
19480 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
19490 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
194a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
194b0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
194c0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  xpr; i++){.    p
194d0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
194e0 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
194f0 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
19500 70 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  pr, iTable, pELi
19510 73 74 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  st);.  }.}.stati
19520 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c 65  c void substSele
19530 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
19540 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  b,         /* Re
19550 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
19560 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  rs here */.  Sel
19570 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
19580 20 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74    /* SELECT stat
19590 65 6d 65 6e 74 20 69 6e 20 77 68 69 63 68 20 74  ement in which t
195a0 6f 20 6d 61 6b 65 20 73 75 62 73 74 69 74 75 74  o make substitut
195b0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  ions */.  int iT
195c0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f  able,          /
195d0 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 72 65  * Table to be re
195e0 70 6c 61 63 65 64 20 2a 2f 0a 20 20 45 78 70 72  placed */.  Expr
195f0 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
19600 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 76   /* Substitute v
19610 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 53 72  alues */.){.  Sr
19620 63 4c 69 73 74 20 2a 70 53 72 63 3b 0a 20 20 73  cList *pSrc;.  s
19630 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
19640 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
19650 20 69 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72   i;.  if( !p ) r
19660 65 74 75 72 6e 3b 0a 20 20 73 75 62 73 74 45 78  eturn;.  substEx
19670 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 45  prList(db, p->pE
19680 4c 69 73 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  List, iTable, pE
19690 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78  List);.  substEx
196a0 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 47  prList(db, p->pG
196b0 72 6f 75 70 42 79 2c 20 69 54 61 62 6c 65 2c 20  roupBy, iTable, 
196c0 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
196d0 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 2d 3e  ExprList(db, p->
196e0 70 4f 72 64 65 72 42 79 2c 20 69 54 61 62 6c 65  pOrderBy, iTable
196f0 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 2d 3e  , pEList);.  p->
19700 70 48 61 76 69 6e 67 20 3d 20 73 75 62 73 74 45  pHaving = substE
19710 78 70 72 28 64 62 2c 20 70 2d 3e 70 48 61 76 69  xpr(db, p->pHavi
19720 6e 67 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ng, iTable, pELi
19730 73 74 29 3b 0a 20 20 70 2d 3e 70 57 68 65 72 65  st);.  p->pWhere
19740 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c   = substExpr(db,
19750 20 70 2d 3e 70 57 68 65 72 65 2c 20 69 54 61 62   p->pWhere, iTab
19760 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 73  le, pEList);.  s
19770 75 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70  ubstSelect(db, p
19780 2d 3e 70 50 72 69 6f 72 2c 20 69 54 61 62 6c 65  ->pPrior, iTable
19790 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 70 53 72  , pEList);.  pSr
197a0 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61  c = p->pSrc;.  a
197b0 73 73 65 72 74 28 20 70 53 72 63 20 29 3b 20 20  ssert( pSrc );  
197c0 2f 2a 20 45 76 65 6e 20 66 6f 72 20 28 53 45 4c  /* Even for (SEL
197d0 45 43 54 20 31 29 20 77 65 20 68 61 76 65 3a 20  ECT 1) we have: 
197e0 70 53 72 63 21 3d 30 20 62 75 74 20 70 53 72 63  pSrc!=0 but pSrc
197f0 2d 3e 6e 53 72 63 3d 3d 30 20 2a 2f 0a 20 20 69  ->nSrc==0 */.  i
19800 66 28 20 41 4c 57 41 59 53 28 70 53 72 63 29 20  f( ALWAYS(pSrc) 
19810 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 70 53 72  ){.    for(i=pSr
19820 63 2d 3e 6e 53 72 63 2c 20 70 49 74 65 6d 3d 70  c->nSrc, pItem=p
19830 53 72 63 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d  Src->a; i>0; i--
19840 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19850 20 20 73 75 62 73 74 53 65 6c 65 63 74 28 64 62    substSelect(db
19860 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
19870 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
19880 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
19890 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
198a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
198b0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
198c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
198d0 56 49 45 57 29 20 2a 2f 0a 0a 23 69 66 20 21 64  VIEW) */..#if !d
198e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
198f0 49 54 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20  IT_SUBQUERY) || 
19900 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
19910 4f 4d 49 54 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a  OMIT_VIEW)./*.**
19920 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74   This routine at
19930 74 65 6d 70 74 73 20 74 6f 20 66 6c 61 74 74 65  tempts to flatte
19940 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 73 20  n subqueries as 
19950 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70  a performance op
19960 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54  timization..** T
19970 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
19980 72 6e 73 20 31 20 69 66 20 69 74 20 6d 61 6b 65  rns 1 if it make
19990 73 20 63 68 61 6e 67 65 73 20 61 6e 64 20 30 20  s changes and 0 
199a0 69 66 20 6e 6f 20 66 6c 61 74 74 65 6e 69 6e 67  if no flattening
199b0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54   occurs..**.** T
199c0 6f 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 65  o understand the
199d0 20 63 6f 6e 63 65 70 74 20 6f 66 20 66 6c 61 74   concept of flat
199e0 74 65 6e 69 6e 67 2c 20 63 6f 6e 73 69 64 65 72  tening, consider
199f0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
19a00 2a 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20  * query:.**.**  
19a10 20 20 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d     SELECT a FROM
19a20 20 28 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20   (SELECT x+y AS 
19a30 61 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  a FROM t1 WHERE 
19a40 7a 3c 31 30 30 29 20 57 48 45 52 45 20 61 3e 35  z<100) WHERE a>5
19a50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
19a60 6c 74 20 77 61 79 20 6f 66 20 69 6d 70 6c 65 6d  lt way of implem
19a70 65 6e 74 69 6e 67 20 74 68 69 73 20 71 75 65 72  enting this quer
19a80 79 20 69 73 20 74 6f 20 65 78 65 63 75 74 65 20  y is to execute 
19a90 74 68 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  the.** subquery 
19aa0 66 69 72 73 74 20 61 6e 64 20 73 74 6f 72 65 20  first and store 
19ab0 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
19ac0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
19ad0 2c 20 74 68 65 6e 0a 2a 2a 20 72 75 6e 20 74 68  , then.** run th
19ae0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 6f 6e  e outer query on
19af0 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72 79 20   that temporary 
19b00 74 61 62 6c 65 2e 20 20 54 68 69 73 20 72 65 71  table.  This req
19b10 75 69 72 65 73 20 74 77 6f 0a 2a 2a 20 70 61 73  uires two.** pas
19b20 73 65 73 20 6f 76 65 72 20 74 68 65 20 64 61 74  ses over the dat
19b30 61 2e 20 20 46 75 72 74 68 65 72 6d 6f 72 65 2c  a.  Furthermore,
19b40 20 62 65 63 61 75 73 65 20 74 68 65 20 74 65 6d   because the tem
19b50 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 2a 2a 20  porary table.** 
19b60 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20  has no indices, 
19b70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19b80 20 6f 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75   on the outer qu
19b90 65 72 79 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a  ery cannot be.**
19ba0 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a   optimized..**.*
19bb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
19bc0 74 74 65 6d 70 74 73 20 74 6f 20 72 65 77 72 69  ttempts to rewri
19bd0 74 65 20 71 75 65 72 69 65 73 20 73 75 63 68 20  te queries such 
19be0 61 73 20 74 68 65 20 61 62 6f 76 65 20 69 6e 74  as the above int
19bf0 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 66 6c  o.** a single fl
19c00 61 74 20 73 65 6c 65 63 74 2c 20 6c 69 6b 65 20  at select, like 
19c10 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
19c20 53 45 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20  SELECT x+y AS a 
19c30 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c  FROM t1 WHERE z<
19c40 31 30 30 20 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a  100 AND a>5.**.*
19c50 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72  * The code gener
19c60 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 73 69  ated for this si
19c70 6d 70 69 66 69 63 61 74 69 6f 6e 20 67 69 76 65  mpification give
19c80 73 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c  s the same resul
19c90 74 0a 2a 2a 20 62 75 74 20 6f 6e 6c 79 20 68 61  t.** but only ha
19ca0 73 20 74 6f 20 73 63 61 6e 20 74 68 65 20 64 61  s to scan the da
19cb0 74 61 20 6f 6e 63 65 2e 20 20 41 6e 64 20 62 65  ta once.  And be
19cc0 63 61 75 73 65 20 69 6e 64 69 63 65 73 20 6d 69  cause indices mi
19cd0 67 68 74 20 0a 2a 2a 20 65 78 69 73 74 20 6f 6e  ght .** exist on
19ce0 20 74 68 65 20 74 61 62 6c 65 20 74 31 2c 20 61   the table t1, a
19cf0 20 63 6f 6d 70 6c 65 74 65 20 73 63 61 6e 20 6f   complete scan o
19d00 66 20 74 68 65 20 64 61 74 61 20 6d 69 67 68 74  f the data might
19d10 20 62 65 0a 2a 2a 20 61 76 6f 69 64 65 64 2e 0a   be.** avoided..
19d20 2a 2a 0a 2a 2a 20 46 6c 61 74 74 65 6e 69 6e 67  **.** Flattening
19d30 20 69 73 20 6f 6e 6c 79 20 61 74 74 65 6d 70 74   is only attempt
19d40 65 64 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65  ed if all of the
19d50 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
19d60 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  rue:.**.**   (1)
19d70 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 61    The subquery a
19d80 6e 64 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  nd the outer que
19d90 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
19da0 73 65 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a  se aggregates..*
19db0 2a 0a 2a 2a 20 20 20 28 32 29 20 20 54 68 65 20  *.**   (2)  The 
19dc0 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
19dd0 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
19de0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
19df0 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a  is not a join..*
19e00 2a 0a 2a 2a 20 20 20 28 33 29 20 20 54 68 65 20  *.**   (3)  The 
19e10 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20  subquery is not 
19e20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
19e30 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74 65  d of a left oute
19e40 72 20 6a 6f 69 6e 0a 2a 2a 20 20 20 20 20 20 20  r join.**       
19e50 20 28 4f 72 69 67 69 6e 61 6c 6c 79 20 74 69 63   (Originally tic
19e60 6b 65 74 20 23 33 30 36 2e 20 20 53 74 72 65 6e  ket #306.  Stren
19e70 67 74 68 65 6e 65 64 20 62 79 20 74 69 63 6b 65  gthened by ticke
19e80 74 20 23 33 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20  t #3300).**.**  
19e90 20 28 34 29 20 20 54 68 65 20 73 75 62 71 75 65   (4)  The subque
19ea0 72 79 20 69 73 20 6e 6f 74 20 44 49 53 54 49 4e  ry is not DISTIN
19eb0 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20  CT..**.**  (**) 
19ec0 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 72 65   At one point re
19ed0 73 74 72 69 63 74 69 6f 6e 73 20 28 34 29 20 61  strictions (4) a
19ee0 6e 64 20 28 35 29 20 64 65 66 69 6e 65 64 20 61  nd (5) defined a
19ef0 20 73 75 62 73 65 74 20 6f 66 20 44 49 53 54 49   subset of DISTI
19f00 4e 43 54 0a 2a 2a 20 20 20 20 20 20 20 20 73 75  NCT.**        su
19f10 62 2d 71 75 65 72 69 65 73 20 74 68 61 74 20 77  b-queries that w
19f20 65 72 65 20 65 78 63 6c 75 64 65 64 20 66 72 6f  ere excluded fro
19f30 6d 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  m this optimizat
19f40 69 6f 6e 2e 20 52 65 73 74 72 69 63 74 69 6f 6e  ion. Restriction
19f50 20 0a 2a 2a 20 20 20 20 20 20 20 20 28 34 29 20   .**        (4) 
19f60 68 61 73 20 73 69 6e 63 65 20 62 65 65 6e 20 65  has since been e
19f70 78 70 61 6e 64 65 64 20 74 6f 20 65 78 63 6c 75  xpanded to exclu
19f80 64 65 20 61 6c 6c 20 44 49 53 54 49 4e 43 54 20  de all DISTINCT 
19f90 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a  subqueries..**.*
19fa0 2a 20 20 20 28 36 29 20 20 54 68 65 20 73 75 62  *   (6)  The sub
19fb0 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
19fc0 73 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72  se aggregates or
19fd0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19fe0 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
19ff0 20 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a    DISTINCT..**.*
1a000 2a 20 20 20 28 37 29 20 20 54 68 65 20 73 75 62  *   (7)  The sub
1a010 71 75 65 72 79 20 68 61 73 20 61 20 46 52 4f 4d  query has a FROM
1a020 20 63 6c 61 75 73 65 2e 20 20 54 4f 44 4f 3a 20   clause.  TODO: 
1a030 20 46 6f 72 20 73 75 62 71 75 65 72 69 65 73 20   For subqueries 
1a040 77 69 74 68 6f 75 74 0a 2a 2a 20 20 20 20 20 20  without.**      
1a050 20 20 41 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c    A FROM clause,
1a060 20 63 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   consider adding
1a070 20 61 20 46 52 4f 4d 20 63 6c 6f 73 65 20 77 69   a FROM close wi
1a080 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  th the special.*
1a090 2a 20 20 20 20 20 20 20 20 74 61 62 6c 65 20 73  *        table s
1a0a0 71 6c 69 74 65 5f 6f 6e 63 65 20 74 68 61 74 20  qlite_once that 
1a0b0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 73 69  consists of a si
1a0c0 6e 67 6c 65 20 72 6f 77 20 63 6f 6e 74 61 69 6e  ngle row contain
1a0d0 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
1a0e0 73 69 6e 67 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a  single NULL..**.
1a0f0 2a 2a 20 20 20 28 38 29 20 20 54 68 65 20 73 75  **   (8)  The su
1a100 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20  bquery does not 
1a110 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65  use LIMIT or the
1a120 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
1a130 6e 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a  not a join..**.*
1a140 2a 20 20 20 28 39 29 20 20 54 68 65 20 73 75 62  *   (9)  The sub
1a150 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
1a160 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68 65 20  se LIMIT or the 
1a170 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 65 73  outer query does
1a180 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 20 20 20 20   not use.**     
1a190 20 20 20 61 67 67 72 65 67 61 74 65 73 2e 0a 2a     aggregates..*
1a1a0 2a 0a 2a 2a 20 20 28 31 30 29 20 20 54 68 65 20  *.**  (10)  The 
1a1b0 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1a1c0 74 20 75 73 65 20 61 67 67 72 65 67 61 74 65 73  t use aggregates
1a1d0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1a1e0 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
1a1f0 20 20 20 20 20 20 20 75 73 65 20 4c 49 4d 49 54         use LIMIT
1a200 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 31 29 20 20 54  ..**.**  (11)  T
1a210 68 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20  he subquery and 
1a220 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
1a230 64 6f 20 6e 6f 74 20 62 6f 74 68 20 68 61 76 65  do not both have
1a240 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1a250 73 2e 0a 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20  s..**.**  (**)  
1a260 4e 6f 74 20 69 6d 70 6c 65 6d 65 6e 74 65 64 2e  Not implemented.
1a270 20 20 53 75 62 73 75 6d 65 64 20 69 6e 74 6f 20    Subsumed into 
1a280 72 65 73 74 72 69 63 74 69 6f 6e 20 28 33 29 2e  restriction (3).
1a290 20 20 57 61 73 20 70 72 65 76 69 6f 75 73 6c 79    Was previously
1a2a0 0a 2a 2a 20 20 20 20 20 20 20 20 61 20 73 65 70  .**        a sep
1a2b0 61 72 61 74 65 20 72 65 73 74 72 69 63 74 69 6f  arate restrictio
1a2c0 6e 20 64 65 72 69 76 69 6e 67 20 66 72 6f 6d 20  n deriving from 
1a2d0 74 69 63 6b 65 74 20 23 33 35 30 2e 0a 2a 2a 0a  ticket #350..**.
1a2e0 2a 2a 20 20 28 31 33 29 20 20 54 68 65 20 73 75  **  (13)  The su
1a2f0 62 71 75 65 72 79 20 61 6e 64 20 6f 75 74 65 72  bquery and outer
1a300 20 71 75 65 72 79 20 64 6f 20 6e 6f 74 20 62 6f   query do not bo
1a310 74 68 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a  th use LIMIT..**
1a320 0a 2a 2a 20 20 28 31 34 29 20 20 54 68 65 20 73  .**  (14)  The s
1a330 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
1a340 20 75 73 65 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a   use OFFSET..**.
1a350 2a 2a 20 20 28 31 35 29 20 20 54 68 65 20 6f 75  **  (15)  The ou
1a360 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
1a370 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
1a380 75 6e 64 20 73 65 6c 65 63 74 20 6f 72 20 74 68  und select or th
1a390 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 75 62 71  e.**        subq
1a3a0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  uery does not ha
1a3b0 76 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  ve a LIMIT claus
1a3c0 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 28 53 65  e..**        (Se
1a3d0 65 20 74 69 63 6b 65 74 20 23 32 33 33 39 20 61  e ticket #2339 a
1a3e0 6e 64 20 74 69 63 6b 65 74 20 5b 30 32 61 38 65  nd ticket [02a8e
1a3f0 38 31 64 34 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  81d44])..**.**  
1a400 28 31 36 29 20 20 54 68 65 20 6f 75 74 65 72 20  (16)  The outer 
1a410 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20  query is not an 
1a420 61 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65  aggregate or the
1a430 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 0a 2a   subquery does.*
1a440 2a 20 20 20 20 20 20 20 20 6e 6f 74 20 63 6f 6e  *        not con
1a450 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2e 20 20  tain ORDER BY.  
1a460 28 54 69 63 6b 65 74 20 23 32 39 34 32 29 20 20  (Ticket #2942)  
1a470 54 68 69 73 20 75 73 65 64 20 74 6f 20 6e 6f 74  This used to not
1a480 20 6d 61 74 74 65 72 0a 2a 2a 20 20 20 20 20 20   matter.**      
1a490 20 20 75 6e 74 69 6c 20 77 65 20 69 6e 74 72 6f    until we intro
1a4a0 64 75 63 65 64 20 74 68 65 20 67 72 6f 75 70 5f  duced the group_
1a4b0 63 6f 6e 63 61 74 28 29 20 66 75 6e 63 74 69 6f  concat() functio
1a4c0 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29  n.  .**.**  (17)
1a4d0 20 20 54 68 65 20 73 75 62 2d 71 75 65 72 79 20    The sub-query 
1a4e0 69 73 20 6e 6f 74 20 61 20 63 6f 6d 70 6f 75 6e  is not a compoun
1a4f0 64 20 73 65 6c 65 63 74 2c 20 6f 72 20 69 74 20  d select, or it 
1a500 69 73 20 61 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a  is a UNION ALL .
1a510 2a 2a 20 20 20 20 20 20 20 20 63 6f 6d 70 6f 75  **        compou
1a520 6e 64 20 63 6c 61 75 73 65 20 6d 61 64 65 20 75  nd clause made u
1a530 70 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 6e 6f  p entirely of no
1a540 6e 2d 61 67 67 72 65 67 61 74 65 20 71 75 65 72  n-aggregate quer
1a550 69 65 73 2c 20 61 6e 64 20 0a 2a 2a 20 20 20 20  ies, and .**    
1a560 20 20 20 20 74 68 65 20 70 61 72 65 6e 74 20 71      the parent q
1a570 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  uery:.**.**     
1a580 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 69 74       * is not it
1a590 73 65 6c 66 20 70 61 72 74 20 6f 66 20 61 20 63  self part of a c
1a5a0 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 0a  ompound select,.
1a5b0 2a 2a 20 20 20 20 20 20 20 20 20 20 2a 20 69 73  **          * is
1a5c0 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67 61 74   not an aggregat
1a5d0 65 20 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75  e or DISTINCT qu
1a5e0 65 72 79 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ery, and.**     
1a5f0 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61 20       * is not a 
1a600 6a 6f 69 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  join.**.**      
1a610 20 20 54 68 65 20 70 61 72 65 6e 74 20 61 6e 64    The parent and
1a620 20 73 75 62 2d 71 75 65 72 79 20 6d 61 79 20 63   sub-query may c
1a630 6f 6e 74 61 69 6e 20 57 48 45 52 45 20 63 6c 61  ontain WHERE cla
1a640 75 73 65 73 2e 20 53 75 62 6a 65 63 74 20 74 6f  uses. Subject to
1a650 0a 2a 2a 20 20 20 20 20 20 20 20 72 75 6c 65 73  .**        rules
1a660 20 28 31 31 29 2c 20 28 31 33 29 20 61 6e 64 20   (11), (13) and 
1a670 28 31 34 29 2c 20 74 68 65 79 20 6d 61 79 20 61  (14), they may a
1a680 6c 73 6f 20 63 6f 6e 74 61 69 6e 20 4f 52 44 45  lso contain ORDE
1a690 52 20 42 59 2c 0a 2a 2a 20 20 20 20 20 20 20 20  R BY,.**        
1a6a0 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
1a6b0 20 63 6c 61 75 73 65 73 2e 20 20 54 68 65 20 73   clauses.  The s
1a6c0 75 62 71 75 65 72 79 20 63 61 6e 6e 6f 74 20 75  ubquery cannot u
1a6d0 73 65 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a  se any compound.
1a6e0 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61 74  **        operat
1a6f0 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 55 4e  or other than UN
1a700 49 4f 4e 20 41 4c 4c 20 62 65 63 61 75 73 65 20  ION ALL because 
1a710 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 63 6f  all the other co
1a720 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20 20 20 20  mpound.**       
1a730 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20   operators have 
1a740 61 6e 20 69 6d 70 6c 69 65 64 20 44 49 53 54 49  an implied DISTI
1a750 4e 43 54 20 77 68 69 63 68 20 69 73 20 64 69 73  NCT which is dis
1a760 61 6c 6c 6f 77 65 64 20 62 79 0a 2a 2a 20 20 20  allowed by.**   
1a770 20 20 20 20 20 72 65 73 74 72 69 63 74 69 6f 6e       restriction
1a780 20 28 34 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20   (4)..**.**     
1a790 20 20 20 41 6c 73 6f 2c 20 65 61 63 68 20 63 6f     Also, each co
1a7a0 6d 70 6f 6e 65 6e 74 20 6f 66 20 74 68 65 20 73  mponent of the s
1a7b0 75 62 2d 71 75 65 72 79 20 6d 75 73 74 20 72 65  ub-query must re
1a7c0 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  turn the same nu
1a7d0 6d 62 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 6f  mber.**        o
1a7e0 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
1a7f0 2e 20 54 68 69 73 20 69 73 20 61 63 74 75 61 6c  . This is actual
1a800 6c 79 20 61 20 72 65 71 75 69 72 65 6d 65 6e 74  ly a requirement
1a810 20 66 6f 72 20 61 6e 79 20 63 6f 6d 70 6f 75 6e   for any compoun
1a820 64 0a 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45  d.**        SELE
1a830 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  CT statement, bu
1a840 74 20 61 6c 6c 20 74 68 65 20 63 6f 64 65 20 68  t all the code h
1a850 65 72 65 20 64 6f 65 73 20 69 73 20 6d 61 6b 65  ere does is make
1a860 20 73 75 72 65 20 74 68 61 74 20 6e 6f 0a 2a 2a   sure that no.**
1a870 20 20 20 20 20 20 20 20 73 75 63 68 20 28 69 6c          such (il
1a880 6c 65 67 61 6c 29 20 73 75 62 2d 71 75 65 72 79  legal) sub-query
1a890 20 69 73 20 66 6c 61 74 74 65 6e 65 64 2e 20 54   is flattened. T
1a8a0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 64  he caller will d
1a8b0 65 74 65 63 74 20 74 68 65 0a 2a 2a 20 20 20 20  etect the.**    
1a8c0 20 20 20 20 73 79 6e 74 61 78 20 65 72 72 6f 72      syntax error
1a8d0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 64 65   and return a de
1a8e0 74 61 69 6c 65 64 20 6d 65 73 73 61 67 65 2e 0a  tailed message..
1a8f0 2a 2a 0a 2a 2a 20 20 28 31 38 29 20 20 49 66 20  **.**  (18)  If 
1a900 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1a910 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
1a920 63 74 2c 20 74 68 65 6e 20 61 6c 6c 20 74 65 72  ct, then all ter
1a930 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20  ms of the.**    
1a940 20 20 20 20 4f 52 44 45 52 20 62 79 20 63 6c 61      ORDER by cla
1a950 75 73 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  use of the paren
1a960 74 20 6d 75 73 74 20 62 65 20 73 69 6d 70 6c 65  t must be simple
1a970 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 0a   references to .
1a980 2a 2a 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  **        column
1a990 73 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  s of the sub-que
1a9a0 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 39 29 20  ry..**.**  (19) 
1a9b0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f   The subquery do
1a9c0 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54  es not use LIMIT
1a9d0 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75   or the outer qu
1a9e0 65 72 79 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  ery does not.** 
1a9f0 20 20 20 20 20 20 20 68 61 76 65 20 61 20 57 48         have a WH
1aa00 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ERE clause..**.*
1aa10 2a 20 20 28 32 30 29 20 20 49 66 20 74 68 65 20  *  (20)  If the 
1aa20 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
1aa30 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
1aa40 74 68 65 6e 20 69 74 20 6d 75 73 74 20 6e 6f 74  then it must not
1aa50 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
1aa60 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1aa70 65 2e 20 20 54 69 63 6b 65 74 20 23 33 37 37 33  e.  Ticket #3773
1aa80 2e 20 20 57 65 20 63 6f 75 6c 64 20 72 65 6c 61  .  We could rela
1aa90 78 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  x this constrain
1aaa0 74 0a 2a 2a 20 20 20 20 20 20 20 20 73 6f 6d 65  t.**        some
1aab0 77 68 61 74 20 62 79 20 73 61 79 69 6e 67 20 74  what by saying t
1aac0 68 61 74 20 74 68 65 20 74 65 72 6d 73 20 6f 66  hat the terms of
1aad0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1aae0 61 75 73 65 20 6d 75 73 74 0a 2a 2a 20 20 20 20  ause must.**    
1aaf0 20 20 20 20 61 70 70 65 61 72 20 61 73 20 75 6e      appear as un
1ab00 6d 6f 64 69 66 69 65 64 20 72 65 73 75 6c 74 20  modified result 
1ab10 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f  columns in the o
1ab20 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 75 74  uter query.  But
1ab30 20 77 65 0a 2a 2a 20 20 20 20 20 20 20 20 68 61   we.**        ha
1ab40 76 65 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a  ve other optimiz
1ab50 61 74 69 6f 6e 73 20 69 6e 20 6d 69 6e 64 20 74  ations in mind t
1ab60 6f 20 64 65 61 6c 20 77 69 74 68 20 74 68 61 74  o deal with that
1ab70 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32   case..**.**  (2
1ab80 31 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  1)  The subquery
1ab90 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1aba0 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1abb0 20 71 75 65 72 79 20 69 73 20 6e 6f 74 0a 2a 2a   query is not.**
1abc0 20 20 20 20 20 20 20 20 44 49 53 54 49 4e 43 54          DISTINCT
1abd0 2e 20 20 28 53 65 65 20 74 69 63 6b 65 74 20 5b  .  (See ticket [
1abe0 37 35 32 65 31 36 34 36 66 63 5d 29 2e 0a 2a 2a  752e1646fc])..**
1abf0 0a 2a 2a 20 20 28 32 32 29 20 20 54 68 65 20 73  .**  (22)  The s
1ac00 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  ubquery is not a
1ac10 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2e 0a   recursive CTE..
1ac20 2a 2a 0a 2a 2a 20 20 28 32 33 29 20 20 54 68 65  **.**  (23)  The
1ac30 20 70 61 72 65 6e 74 20 69 73 20 6e 6f 74 20 61   parent is not a
1ac40 20 72 65 63 75 72 73 69 76 65 20 43 54 45 2c 20   recursive CTE, 
1ac50 6f 72 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  or the sub-query
1ac60 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 20 20 20   is not a.**    
1ac70 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65      compound que
1ac80 72 79 2e 20 54 68 69 73 20 72 65 73 74 72 69 63  ry. This restric
1ac90 74 69 6f 6e 20 69 73 20 62 65 63 61 75 73 65 20  tion is because 
1aca0 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65  transforming the
1acb0 0a 2a 2a 20 20 20 20 20 20 20 20 70 61 72 65 6e  .**        paren
1acc0 74 20 74 6f 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t to a compound 
1acd0 71 75 65 72 79 20 63 6f 6e 66 75 73 65 73 20 74  query confuses t
1ace0 68 65 20 63 6f 64 65 20 74 68 61 74 20 68 61 6e  he code that han
1acf0 64 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 72  dles.**        r
1ad00 65 63 75 72 73 69 76 65 20 71 75 65 72 69 65 73  ecursive queries
1ad10 20 69 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74 28   in multiSelect(
1ad20 29 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  )..**.**.** In t
1ad30 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  his routine, the
1ad40 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1ad50 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1ad60 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a  he outer query..
1ad70 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20  ** The subquery 
1ad80 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 46  is p->pSrc->a[iF
1ad90 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69 73 20  rom].  isAgg is 
1ada0 74 72 75 65 20 69 66 20 74 68 65 20 6f 75 74 65  true if the oute
1adb0 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65 73 20  r query.** uses 
1adc0 61 67 67 72 65 67 61 74 65 73 20 61 6e 64 20 73  aggregates and s
1add0 75 62 71 75 65 72 79 49 73 41 67 67 20 69 73 20  ubqueryIsAgg is 
1ade0 74 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71  true if the subq
1adf0 75 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67  uery uses aggreg
1ae00 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 66  ates..**.** If f
1ae10 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e 6f 74  lattening is not
1ae20 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68 69 73   attempted, this
1ae30 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1ae40 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e 73 20  -op and returns 
1ae50 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65 6e  0..** If flatten
1ae60 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74 65 64  ing is attempted
1ae70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1ae80 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a 20 41  turns 1..**.** A
1ae90 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ll of the expres
1aea0 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20 6d 75  sion analysis mu
1aeb0 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f 74 68  st occur on both
1aec0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1aed0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75 62 71   and.** the subq
1aee0 75 65 72 79 20 62 65 66 6f 72 65 20 74 68 69 73  uery before this
1aef0 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e 0a 2a   routine runs..*
1af00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 61  /.static int fla
1af10 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a 20 20  ttenSubquery(.  
1af20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1af30 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
1af40 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
1af50 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
1af60 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20    /* The parent 
1af70 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  or outer SELECT 
1af80 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69  statement */.  i
1af90 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20  nt iFrom,       
1afa0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
1afb0 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20  p->pSrc->a[] of 
1afc0 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71 75 65  the inner subque
1afd0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67  ry */.  int isAg
1afe0 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g,           /* 
1aff0 54 72 75 65 20 69 66 20 6f 75 74 65 72 20 53 45  True if outer SE
1b000 4c 45 43 54 20 75 73 65 73 20 61 67 67 72 65 67  LECT uses aggreg
1b010 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f  ate functions */
1b020 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72 79 49  .  int subqueryI
1b030 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75 65 20  sAgg    /* True 
1b040 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1b050 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1b060 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a 20  unctions */.){. 
1b070 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
1b080 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  vedAuthContext =
1b090 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
1b0a0 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63 74 20  ntext;.  Select 
1b0b0 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65 6c 65  *pParent;.  Sele
1b0c0 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20 20 20  ct *pSub;       
1b0d0 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71 75 65  /* The inner que
1b0e0 72 79 20 6f 72 20 22 73 75 62 71 75 65 72 79 22  ry or "subquery"
1b0f0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
1b100 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50 6f 69  ub1;      /* Poi
1b110 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69 67 68  nter to the righ
1b120 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69 6e 20  tmost select in 
1b130 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20 20 53  sub-query */.  S
1b140 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20  rcList *pSrc;   
1b150 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63     /* The FROM c
1b160 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74  lause of the out
1b170 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 72  er query */.  Sr
1b180 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63 3b 20  cList *pSubSrc; 
1b190 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1b1a0 61 75 73 65 20 6f 66 20 74 68 65 20 73 75 62 71  ause of the subq
1b1b0 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  uery */.  ExprLi
1b1c0 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 2f 2a  st *pList;    /*
1b1d0 20 54 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   The result set 
1b1e0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1b1f0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72  ry */.  int iPar
1b200 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 56  ent;        /* V
1b210 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1b220 72 20 6f 66 20 74 68 65 20 70 53 75 62 20 72 65  r of the pSub re
1b230 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20 74 61  sult set temp ta
1b240 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
1b250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b260 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1b270 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b 20    Expr *pWhere; 
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b290 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
1b2a0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
1b2b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1b2c0 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f 2a 20  *pSubitem;   /* 
1b2d0 54 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  The subquery */.
1b2e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1b2f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
1b300 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
1b310 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  f flattening is 
1b320 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65 74 75  permitted.  Retu
1b330 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20 20 2a  rn 0 if not..  *
1b340 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  /.  assert( p!=0
1b350 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1b360 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20 20 2f  >pPrior==0 );  /
1b370 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c 61 74  * Unable to flat
1b380 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65  ten compound que
1b390 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20 4f 70  ries */.  if( Op
1b3a0 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c  timizationDisabl
1b3b0 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 51 75  ed(db, SQLITE_Qu
1b3c0 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20 29 20  eryFlattener) ) 
1b3d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53 72 63  return 0;.  pSrc
1b3e0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73   = p->pSrc;.  as
1b3f0 73 65 72 74 28 20 70 53 72 63 20 26 26 20 69 46  sert( pSrc && iF
1b400 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f 6d 3c  rom>=0 && iFrom<
1b410 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  pSrc->nSrc );.  
1b420 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53 72 63  pSubitem = &pSrc
1b430 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20 69 50  ->a[iFrom];.  iP
1b440 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74 65 6d  arent = pSubitem
1b450 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70 53 75  ->iCursor;.  pSu
1b460 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 70 53  b = pSubitem->pS
1b470 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72 74 28  elect;.  assert(
1b480 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20 69 66   pSub!=0 );.  if
1b490 28 20 69 73 41 67 67 20 26 26 20 73 75 62 71 75  ( isAgg && subqu
1b4a0 65 72 79 49 73 41 67 67 20 29 20 72 65 74 75 72  eryIsAgg ) retur
1b4b0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1b4c0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1b4d0 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20 69 66  ion (1)  */.  if
1b4e0 28 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  ( subqueryIsAgg 
1b4f0 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20  && pSrc->nSrc>1 
1b500 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20  ) return 0;     
1b510 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1b520 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20 70 53  ion (2)  */.  pS
1b530 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70 53  ubSrc = pSub->pS
1b540 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  rc;.  assert( pS
1b550 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20 50 72  ubSrc );.  /* Pr
1b560 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e 20 33  ior to version 3
1b570 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d 49 54  .1.2, when LIMIT
1b580 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61 64 20   and OFFSET had 
1b590 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63 6f 6e  to be simple con
1b5a0 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e 6f 74  stants,.  ** not
1b5b0 20 61 72 62 69 74 72 61 72 79 20 65 78 70 72 65   arbitrary expre
1b5c0 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c 6c 6f  sssions, we allo
1b5d0 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69 6e 69  wed some combini
1b5e0 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e 64 20  ng of LIMIT and 
1b5f0 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1b600 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64 20 62  use they could b
1b610 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20 63 6f  e computed at co
1b620 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42 75 74  mpile-time.  But
1b630 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1b640 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65 63 61  OFFSET.  ** beca
1b650 6d 65 20 61 72 62 69 74 72 61 72 79 20 65 78 70  me arbitrary exp
1b660 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77 65 72  ressions, we wer
1b670 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64 64 20  e forced to add 
1b680 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28 31 33  restrictions (13
1b690 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34 29 2e  ).  ** and (14).
1b6a0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1b6b0 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70 4c 69  pLimit && p->pLi
1b6c0 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  mit ) return 0; 
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b6e0 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 33 29  Restriction (13)
1b6f0 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
1b700 70 4f 66 66 73 65 74 20 29 20 72 65 74 75 72 6e  pOffset ) return
1b710 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1b720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b730 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31 34 29  Restriction (14)
1b740 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
1b750 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6d 70  lFlags & SF_Comp
1b760 6f 75 6e 64 29 21 3d 30 20 26 26 20 70 53 75 62  ound)!=0 && pSub
1b770 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1b780 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1b7c0 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d 0a  ion (15) */.  }.
1b7d0 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e 6e    if( pSubSrc->n
1b7e0 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Src==0 ) return 
1b7f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1b800 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1b810 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f 0a  riction (7)  */.
1b820 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c 46    if( pSub->selF
1b830 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
1b840 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  ct ) return 0;  
1b850 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1b860 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f 0a  riction (5)  */.
1b870 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d    if( pSub->pLim
1b880 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53 72  it && (pSrc->nSr
1b890 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29 7b  c>1 || isAgg) ){
1b8a0 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20  .     return 0; 
1b8b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1b8c0 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20 2a  ictions (8)(9) *
1b8d0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  /.  }.  if( (p->
1b8e0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
1b8f0 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73 75  stinct)!=0 && su
1b900 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a 20  bqueryIsAgg ){. 
1b910 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1b920 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1b930 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20 7d  tion (6)  */.  }
1b940 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72  .  if( p->pOrder
1b950 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  By && pSub->pOrd
1b960 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65 74  erBy ){.     ret
1b970 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9a0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1b9b0 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (11) */.  }.  if
1b9c0 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62 2d  ( isAgg && pSub-
1b9d0 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74 75  >pOrderBy ) retu
1b9e0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1b9f0 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1ba00 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69 66  ion (16) */.  if
1ba10 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1ba20 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72 65  & p->pWhere ) re
1ba30 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1ba40 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1ba50 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69 66  ion (19) */.  if
1ba60 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26  ( pSub->pLimit &
1ba70 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  & (p->selFlags &
1ba80 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
1ba90 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
1baa0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
1bab0 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20 2a  striction (21) *
1bac0 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 75 62  /.  }.  if( pSub
1bad0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1bae0 52 65 63 75 72 73 69 76 65 20 29 20 72 65 74 75  Recursive ) retu
1baf0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f  rn 0;          /
1bb00 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32  * Restriction (2
1bb10 32 29 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  2)  */.  if( (p-
1bb20 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
1bb30 65 63 75 72 73 69 76 65 29 20 26 26 20 70 53 75  ecursive) && pSu
1bb40 62 2d 3e 70 50 72 69 6f 72 20 29 20 72 65 74 75  b->pPrior ) retu
1bb50 72 6e 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 28  rn 0;       /* (
1bb60 32 33 29 20 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42  23)  */..  /* OB
1bb70 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31  SOLETE COMMENT 1
1bb80 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69  :.  ** Restricti
1bb90 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75  on 3:  If the su
1bba0 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e  bquery is a join
1bbb0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
1bbc0 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a  subquery is .  *
1bbd0 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68  * not used as th
1bbe0 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20  e right operand 
1bbf0 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  of an outer join
1bc00 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77  .  Examples of w
1bc10 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20  hy this.  ** is 
1bc20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
1bc30 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
1bc40 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1bc50 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20  N (t2 JOIN t3). 
1bc60 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66   **.  ** If we f
1bc70 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65  latten the above
1bc80 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20  , we would get. 
1bc90 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
1bca0 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20   (t1 LEFT OUTER 
1bcb0 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33  JOIN t2) JOIN t3
1bcc0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68  .  **.  ** which
1bcd0 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74   is not at all t
1bce0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20  he same thing.. 
1bcf0 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54   **.  ** OBSOLET
1bd00 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a  E COMMENT 2:.  *
1bd10 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32  * Restriction 12
1bd20 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65  :  If the subque
1bd30 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
1bd40 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66  operand of a lef
1bd50 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69  t outer.  ** joi
1bd60 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
1bd70 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f   subquery has no
1bd80 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20   WHERE clause.. 
1bd90 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20   ** An examples 
1bda0 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e  of why this is n
1bdb0 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
1bdc0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
1bdd0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1bde0 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   (SELECT * FROM 
1bdf0 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29  t2 WHERE t2.x>0)
1be00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  **.  ** If we
1be10 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f   flatten the abo
1be20 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74  ve, we would get
1be30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1be40 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45     (t1 LEFT OUTE
1be50 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45  R JOIN t2) WHERE
1be60 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a   t2.x>0.  **.  *
1be70 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30  * But the t2.x>0
1be80 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79   test will alway
1be90 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c  s fail on a NULL
1bea0 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63   row of t2, whic
1beb0 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  h.  ** effective
1bec0 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20  ly converts the 
1bed0 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20  OUTER JOIN into 
1bee0 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20  an INNER JOIN.. 
1bef0 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56   **.  ** THIS OV
1bf00 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45  ERRIDES OBSOLETE
1bf10 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20   COMMENTS 1 AND 
1bf20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69  2 ABOVE:.  ** Ti
1bf30 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73  cket #3300 shows
1bf40 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67   that flattening
1bf50 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20   the right term 
1bf60 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20  of a LEFT JOIN. 
1bf70 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77   ** is fraught w
1bf80 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73  ith danger.  Bes
1bf90 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77  t to avoid the w
1bfa0 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20  hole thing.  If 
1bfb0 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72  the.  ** subquer
1bfc0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  y is the right t
1bfd0 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f  erm of a LEFT JO
1bfe0 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  IN, then do not 
1bff0 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  flatten..  */.  
1c000 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a  if( (pSubitem->j
1c010 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
1c020 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ER)!=0 ){.    re
1c030 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1c040 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37  * Restriction 17
1c050 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  : If the sub-que
1c060 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1c070 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74   SELECT, then it
1c080 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f   must.  ** use o
1c090 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c  nly the UNION AL
1c0a0 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20  L operator. And 
1c0b0 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70  none of the simp
1c0c0 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65  le select querie
1c0d0 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65  s.  ** that make
1c0e0 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   up the compound
1c0f0 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f   SELECT are allo
1c100 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67  wed to be aggreg
1c110 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a  ate or distinct.
1c120 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20    ** queries..  
1c130 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
1c140 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28  Prior ){.    if(
1c150 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1c160 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c170 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69  0;  /* Restricti
1c180 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20  on 20 */.    }. 
1c190 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20     if( isAgg || 
1c1a0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1c1b0 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c  F_Distinct)!=0 |
1c1c0 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20  | pSrc->nSrc!=1 
1c1d0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1c1e0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1c1f0 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75  (pSub1=pSub; pSu
1c200 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d  b1; pSub1=pSub1-
1c210 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
1c220 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
1c230 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
1c240 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
1c250 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73  regate))==SF_Dis
1c260 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74  tinct );.      t
1c270 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
1c280 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
1c290 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
1c2a0 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72  egate))==SF_Aggr
1c2b0 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61  egate );.      a
1c2c0 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72  ssert( pSub->pSr
1c2d0 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  c!=0 );.      if
1c2e0 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61  ( (pSub1->selFla
1c2f0 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63  gs & (SF_Distinc
1c300 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29  t|SF_Aggregate))
1c310 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70  !=0.       || (p
1c320 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20  Sub1->pPrior && 
1c330 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c  pSub1->op!=TK_AL
1c340 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53  L) .       || pS
1c350 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c  ub1->pSrc->nSrc<
1c360 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62  1.       || pSub
1c370 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
1c380 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e  =pSub1->pEList->
1c390 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20  nExpr.      ){. 
1c3a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1c3b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
1c3c0 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e  estcase( pSub1->
1c3d0 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a  pSrc->nSrc>1 );.
1c3e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1c3f0 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f  striction 18. */
1c400 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64  .    if( p->pOrd
1c410 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e  erBy ){.      in
1c420 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  t ii;.      for(
1c430 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64  ii=0; ii<p->pOrd
1c440 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b  erBy->nExpr; ii+
1c450 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1c460 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  p->pOrderBy->a[i
1c470 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  i].u.x.iOrderByC
1c480 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ol==0 ) return 0
1c490 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c4a0 20 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66    }..  /***** If
1c4b0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
1c4c0 6f 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67  oint, flattening
1c4d0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a   is permitted. *
1c4e0 2a 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68  ****/..  /* Auth
1c4f0 6f 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65  orize the subque
1c500 72 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e  ry */.  pParse->
1c510 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
1c520 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  Subitem->zName;.
1c530 20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20    TESTONLY(i =) 
1c540 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1c550 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1c560 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
1c570 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d  ;.  testcase( i=
1c580 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a  =SQLITE_DENY );.
1c590 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
1c5a0 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41  ontext = zSavedA
1c5b0 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f  uthContext;..  /
1c5c0 2a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65  * If the sub-que
1c5d0 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ry is a compound
1c5e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1c5f0 74 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74  t, then (by rest
1c600 72 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37  rictions.  ** 17
1c610 20 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69   and 18 above) i
1c620 74 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f  t must be a UNIO
1c630 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61  N ALL and the pa
1c640 72 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20  rent query must 
1c650 0a 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20  .  ** be of the 
1c660 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  form:.  **.  ** 
1c670 20 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72      SELECT <expr
1c680 2d 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75  -list> FROM (<su
1c690 62 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65  b-query>) <where
1c6a0 2d 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20  -clause> .  **. 
1c6b0 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
1c6c0 61 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49  any ORDER BY, LI
1c6d0 4d 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45  MIT and/or OFFSE
1c6e0 54 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20  T clauses. This 
1c6f0 62 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74  block.  ** creat
1c700 65 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66  es N-1 copies of
1c710 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
1c720 79 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52  y without any OR
1c730 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72  DER BY, LIMIT or
1c740 20 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c   .  ** OFFSET cl
1c750 61 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20  auses and joins 
1c760 74 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74  them to the left
1c770 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68  -hand-side of th
1c780 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
1c790 75 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20  using UNION ALL 
1c7a0 6f 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68  operators. In th
1c7b0 69 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65  is case N is the
1c7c0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c   number of simpl
1c7d0 65 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74  e.  ** select st
1c7e0 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  atements in the 
1c7f0 63 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65  compound sub-que
1c800 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  ry..  **.  ** Ex
1c810 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
1c820 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20       SELECT a+1 
1c830 46 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20  FROM (.  **     
1c840 20 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d     SELECT x FROM
1c850 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20   tab.  **       
1c860 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20   UNION ALL.  ** 
1c870 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20         SELECT y 
1c880 46 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20  FROM tab.  **   
1c890 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1c8a0 20 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43   **        SELEC
1c8b0 54 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20  T abs(z*2) FROM 
1c8c0 74 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20  tab2.  **     ) 
1c8d0 57 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52  WHERE a!=5 ORDER
1c8e0 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20   BY 1.  **.  ** 
1c8f0 54 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  Transformed into
1c900 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1c910 53 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20  SELECT x+1 FROM 
1c920 74 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35  tab WHERE x+1!=5
1c930 0a 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20  .  **     UNION 
1c940 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  ALL.  **     SEL
1c950 45 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62  ECT y+1 FROM tab
1c960 20 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20   WHERE y+1!=5.  
1c970 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
1c980 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
1c990 20 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d   abs(z*2)+1 FROM
1c9a0 20 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28   tab2 WHERE abs(
1c9b0 7a 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20  z*2)+1!=5.  **  
1c9c0 20 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20     ORDER BY 1.  
1c9d0 2a 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20  **.  ** We call 
1c9e0 74 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75  this the "compou
1c9f0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1ca00 74 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20  tening"..  */.  
1ca10 66 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70  for(pSub=pSub->p
1ca20 50 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75  Prior; pSub; pSu
1ca30 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b  b=pSub->pPrior){
1ca40 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  .    Select *pNe
1ca50 77 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  w;.    ExprList 
1ca60 2a 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70  *pOrderBy = p->p
1ca70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70  OrderBy;.    Exp
1ca80 72 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r *pLimit = p->p
1ca90 4c 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20  Limit;.    Expr 
1caa0 2a 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f  *pOffset = p->pO
1cab0 66 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63  ffset;.    Selec
1cac0 74 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  t *pPrior = p->p
1cad0 50 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f  Prior;.    p->pO
1cae0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1caf0 70 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20  p->pSrc = 0;.   
1cb00 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a   p->pPrior = 0;.
1cb10 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
1cb20 30 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65  0;.    p->pOffse
1cb30 74 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20  t = 0;.    pNew 
1cb40 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
1cb50 75 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20  up(db, p, 0);.  
1cb60 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70    p->pOffset = p
1cb70 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70  Offset;.    p->p
1cb80 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a  Limit = pLimit;.
1cb90 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
1cba0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  = pOrderBy;.    
1cbb0 70 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a  p->pSrc = pSrc;.
1cbc0 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41      p->op = TK_A
1cbd0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  LL;.    if( pNew
1cbe0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1cbf0 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
1cc00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cc10 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
1cc20 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 69   pPrior;.      i
1cc30 66 28 20 70 50 72 69 6f 72 20 29 20 70 50 72 69  f( pPrior ) pPri
1cc40 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 77  or->pNext = pNew
1cc50 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4e  ;.      pNew->pN
1cc60 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ext = p;.      p
1cc70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77 3b  ->pPrior = pNew;
1cc80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
1cc90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1cca0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
1ccb0 0a 20 20 2f 2a 20 42 65 67 69 6e 20 66 6c 61 74  .  /* Begin flat
1ccc0 74 65 6e 69 6e 67 20 74 68 65 20 69 46 72 6f 6d  tening the iFrom
1ccd0 2d 74 68 20 65 6e 74 72 79 20 6f 66 20 74 68 65  -th entry of the
1cce0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 0a 20 20   FROM clause .  
1ccf0 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ** in the outer 
1cd00 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 53  query..  */.  pS
1cd10 75 62 20 3d 20 70 53 75 62 31 20 3d 20 70 53 75  ub = pSub1 = pSu
1cd20 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  bitem->pSelect;.
1cd30 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65  .  /* Delete the
1cd40 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
1cd50 20 73 74 72 75 63 74 75 72 65 20 61 73 73 6f 63   structure assoc
1cd60 69 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20  iated with the. 
1cd70 20 2a 2a 20 73 75 62 71 75 65 72 79 0a 20 20 2a   ** subquery.  *
1cd80 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  /.  sqlite3DbFre
1cd90 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1cda0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 73 71  zDatabase);.  sq
1cdb0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1cdc0 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pSubitem->zName)
1cdd0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1cde0 65 28 64 62 2c 20 70 53 75 62 69 74 65 6d 2d 3e  e(db, pSubitem->
1cdf0 7a 41 6c 69 61 73 29 3b 0a 20 20 70 53 75 62 69  zAlias);.  pSubi
1ce00 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1ce10 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e   0;.  pSubitem->
1ce20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 53 75  zName = 0;.  pSu
1ce30 62 69 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  bitem->zAlias = 
1ce40 30 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e 70  0;.  pSubitem->p
1ce50 53 65 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 2f  Select = 0;..  /
1ce60 2a 20 44 65 66 65 72 20 64 65 6c 65 74 69 6e 67  * Defer deleting
1ce70 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
1ce80 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
1ce90 68 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75  h the.  ** subqu
1cea0 65 72 79 20 75 6e 74 69 6c 20 63 6f 64 65 20 67  ery until code g
1ceb0 65 6e 65 72 61 74 69 6f 6e 20 69 73 0a 20 20 2a  eneration is.  *
1cec0 2a 20 63 6f 6d 70 6c 65 74 65 2c 20 73 69 6e 63  * complete, sinc
1ced0 65 20 74 68 65 72 65 20 6d 61 79 20 73 74 69 6c  e there may stil
1cee0 6c 20 65 78 69 73 74 20 45 78 70 72 2e 70 54 61  l exist Expr.pTa
1cef0 62 20 65 6e 74 72 69 65 73 20 74 68 61 74 0a 20  b entries that. 
1cf00 20 2a 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65   ** refer to the
1cf10 20 73 75 62 71 75 65 72 79 20 65 76 65 6e 20 61   subquery even a
1cf20 66 74 65 72 20 66 6c 61 74 74 65 6e 69 6e 67 2e  fter flattening.
1cf30 20 20 54 69 63 6b 65 74 20 23 33 33 34 36 2e 0a    Ticket #3346..
1cf40 20 20 2a 2a 0a 20 20 2a 2a 20 70 53 75 62 69 74    **.  ** pSubit
1cf50 65 6d 2d 3e 70 54 61 62 20 69 73 20 61 6c 77 61  em->pTab is alwa
1cf60 79 73 20 6e 6f 6e 2d 4e 55 4c 4c 20 62 79 20 74  ys non-NULL by t
1cf70 65 73 74 20 72 65 73 74 72 69 63 74 69 6f 6e 73  est restrictions
1cf80 20 61 6e 64 20 74 65 73 74 73 20 61 62 6f 76 65   and tests above
1cf90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ..  */.  if( ALW
1cfa0 41 59 53 28 70 53 75 62 69 74 65 6d 2d 3e 70 54  AYS(pSubitem->pT
1cfb0 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 54 61  ab!=0) ){.    Ta
1cfc0 62 6c 65 20 2a 70 54 61 62 54 6f 44 65 6c 20 3d  ble *pTabToDel =
1cfd0 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 3b   pSubitem->pTab;
1cfe0 0a 20 20 20 20 69 66 28 20 70 54 61 62 54 6f 44  .    if( pTabToD
1cff0 65 6c 2d 3e 6e 52 65 66 3d 3d 31 20 29 7b 0a 20  el->nRef==1 ){. 
1d000 20 20 20 20 20 50 61 72 73 65 20 2a 70 54 6f 70       Parse *pTop
1d010 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1d020 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1d030 72 73 65 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rse);.      pTab
1d040 54 6f 44 65 6c 2d 3e 70 4e 65 78 74 5a 6f 6d 62  ToDel->pNextZomb
1d050 69 65 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  ie = pToplevel->
1d060 70 5a 6f 6d 62 69 65 54 61 62 3b 0a 20 20 20 20  pZombieTab;.    
1d070 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f    pToplevel->pZo
1d080 6d 62 69 65 54 61 62 20 3d 20 70 54 61 62 54 6f  mbieTab = pTabTo
1d090 44 65 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Del;.    }else{.
1d0a0 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c 2d        pTabToDel-
1d0b0 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 7d 0a 20  >nRef--;.    }. 
1d0c0 20 20 20 70 53 75 62 69 74 65 6d 2d 3e 70 54 61     pSubitem->pTa
1d0d0 62 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b = 0;.  }..  /*
1d0e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   The following l
1d0f0 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f  oop runs once fo
1d100 72 20 65 61 63 68 20 74 65 72 6d 20 69 6e 20 61  r each term in a
1d110 20 63 6f 6d 70 6f 75 6e 64 2d 73 75 62 71 75 65   compound-subque
1d120 72 79 0a 20 20 2a 2a 20 66 6c 61 74 74 65 6e 69  ry.  ** flatteni
1d130 6e 67 20 28 61 73 20 64 65 73 63 72 69 62 65 64  ng (as described
1d140 20 61 62 6f 76 65 29 2e 20 20 49 66 20 77 65 20   above).  If we 
1d150 61 72 65 20 64 6f 69 6e 67 20 61 20 64 69 66 66  are doing a diff
1d160 65 72 65 6e 74 20 6b 69 6e 64 0a 20 20 2a 2a 20  erent kind.  ** 
1d170 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 2d 20  of flattening - 
1d180 61 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 74 68  a flattening oth
1d190 65 72 20 74 68 61 6e 20 61 20 63 6f 6d 70 6f 75  er than a compou
1d1a0 6e 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74  nd-subquery flat
1d1b0 74 65 6e 69 6e 67 20 2d 0a 20 20 2a 2a 20 74 68  tening -.  ** th
1d1c0 65 6e 20 74 68 69 73 20 6c 6f 6f 70 20 6f 6e 6c  en this loop onl
1d1d0 79 20 72 75 6e 73 20 6f 6e 63 65 2e 0a 20 20 2a  y runs once..  *
1d1e0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
1d1f0 20 6d 6f 76 65 73 20 61 6c 6c 20 6f 66 20 74 68   moves all of th
1d200 65 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 73 20  e FROM elements 
1d210 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1d220 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 68  into the.  ** th
1d230 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
1d240 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d250 2e 20 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  .  Before doing 
1d260 74 68 69 73 2c 20 72 65 6d 65 6d 62 65 72 0a 20  this, remember. 
1d270 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 6e   ** the cursor n
1d280 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6f 72  umber for the or
1d290 69 67 69 6e 61 6c 20 6f 75 74 65 72 20 71 75 65  iginal outer que
1d2a0 72 79 20 46 52 4f 4d 20 65 6c 65 6d 65 6e 74 20  ry FROM element 
1d2b0 69 6e 0a 20 20 2a 2a 20 69 50 61 72 65 6e 74 2e  in.  ** iParent.
1d2c0 20 20 54 68 65 20 69 50 61 72 65 6e 74 20 63 75    The iParent cu
1d2d0 72 73 6f 72 20 77 69 6c 6c 20 6e 65 76 65 72 20  rsor will never 
1d2e0 62 65 20 75 73 65 64 2e 20 20 53 75 62 73 65 71  be used.  Subseq
1d2f0 75 65 6e 74 20 63 6f 64 65 0a 20 20 2a 2a 20 77  uent code.  ** w
1d300 69 6c 6c 20 73 63 61 6e 20 65 78 70 72 65 73 73  ill scan express
1d310 69 6f 6e 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  ions looking for
1d320 20 69 50 61 72 65 6e 74 20 72 65 66 65 72 65 6e   iParent referen
1d330 63 65 73 20 61 6e 64 20 72 65 70 6c 61 63 65 0a  ces and replace.
1d340 20 20 2a 2a 20 74 68 6f 73 65 20 72 65 66 65 72    ** those refer
1d350 65 6e 63 65 73 20 77 69 74 68 20 65 78 70 72 65  ences with expre
1d360 73 73 69 6f 6e 73 20 74 68 61 74 20 72 65 73 6f  ssions that reso
1d370 6c 76 65 20 74 6f 20 74 68 65 20 73 75 62 71 75  lve to the subqu
1d380 65 72 79 20 46 52 4f 4d 0a 20 20 2a 2a 20 65 6c  ery FROM.  ** el
1d390 65 6d 65 6e 74 73 20 77 65 20 61 72 65 20 6e 6f  ements we are no
1d3a0 77 20 63 6f 70 79 69 6e 67 20 69 6e 2e 0a 20 20  w copying in..  
1d3b0 2a 2f 0a 20 20 66 6f 72 28 70 50 61 72 65 6e 74  */.  for(pParent
1d3c0 3d 70 3b 20 70 50 61 72 65 6e 74 3b 20 70 50 61  =p; pParent; pPa
1d3d0 72 65 6e 74 3d 70 50 61 72 65 6e 74 2d 3e 70 50  rent=pParent->pP
1d3e0 72 69 6f 72 2c 20 70 53 75 62 3d 70 53 75 62 2d  rior, pSub=pSub-
1d3f0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 69 6e  >pPrior){.    in
1d400 74 20 6e 53 75 62 53 72 63 3b 0a 20 20 20 20 75  t nSubSrc;.    u
1d410 38 20 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  8 jointype = 0;.
1d420 20 20 20 20 70 53 75 62 53 72 63 20 3d 20 70 53      pSubSrc = pS
1d430 75 62 2d 3e 70 53 72 63 3b 20 20 20 20 20 2f 2a  ub->pSrc;     /*
1d440 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1d450 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  subquery */.    
1d460 6e 53 75 62 53 72 63 20 3d 20 70 53 75 62 53 72  nSubSrc = pSubSr
1d470 63 2d 3e 6e 53 72 63 3b 20 20 2f 2a 20 4e 75 6d  c->nSrc;  /* Num
1d480 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20  ber of terms in 
1d490 73 75 62 71 75 65 72 79 20 46 52 4f 4d 20 63 6c  subquery FROM cl
1d4a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 70 53 72 63  ause */.    pSrc
1d4b0 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63   = pParent->pSrc
1d4c0 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c  ;     /* FROM cl
1d4d0 61 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65  ause of the oute
1d4e0 72 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 20 20  r query */..    
1d4f0 69 66 28 20 70 53 72 63 20 29 7b 0a 20 20 20 20  if( pSrc ){.    
1d500 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1d510 74 3d 3d 70 20 29 3b 20 20 2f 2a 20 46 69 72 73  t==p );  /* Firs
1d520 74 20 74 69 6d 65 20 74 68 72 6f 75 67 68 20 74  t time through t
1d530 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  he loop */.     
1d540 20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 53 75 62   jointype = pSub
1d550 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  item->jointype;.
1d560 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d570 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
1d580 21 3d 70 20 29 3b 20 20 2f 2a 20 32 6e 64 20 61  !=p );  /* 2nd a
1d590 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 74 69  nd subsequent ti
1d5a0 6d 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  mes through the 
1d5b0 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 70 53  loop */.      pS
1d5c0 72 63 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 53  rc = pParent->pS
1d5d0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
1d5e0 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 30 2c  istAppend(db, 0,
1d5f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1d600 28 20 70 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( pSrc==0 ){.   
1d610 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
1d620 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1d630 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1d640 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1d650 20 20 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65     /* The subque
1d660 72 79 20 75 73 65 73 20 61 20 73 69 6e 67 6c 65  ry uses a single
1d670 20 73 6c 6f 74 20 6f 66 20 74 68 65 20 46 52 4f   slot of the FRO
1d680 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1d690 6f 75 74 65 72 0a 20 20 20 20 2a 2a 20 71 75 65  outer.    ** que
1d6a0 72 79 2e 20 20 49 66 20 74 68 65 20 73 75 62 71  ry.  If the subq
1d6b0 75 65 72 79 20 68 61 73 20 6d 6f 72 65 20 74 68  uery has more th
1d6c0 61 6e 20 6f 6e 65 20 65 6c 65 6d 65 6e 74 20 69  an one element i
1d6d0 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75 73  n its FROM claus
1d6e0 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 65  e,.    ** then e
1d6f0 78 70 61 6e 64 20 74 68 65 20 6f 75 74 65 72 20  xpand the outer 
1d700 71 75 65 72 79 20 74 6f 20 6d 61 6b 65 20 73 70  query to make sp
1d710 61 63 65 20 66 6f 72 20 69 74 20 74 6f 20 68 6f  ace for it to ho
1d720 6c 64 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 0a  ld all elements.
1d730 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 75      ** of the su
1d740 62 71 75 65 72 79 2e 0a 20 20 20 20 2a 2a 0a 20  bquery..    **. 
1d750 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20     ** Example:. 
1d760 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1d770 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 61  SELECT * FROM ta
1d780 62 41 2c 20 28 53 45 4c 45 43 54 20 2a 20 46 52  bA, (SELECT * FR
1d790 4f 4d 20 73 75 62 31 2c 20 73 75 62 32 29 2c 20  OM sub1, sub2), 
1d7a0 74 61 62 42 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  tabB;.    **.   
1d7b0 20 2a 2a 20 54 68 65 20 6f 75 74 65 72 20 71 75   ** The outer qu
1d7c0 65 72 79 20 68 61 73 20 33 20 73 6c 6f 74 73 20  ery has 3 slots 
1d7d0 69 6e 20 69 74 73 20 46 52 4f 4d 20 63 6c 61 75  in its FROM clau
1d7e0 73 65 2e 20 20 4f 6e 65 20 73 6c 6f 74 20 6f 66  se.  One slot of
1d7f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1d800 72 20 71 75 65 72 79 20 28 74 68 65 20 6d 69 64  r query (the mid
1d810 64 6c 65 20 73 6c 6f 74 29 20 69 73 20 75 73 65  dle slot) is use
1d820 64 20 62 79 20 74 68 65 20 73 75 62 71 75 65 72  d by the subquer
1d830 79 2e 20 20 54 68 65 20 6e 65 78 74 0a 20 20 20  y.  The next.   
1d840 20 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64   ** block of cod
1d850 65 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 74 68  e will expand th
1d860 65 20 6f 75 74 20 71 75 65 72 79 20 74 6f 20 34  e out query to 4
1d870 20 73 6c 6f 74 73 2e 20 20 54 68 65 20 6d 69 64   slots.  The mid
1d880 64 6c 65 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 20  dle.    ** slot 
1d890 69 73 20 65 78 70 61 6e 64 65 64 20 74 6f 20 74  is expanded to t
1d8a0 77 6f 20 73 6c 6f 74 73 20 69 6e 20 6f 72 64 65  wo slots in orde
1d8b0 72 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20  r to make space 
1d8c0 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  for the.    ** t
1d8d0 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1d8e0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1d8f0 66 20 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a  f the subquery..
1d900 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1d910 53 75 62 53 72 63 3e 31 20 29 7b 0a 20 20 20 20  SubSrc>1 ){.    
1d920 20 20 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20    pParent->pSrc 
1d930 3d 20 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  = pSrc = sqlite3
1d940 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
1d950 62 2c 20 70 53 72 63 2c 20 6e 53 75 62 53 72 63  b, pSrc, nSubSrc
1d960 2d 31 2c 69 46 72 6f 6d 2b 31 29 3b 0a 20 20 20  -1,iFrom+1);.   
1d970 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1d980 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
1d990 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d9a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1d9b0 54 72 61 6e 73 66 65 72 20 74 68 65 20 46 52 4f  Transfer the FRO
1d9c0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  M clause terms f
1d9d0 72 6f 6d 20 74 68 65 20 73 75 62 71 75 65 72 79  rom the subquery
1d9e0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
1d9f0 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20 20   outer query..  
1da00 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
1da10 3b 20 69 3c 6e 53 75 62 53 72 63 3b 20 69 2b 2b  ; i<nSubSrc; i++
1da20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1da30 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1da40 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
1da50 5d 2e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 20  ].pUsing);.     
1da60 20 70 53 72 63 2d 3e 61 5b 69 2b 69 46 72 6f 6d   pSrc->a[i+iFrom
1da70 5d 20 3d 20 70 53 75 62 53 72 63 2d 3e 61 5b 69  ] = pSubSrc->a[i
1da80 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ];.      memset(
1da90 26 70 53 75 62 53 72 63 2d 3e 61 5b 69 5d 2c 20  &pSubSrc->a[i], 
1daa0 30 2c 20 73 69 7a 65 6f 66 28 70 53 75 62 53 72  0, sizeof(pSubSr
1dab0 63 2d 3e 61 5b 69 5d 29 29 3b 0a 20 20 20 20 7d  c->a[i]));.    }
1dac0 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 46 72  .    pSrc->a[iFr
1dad0 6f 6d 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 6a  om].jointype = j
1dae0 6f 69 6e 74 79 70 65 3b 0a 20 20 0a 20 20 20 20  ointype;.  .    
1daf0 2f 2a 20 4e 6f 77 20 62 65 67 69 6e 20 73 75 62  /* Now begin sub
1db00 73 74 69 74 75 74 69 6e 67 20 73 75 62 71 75 65  stituting subque
1db10 72 79 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ry result set ex
1db20 70 72 65 73 73 69 6f 6e 73 20 66 6f 72 20 0a 20  pressions for . 
1db30 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
1db40 20 74 6f 20 74 68 65 20 69 50 61 72 65 6e 74 20   to the iParent 
1db50 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  in the outer que
1db60 72 79 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20  ry..    ** .    
1db70 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
1db80 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c 45  **.    **   SELE
1db90 43 54 20 61 2b 35 2c 20 62 2a 31 30 20 46 52 4f  CT a+5, b*10 FRO
1dba0 4d 20 28 53 45 4c 45 43 54 20 78 2a 33 20 41 53  M (SELECT x*3 AS
1dbb0 20 61 2c 20 79 2b 31 30 20 41 53 20 62 20 46 52   a, y+10 AS b FR
1dbc0 4f 4d 20 74 31 29 20 57 48 45 52 45 20 61 3e 62  OM t1) WHERE a>b
1dbd0 3b 0a 20 20 20 20 2a 2a 20 20 20 5c 20 20 20 20  ;.    **   \    
1dbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbf0 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20   \_____________ 
1dc00 73 75 62 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f  subquery _______
1dc10 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20 20 2f 0a  ___/          /.
1dc20 20 20 20 20 2a 2a 20 20 20 20 5c 5f 5f 5f 5f 5f      **    \_____
1dc30 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1dc40 20 6f 75 74 65 72 20 71 75 65 72 79 20 5f 5f 5f   outer query ___
1dc50 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1dc60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20  ___________/.   
1dc70 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 65 20 6c 6f   **.    ** We lo
1dc80 6f 6b 20 61 74 20 65 76 65 72 79 20 65 78 70 72  ok at every expr
1dc90 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 6f 75  ession in the ou
1dca0 74 65 72 20 71 75 65 72 79 20 61 6e 64 20 65 76  ter query and ev
1dcb0 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65 65  ery place we see
1dcc0 0a 20 20 20 20 2a 2a 20 22 61 22 20 77 65 20 73  .    ** "a" we s
1dcd0 75 62 73 74 69 74 75 74 65 20 22 78 2a 33 22 20  ubstitute "x*3" 
1dce0 61 6e 64 20 65 76 65 72 79 20 70 6c 61 63 65 20  and every place 
1dcf0 77 65 20 73 65 65 20 22 62 22 20 77 65 20 73 75  we see "b" we su
1dd00 62 73 74 69 74 75 74 65 20 22 79 2b 31 30 22 2e  bstitute "y+10".
1dd10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 69 73  .    */.    pLis
1dd20 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 45 4c  t = pParent->pEL
1dd30 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
1dd40 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
1dd50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
1dd60 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
1dd70 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1dd80 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1dd90 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
1dda0 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1ddb0 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  zSpan);.        
1ddc0 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
1ddd0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
1dde0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1ddf0 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20   = zName;.      
1de00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 75 62 73  }.    }.    subs
1de10 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50  tExprList(db, pP
1de20 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 2c 20 69  arent->pEList, i
1de30 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1de40 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 69  List);.    if( i
1de50 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 73 75  sAgg ){.      su
1de60 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c 20  bstExprList(db, 
1de70 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
1de80 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62  y, iParent, pSub
1de90 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
1dea0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1deb0 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
1dec0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69  , pParent->pHavi
1ded0 6e 67 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  ng, iParent, pSu
1dee0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1def0 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
1df00 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
1df10 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
1df20 74 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  t->pOrderBy==0 )
1df30 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1df40 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62  >pOrderBy = pSub
1df50 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
1df60 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79    pSub->pOrderBy
1df70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
1df80 69 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72  if( pParent->pOr
1df90 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 73  derBy ){.      s
1dfa0 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
1dfb0 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72   pParent->pOrder
1dfc0 42 79 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75  By, iParent, pSu
1dfd0 62 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  b->pEList);.    
1dfe0 7d 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e  }.    if( pSub->
1dff0 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
1e000 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
1e010 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 75 62  ExprDup(db, pSub
1e020 2d 3e 70 57 68 65 72 65 2c 20 30 29 3b 0a 20 20  ->pWhere, 0);.  
1e030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1e040 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Where = 0;.    }
1e050 0a 20 20 20 20 69 66 28 20 73 75 62 71 75 65 72  .    if( subquer
1e060 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20  yIsAgg ){.      
1e070 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1e080 3e 70 48 61 76 69 6e 67 3d 3d 30 20 29 3b 0a 20  >pHaving==0 );. 
1e090 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 48       pParent->pH
1e0a0 61 76 69 6e 67 20 3d 20 70 50 61 72 65 6e 74 2d  aving = pParent-
1e0b0 3e 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70  >pWhere;.      p
1e0c0 50 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d  Parent->pWhere =
1e0d0 20 70 57 68 65 72 65 3b 0a 20 20 20 20 20 20 70   pWhere;.      p
1e0e0 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20  Parent->pHaving 
1e0f0 3d 20 73 75 62 73 74 45 78 70 72 28 64 62 2c 20  = substExpr(db, 
1e100 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1e110 2c 20 69 50 61 72 65 6e 74 2c 20 70 53 75 62 2d  , iParent, pSub-
1e120 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  >pEList);.      
1e130 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1e140 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
1e150 64 28 64 62 2c 20 70 50 61 72 65 6e 74 2d 3e 70  d(db, pParent->p
1e160 48 61 76 69 6e 67 2c 20 0a 20 20 20 20 20 20 20  Having, .       
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e180 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1e190 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
1e1a0 75 62 2d 3e 70 48 61 76 69 6e 67 2c 20 30 29 29  ub->pHaving, 0))
1e1b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e1c0 70 50 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42  pParent->pGroupB
1e1d0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  y==0 );.      pP
1e1e0 61 72 65 6e 74 2d 3e 70 47 72 6f 75 70 42 79 20  arent->pGroupBy 
1e1f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1e200 74 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  tDup(db, pSub->p
1e210 47 72 6f 75 70 42 79 2c 20 30 29 3b 0a 20 20 20  GroupBy, 0);.   
1e220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1e230 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20  arent->pWhere = 
1e240 73 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50  substExpr(db, pP
1e250 61 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 69  arent->pWhere, i
1e260 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1e270 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61  List);.      pPa
1e280 72 65 6e 74 2d 3e 70 57 68 65 72 65 20 3d 20 73  rent->pWhere = s
1e290 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
1e2a0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65 72  , pParent->pWher
1e2b0 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 20 20  e, pWhere);.    
1e2c0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20  }.  .    /* The 
1e2d0 66 6c 61 74 74 65 6e 65 64 20 71 75 65 72 79 20  flattened query 
1e2e0 69 73 20 64 69 73 74 69 6e 63 74 20 69 66 20 65  is distinct if e
1e2f0 69 74 68 65 72 20 74 68 65 20 69 6e 6e 65 72 20  ither the inner 
1e300 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75  or the.    ** ou
1e310 74 65 72 20 71 75 65 72 79 20 69 73 20 64 69 73  ter query is dis
1e320 74 69 6e 63 74 2e 20 0a 20 20 20 20 2a 2f 0a 20  tinct. .    */. 
1e330 20 20 20 70 50 61 72 65 6e 74 2d 3e 73 65 6c 46     pParent->selF
1e340 6c 61 67 73 20 7c 3d 20 70 53 75 62 2d 3e 73 65  lags |= pSub->se
1e350 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74  lFlags & SF_Dist
1e360 69 6e 63 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 0a  inct;.  .    /*.
1e370 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 2e 2e      ** SELECT ..
1e380 2e 20 46 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e  . FROM (SELECT .
1e390 2e 2e 20 4c 49 4d 49 54 20 61 20 4f 46 46 53 45  .. LIMIT a OFFSE
1e3a0 54 20 62 29 20 4c 49 4d 49 54 20 78 20 4f 46 46  T b) LIMIT x OFF
1e3b0 53 45 54 20 79 3b 0a 20 20 20 20 2a 2a 0a 20 20  SET y;.    **.  
1e3c0 20 20 2a 2a 20 4f 6e 65 20 69 73 20 74 65 6d 70    ** One is temp
1e3d0 74 65 64 20 74 6f 20 74 72 79 20 74 6f 20 61 64  ted to try to ad
1e3e0 64 20 61 20 61 6e 64 20 62 20 74 6f 20 63 6f 6d  d a and b to com
1e3f0 62 69 6e 65 20 74 68 65 20 6c 69 6d 69 74 73 2e  bine the limits.
1e400 20 20 42 75 74 20 74 68 69 73 0a 20 20 20 20 2a    But this.    *
1e410 2a 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  * does not work 
1e420 69 66 20 65 69 74 68 65 72 20 6c 69 6d 69 74 20  if either limit 
1e430 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 20 20 20  is negative..   
1e440 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 75 62   */.    if( pSub
1e450 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->pLimit ){.    
1e460 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 69 6d 69    pParent->pLimi
1e470 74 20 3d 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74  t = pSub->pLimit
1e480 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4c  ;.      pSub->pL
1e490 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  imit = 0;.    }.
1e4a0 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 69 61 6c    }..  /* Finial
1e4b0 6c 79 2c 20 64 65 6c 65 74 65 20 77 68 61 74 20  ly, delete what 
1e4c0 69 73 20 6c 65 66 74 20 6f 66 20 74 68 65 20 73  is left of the s
1e4d0 75 62 71 75 65 72 79 20 61 6e 64 20 72 65 74 75  ubquery and retu
1e4e0 72 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73 73 2e  rn.  ** success.
1e4f0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53  .  */.  sqlite3S
1e500 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1e510 70 53 75 62 31 29 3b 0a 0a 20 20 72 65 74 75 72  pSub1);..  retur
1e520 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
1e530 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1e540 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
1e550 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
1e560 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 2a 2f  TE_OMIT_VIEW) */
1e570 0a 0a 2f 2a 0a 2a 2a 20 42 61 73 65 64 20 6f 6e  ../*.** Based on
1e580 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1e590 20 74 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72   the AggInfo str
1e5a0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64  ucture indicated
1e5b0 20 62 79 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   by the first.**
1e5c0 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 69 73 20   argument, this 
1e5d0 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73 20  function checks 
1e5e0 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  if the following
1e5f0 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a   are true:.**.**
1e600 20 20 20 20 2a 20 74 68 65 20 71 75 65 72 79 20      * the query 
1e610 63 6f 6e 74 61 69 6e 73 20 6a 75 73 74 20 61 20  contains just a 
1e620 73 69 6e 67 6c 65 20 61 67 67 72 65 67 61 74 65  single aggregate
1e630 20 66 75 6e 63 74 69 6f 6e 2c 0a 2a 2a 20 20 20   function,.**   
1e640 20 2a 20 74 68 65 20 61 67 67 72 65 67 61 74 65   * the aggregate
1e650 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 69 74   function is eit
1e660 68 65 72 20 6d 69 6e 28 29 20 6f 72 20 6d 61 78  her min() or max
1e670 28 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 20 2a 20  (), and.**    * 
1e680 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
1e690 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
1e6a0 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  nction is a colu
1e6b0 6d 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  mn value..**.** 
1e6c0 49 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 62  If all of the ab
1e6d0 6f 76 65 20 61 72 65 20 74 72 75 65 2c 20 74 68  ove are true, th
1e6e0 65 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  en WHERE_ORDERBY
1e6f0 5f 4d 49 4e 20 6f 72 20 57 48 45 52 45 5f 4f 52  _MIN or WHERE_OR
1e700 44 45 52 42 59 5f 4d 41 58 0a 2a 2a 20 69 73 20  DERBY_MAX.** is 
1e710 72 65 74 75 72 6e 65 64 20 61 73 20 61 70 70 72  returned as appr
1e720 6f 70 72 69 61 74 65 2e 20 41 6c 73 6f 2c 20 2a  opriate. Also, *
1e730 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
1e740 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
1e750 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 61 72 67 75  .** list of argu
1e760 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
1e770 74 68 65 20 61 67 67 72 65 67 61 74 65 20 62 65  the aggregate be
1e780 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1e790 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
1e7a0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76   conditions abov
1e7b0 65 20 61 72 65 20 6e 6f 74 20 6d 65 74 2c 20 2a  e are not met, *
1e7c0 70 70 4d 69 6e 4d 61 78 20 69 73 20 73 65 74 20  ppMinMax is set 
1e7d0 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 57 48 45 52  to 0 and.** WHER
1e7e0 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1e7f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1e800 0a 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61  .static u8 minMa
1e810 78 51 75 65 72 79 28 41 67 67 49 6e 66 6f 20 2a  xQuery(AggInfo *
1e820 70 41 67 67 49 6e 66 6f 2c 20 45 78 70 72 4c 69  pAggInfo, ExprLi
1e830 73 74 20 2a 2a 70 70 4d 69 6e 4d 61 78 29 7b 0a  st **ppMinMax){.
1e840 20 20 69 6e 74 20 65 52 65 74 20 3d 20 57 48 45    int eRet = WHE
1e850 52 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41  RE_ORDERBY_NORMA
1e860 4c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  L;          /* R
1e870 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1e880 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d 20 30 3b    *ppMinMax = 0;
1e890 0a 20 20 69 66 28 20 70 41 67 67 49 6e 66 6f 2d  .  if( pAggInfo-
1e8a0 3e 6e 46 75 6e 63 3d 3d 31 20 29 7b 0a 20 20 20  >nFunc==1 ){.   
1e8b0 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
1e8c0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30  AggInfo->aFunc[0
1e8d0 5d 2e 70 45 78 70 72 3b 20 2f 2a 20 41 67 67 72  ].pExpr; /* Aggr
1e8e0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
1e8f0 2f 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  /.    ExprList *
1e900 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
1e910 78 2e 70 4c 69 73 74 3b 20 20 20 20 20 20 2f 2a  x.pList;      /*
1e920 20 41 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 67   Arguments to ag
1e930 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  g function */.. 
1e940 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
1e950 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
1e960 43 54 49 4f 4e 20 29 3b 0a 20 20 20 20 69 66 28  CTION );.    if(
1e970 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c 69 73   pEList && pELis
1e980 74 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70  t->nExpr==1 && p
1e990 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
1e9a0 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f  r->op==TK_AGG_CO
1e9b0 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 63 6f  LUMN ){.      co
1e9c0 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 20  nst char *zFunc 
1e9d0 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  = pExpr->u.zToke
1e9e0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
1e9f0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75 6e  ite3StrICmp(zFun
1ea00 63 2c 20 22 6d 69 6e 22 29 3d 3d 30 20 29 7b 0a  c, "min")==0 ){.
1ea10 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20 57          eRet = W
1ea20 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
1ea30 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69 6e  ;.        *ppMin
1ea40 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  Max = pEList;.  
1ea50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
1ea60 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 46 75  lite3StrICmp(zFu
1ea70 6e 63 2c 20 22 6d 61 78 22 29 3d 3d 30 20 29 7b  nc, "max")==0 ){
1ea80 0a 20 20 20 20 20 20 20 20 65 52 65 74 20 3d 20  .        eRet = 
1ea90 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41  WHERE_ORDERBY_MA
1eaa0 58 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 4d 69  X;.        *ppMi
1eab0 6e 4d 61 78 20 3d 20 70 45 4c 69 73 74 3b 0a 20  nMax = pEList;. 
1eac0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ead0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 70 4d  ..  assert( *ppM
1eae0 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 28 2a 70 70  inMax==0 || (*pp
1eaf0 4d 69 6e 4d 61 78 29 2d 3e 6e 45 78 70 72 3d 3d  MinMax)->nExpr==
1eb00 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 52  1 );.  return eR
1eb10 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  et;.}../*.** The
1eb20 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
1eb30 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1eb40 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1eb50 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 71  s an aggregate q
1eb60 75 65 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63  uery..** The sec
1eb70 6f 6e 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74  ond argment is t
1eb80 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 61 67  he associated ag
1eb90 67 72 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a  gregate-info obj
1eba0 65 63 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75  ect. This .** fu
1ebb0 6e 63 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20  nction tests if 
1ebc0 74 68 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66  the SELECT is of
1ebd0 20 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a   the form:.**.**
1ebe0 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
1ebf0 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a  *) FROM <tbl>.**
1ec00 0a 2a 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20  .** where table 
1ec10 69 73 20 61 20 64 61 74 61 62 61 73 65 20 74 61  is a database ta
1ec20 62 6c 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73  ble, not a sub-s
1ec30 65 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49  elect or view. I
1ec40 66 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64  f the query.** d
1ec50 6f 65 73 20 6d 61 74 63 68 20 74 68 69 73 20 70  oes match this p
1ec60 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70  attern, then a p
1ec70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61  ointer to the Ta
1ec80 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65  ble object repre
1ec90 73 65 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e  senting.** <tbl>
1eca0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1ecb0 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72 65  herwise, 0 is re
1ecc0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1ecd0 63 20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c  c Table *isSimpl
1ece0 65 43 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70  eCount(Select *p
1ecf0 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  , AggInfo *pAggI
1ed00 6e 66 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  nfo){.  Table *p
1ed10 54 61 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78  Tab;.  Expr *pEx
1ed20 70 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  pr;..  assert( !
1ed30 70 2d 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a  p->pGroupBy );..
1ed40 20 20 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20    if( p->pWhere 
1ed50 7c 7c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  || p->pEList->nE
1ed60 78 70 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d  xpr!=1 .   || p-
1ed70 3e 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c  >pSrc->nSrc!=1 |
1ed80 7c 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  | p->pSrc->a[0].
1ed90 70 53 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20  pSelect.  ){.   
1eda0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1edb0 20 70 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d   pTab = p->pSrc-
1edc0 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45  >a[0].pTab;.  pE
1edd0 78 70 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  xpr = p->pEList-
1ede0 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61  >a[0].pExpr;.  a
1edf0 73 73 65 72 74 28 20 70 54 61 62 20 26 26 20 21  ssert( pTab && !
1ee00 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26  pTab->pSelect &&
1ee10 20 70 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28   pExpr );..  if(
1ee20 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
1ee30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1ee40 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
1ee50 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20  _AGG_FUNCTION ) 
1ee60 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
1ee70 4e 45 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e  NEVER(pAggInfo->
1ee80 6e 46 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75  nFunc==0) ) retu
1ee90 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67  rn 0;.  if( (pAg
1eea0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e  gInfo->aFunc[0].
1eeb0 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
1eec0 26 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 55  &SQLITE_FUNC_COU
1eed0 4e 54 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  NT)==0 ) return 
1eee0 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  0;.  if( pExpr->
1eef0 66 6c 61 67 73 26 45 50 5f 44 69 73 74 69 6e 63  flags&EP_Distinc
1ef00 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  t ) return 0;.. 
1ef10 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
1ef20 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 6f  ./*.** If the so
1ef30 75 72 63 65 2d 6c 69 73 74 20 69 74 65 6d 20 70  urce-list item p
1ef40 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
1ef50 6d 65 6e 74 20 77 61 73 20 61 75 67 6d 65 6e 74  ment was augment
1ef60 65 64 20 77 69 74 68 20 61 6e 0a 2a 2a 20 49 4e  ed with an.** IN
1ef70 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
1ef80 20 74 68 65 6e 20 74 72 79 20 74 6f 20 6c 6f 63   then try to loc
1ef90 61 74 65 20 74 68 65 20 73 70 65 63 69 66 69 65  ate the specifie
1efa0 64 20 69 6e 64 65 78 2e 20 49 66 20 74 68 65 72  d index. If ther
1efb0 65 0a 2a 2a 20 77 61 73 20 73 75 63 68 20 61 20  e.** was such a 
1efc0 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6e  clause and the n
1efd0 61 6d 65 64 20 69 6e 64 65 78 20 63 61 6e 6e 6f  amed index canno
1efe0 74 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  t be found, retu
1eff0 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
1f000 52 4f 52 20 61 6e 64 20 6c 65 61 76 65 20 61 6e  ROR and leave an
1f010 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65   error in pParse
1f020 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 70 6f 70  . Otherwise, pop
1f030 75 6c 61 74 65 20 0a 2a 2a 20 70 46 72 6f 6d 2d  ulate .** pFrom-
1f040 3e 70 49 6e 64 65 78 20 61 6e 64 20 72 65 74 75  >pIndex and retu
1f050 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  rn SQLITE_OK..*/
1f060 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
1f070 78 65 64 42 79 4c 6f 6f 6b 75 70 28 50 61 72 73  xedByLookup(Pars
1f080 65 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63  e *pParse, struc
1f090 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f0a0 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 46  pFrom){.  if( pF
1f0b0 72 6f 6d 2d 3e 70 54 61 62 20 26 26 20 70 46 72  rom->pTab && pFr
1f0c0 6f 6d 2d 3e 7a 49 6e 64 65 78 20 29 7b 0a 20 20  om->zIndex ){.  
1f0d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1f0e0 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
1f0f0 20 63 68 61 72 20 2a 7a 49 6e 64 65 78 20 3d 20   char *zIndex = 
1f100 70 46 72 6f 6d 2d 3e 7a 49 6e 64 65 78 3b 0a 20  pFrom->zIndex;. 
1f110 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
1f120 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
1f130 62 2d 3e 70 49 6e 64 65 78 3b 20 0a 20 20 20 20  b->pIndex; .    
1f140 20 20 20 20 70 49 64 78 20 26 26 20 73 71 6c 69      pIdx && sqli
1f150 74 65 33 53 74 72 49 43 6d 70 28 70 49 64 78 2d  te3StrICmp(pIdx-
1f160 3e 7a 4e 61 6d 65 2c 20 7a 49 6e 64 65 78 29 3b  >zName, zIndex);
1f170 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 3d 70   .        pIdx=p
1f180 49 64 78 2d 3e 70 4e 65 78 74 0a 20 20 20 20 29  Idx->pNext.    )
1f190 3b 0a 20 20 20 20 69 66 28 20 21 70 49 64 78 20  ;.    if( !pIdx 
1f1a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f1b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1f1c0 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
1f1d0 20 25 73 22 2c 20 7a 49 6e 64 65 78 2c 20 30 29   %s", zIndex, 0)
1f1e0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1f1f0 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
1f200 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f210 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1f220 7d 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 70 49 6e  }.    pFrom->pIn
1f230 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 7d 0a  dex = pIdx;.  }.
1f240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f250 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 44 65 74 65  OK;.}./*.** Dete
1f260 63 74 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  ct compound SELE
1f270 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  CT statements th
1f280 61 74 20 75 73 65 20 61 6e 20 4f 52 44 45 52 20  at use an ORDER 
1f290 42 59 20 63 6c 61 75 73 65 20 77 69 74 68 20 0a  BY clause with .
1f2a0 2a 2a 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  ** an alternativ
1f2b0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
1f2c0 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 53  ence..**.**    S
1f2d0 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
1f2e0 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54 20  1 EXCEPT SELECT 
1f2f0 2e 2e 2e 20 46 52 4f 4d 20 74 32 20 4f 52 44 45  ... FROM t2 ORDE
1f300 52 20 42 59 20 2e 2e 20 43 4f 4c 4c 41 54 45 20  R BY .. COLLATE 
1f310 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ....**.** These 
1f320 61 72 65 20 72 65 77 72 69 74 74 65 6e 20 61 73  are rewritten as
1f330 20 61 20 73 75 62 71 75 65 72 79 3a 0a 2a 2a 0a   a subquery:.**.
1f340 2a 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  **    SELECT * F
1f350 52 4f 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20  ROM (SELECT ... 
1f360 46 52 4f 4d 20 74 31 20 45 58 43 45 50 54 20 53  FROM t1 EXCEPT S
1f370 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
1f380 32 29 0a 2a 2a 20 20 20 20 20 4f 52 44 45 52 20  2).**     ORDER 
1f390 42 59 20 2e 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e  BY ... COLLATE .
1f3a0 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  ...**.** This tr
1f3b0 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
1f3c0 6e 65 63 65 73 73 61 72 79 20 62 65 63 61 75 73  necessary becaus
1f3d0 65 20 74 68 65 20 6d 75 6c 74 69 53 65 6c 65 63  e the multiSelec
1f3e0 74 4f 72 64 65 72 42 79 28 29 20 72 6f 75 74 69  tOrderBy() routi
1f3f0 6e 65 0a 2a 2a 20 61 62 6f 76 65 20 74 68 61 74  ne.** above that
1f400 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
1f410 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 6f 75  ode for a compou
1f420 6e 64 20 53 45 4c 45 43 54 20 77 69 74 68 20 61  nd SELECT with a
1f430 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
1f440 65 0a 2a 2a 20 75 73 65 73 20 61 20 6d 65 72 67  e.** uses a merg
1f450 65 20 61 6c 67 6f 72 69 74 68 6d 20 74 68 61 74  e algorithm that
1f460 20 72 65 71 75 69 72 65 73 20 74 68 65 20 73 61   requires the sa
1f470 6d 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  me collating seq
1f480 75 65 6e 63 65 20 6f 6e 20 74 68 65 0a 2a 2a 20  uence on the.** 
1f490 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 61  result columns a
1f4a0 73 20 6f 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s on the ORDER B
1f4b0 59 20 63 6c 61 75 73 65 2e 20 20 53 65 65 20 74  Y clause.  See t
1f4c0 69 63 6b 65 74 0a 2a 2a 20 68 74 74 70 3a 2f 2f  icket.** http://
1f4d0 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67 2f 73  www.sqlite.org/s
1f4e0 72 63 2f 69 6e 66 6f 2f 36 37 30 39 35 37 34 64  rc/info/6709574d
1f4f0 32 61 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 74 72  2a.**.** This tr
1f500 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20  ansformation is 
1f510 6f 6e 6c 79 20 6e 65 65 64 65 64 20 66 6f 72 20  only needed for 
1f520 45 58 43 45 50 54 2c 20 49 4e 54 45 52 53 45 43  EXCEPT, INTERSEC
1f530 54 2c 20 61 6e 64 20 55 4e 49 4f 4e 2e 0a 2a 2a  T, and UNION..**
1f540 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f   The UNION ALL o
1f550 70 65 72 61 74 6f 72 20 77 6f 72 6b 73 20 66 69  perator works fi
1f560 6e 65 20 77 69 74 68 20 6d 75 6c 74 69 53 65 6c  ne with multiSel
1f570 65 63 74 4f 72 64 65 72 42 79 28 29 20 65 76 65  ectOrderBy() eve
1f580 6e 20 77 68 65 6e 0a 2a 2a 20 74 68 65 72 65 20  n when.** there 
1f590 61 72 65 20 43 4f 4c 4c 41 54 45 20 74 65 72 6d  are COLLATE term
1f5a0 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  s in the ORDER B
1f5b0 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  Y..*/.static int
1f5c0 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64   convertCompound
1f5d0 53 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79  SelectToSubquery
1f5e0 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
1f5f0 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
1f600 69 6e 74 20 69 3b 0a 20 20 53 65 6c 65 63 74 20  int i;.  Select 
1f610 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74 20  *pNew;.  Select 
1f620 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *pX;.  sqlite3 *
1f630 64 62 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  db;.  struct Exp
1f640 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 3b 0a 20  rList_item *a;. 
1f650 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 53 72   SrcList *pNewSr
1f660 63 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  c;.  Parse *pPar
1f670 73 65 3b 0a 20 20 54 6f 6b 65 6e 20 64 75 6d 6d  se;.  Token dumm
1f680 79 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  y;..  if( p->pPr
1f690 69 6f 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ior==0 ) return 
1f6a0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20  WRC_Continue;.  
1f6b0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d  if( p->pOrderBy=
1f6c0 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1f6d0 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 66 6f 72 28  Continue;.  for(
1f6e0 70 58 3d 70 3b 20 70 58 20 26 26 20 28 70 58 2d  pX=p; pX && (pX-
1f6f0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70  >op==TK_ALL || p
1f700 58 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  X->op==TK_SELECT
1f710 29 3b 20 70 58 3d 70 58 2d 3e 70 50 72 69 6f 72  ); pX=pX->pPrior
1f720 29 7b 7d 0a 20 20 69 66 28 20 70 58 3d 3d 30 20  ){}.  if( pX==0 
1f730 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
1f740 74 69 6e 75 65 3b 0a 20 20 61 20 3d 20 70 2d 3e  tinue;.  a = p->
1f750 70 4f 72 64 65 72 42 79 2d 3e 61 3b 0a 20 20 66  pOrderBy->a;.  f
1f760 6f 72 28 69 3d 70 2d 3e 70 4f 72 64 65 72 42 79  or(i=p->pOrderBy
1f770 2d 3e 6e 45 78 70 72 2d 31 3b 20 69 3e 3d 30 3b  ->nExpr-1; i>=0;
1f780 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
1f790 5b 69 5d 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73  [i].pExpr->flags
1f7a0 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 20   & EP_Collate ) 
1f7b0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1f7c0 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 57 52   i<0 ) return WR
1f7d0 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 2f  C_Continue;..  /
1f7e0 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
1f7f0 69 73 20 70 6f 69 6e 74 2c 20 74 68 61 74 20 6d  is point, that m
1f800 65 61 6e 73 20 74 68 65 20 74 72 61 6e 73 66 6f  eans the transfo
1f810 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  rmation is requi
1f820 72 65 64 2e 20 2a 2f 0a 0a 20 20 70 50 61 72 73  red. */..  pPars
1f830 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
1f840 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
1f850 73 65 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d  se->db;.  pNew =
1f860 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1f870 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1f880 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
1f890 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
1f8a0 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 6d 65   WRC_Abort;.  me
1f8b0 6d 73 65 74 28 26 64 75 6d 6d 79 2c 20 30 2c 20  mset(&dummy, 0, 
1f8c0 73 69 7a 65 6f 66 28 64 75 6d 6d 79 29 29 3b 0a  sizeof(dummy));.
1f8d0 20 20 70 4e 65 77 53 72 63 20 3d 20 73 71 6c 69    pNewSrc = sqli
1f8e0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1f8f0 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
1f900 30 2c 30 2c 30 2c 26 64 75 6d 6d 79 2c 70 4e 65  0,0,0,&dummy,pNe
1f910 77 2c 30 2c 30 29 3b 0a 20 20 69 66 28 20 70 4e  w,0,0);.  if( pN
1f920 65 77 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72  ewSrc==0 ) retur
1f930 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 2a  n WRC_Abort;.  *
1f940 70 4e 65 77 20 3d 20 2a 70 3b 0a 20 20 70 2d 3e  pNew = *p;.  p->
1f950 70 53 72 63 20 3d 20 70 4e 65 77 53 72 63 3b 0a  pSrc = pNewSrc;.
1f960 20 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71    p->pEList = sq
1f970 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
1f980 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 73  end(pParse, 0, s
1f990 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54  qlite3Expr(db, T
1f9a0 4b 5f 41 4c 4c 2c 20 30 29 29 3b 0a 20 20 70 2d  K_ALL, 0));.  p-
1f9b0 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c 45 43 54 3b  >op = TK_SELECT;
1f9c0 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 30  .  p->pWhere = 0
1f9d0 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
1f9e0 42 79 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  By = 0;.  pNew->
1f9f0 70 48 61 76 69 6e 67 20 3d 20 30 3b 0a 20 20 70  pHaving = 0;.  p
1fa00 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
1fa10 30 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d  0;.  p->pPrior =
1fa20 20 30 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d   0;.  p->pNext =
1fa30 20 30 3b 0a 20 20 70 2d 3e 73 65 6c 46 6c 61 67   0;.  p->selFlag
1fa40 73 20 26 3d 20 7e 53 46 5f 43 6f 6d 70 6f 75 6e  s &= ~SF_Compoun
1fa50 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  d;.  assert( pNe
1fa60 77 2d 3e 70 50 72 69 6f 72 21 3d 30 20 29 3b 0a  w->pPrior!=0 );.
1fa70 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 2d 3e    pNew->pPrior->
1fa80 70 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20  pNext = pNew;.  
1fa90 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20 30  pNew->pLimit = 0
1faa0 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
1fab0 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  t = 0;.  return 
1fac0 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
1fad0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1fae0 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 41  OMIT_CTE./*.** A
1faf0 72 67 75 6d 65 6e 74 20 70 57 69 74 68 20 28 77  rgument pWith (w
1fb00 68 69 63 68 20 6d 61 79 20 62 65 20 4e 55 4c 4c  hich may be NULL
1fb10 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6c 69  ) points to a li
1fb20 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6e 65 73  nked list of nes
1fb30 74 65 64 20 0a 2a 2a 20 57 49 54 48 20 63 6f 6e  ted .** WITH con
1fb40 74 65 78 74 73 2c 20 66 72 6f 6d 20 69 6e 6e 65  texts, from inne
1fb50 72 20 74 6f 20 6f 75 74 65 72 6d 6f 73 74 2e 20  r to outermost. 
1fb60 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  If the table ide
1fb70 6e 74 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 46  ntified by .** F
1fb80 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
1fb90 6e 74 20 70 49 74 65 6d 20 69 73 20 72 65 61 6c  nt pItem is real
1fba0 6c 79 20 61 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c  ly a common-tabl
1fbb0 65 2d 65 78 70 72 65 73 73 69 6f 6e 20 28 43 54  e-expression (CT
1fbc0 45 29 20 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  E) .** then retu
1fbd0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1fbe0 74 68 65 20 43 54 45 20 64 65 66 69 6e 69 74 69  the CTE definiti
1fbf0 6f 6e 20 66 6f 72 20 74 68 61 74 20 74 61 62 6c  on for that tabl
1fc00 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  e. Otherwise.** 
1fc10 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
1fc20 2a 2a 20 49 66 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ** If a non-NULL
1fc30 20 76 61 6c 75 65 20 69 73 20 72 65 74 75 72 6e   value is return
1fc40 65 64 2c 20 73 65 74 20 2a 70 70 43 6f 6e 74 65  ed, set *ppConte
1fc50 78 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  xt to point to t
1fc60 68 65 20 57 69 74 68 0a 2a 2a 20 6f 62 6a 65 63  he With.** objec
1fc70 74 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  t that the retur
1fc80 6e 65 64 20 43 54 45 20 62 65 6c 6f 6e 67 73 20  ned CTE belongs 
1fc90 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  to..*/.static st
1fca0 72 75 63 74 20 43 74 65 20 2a 73 65 61 72 63 68  ruct Cte *search
1fcb0 57 69 74 68 28 0a 20 20 57 69 74 68 20 2a 70 57  With(.  With *pW
1fcc0 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
1fcd0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
1fce0 6e 74 20 6f 75 74 65 72 6d 6f 73 74 20 57 49 54  nt outermost WIT
1fcf0 48 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  H clause */.  st
1fd00 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1fd10 6d 20 2a 70 49 74 65 6d 2c 20 20 20 20 20 2f 2a  m *pItem,     /*
1fd20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
1fd30 6d 65 6e 74 20 74 6f 20 72 65 73 6f 6c 76 65 20  ment to resolve 
1fd40 2a 2f 0a 20 20 57 69 74 68 20 2a 2a 70 70 43 6f  */.  With **ppCo
1fd50 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 20 20  ntext           
1fd60 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 57 49 54       /* OUT: WIT
1fd70 48 20 63 6c 61 75 73 65 20 72 65 74 75 72 6e 20  H clause return 
1fd80 76 61 6c 75 65 20 62 65 6c 6f 6e 67 73 20 74 6f  value belongs to
1fd90 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
1fda0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
1fdb0 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
1fdc0 73 65 3d 3d 30 20 26 26 20 28 7a 4e 61 6d 65 20  se==0 && (zName 
1fdd0 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 21  = pItem->zName)!
1fde0 3d 30 20 29 7b 0a 20 20 20 20 57 69 74 68 20 2a  =0 ){.    With *
1fdf0 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 57 69  p;.    for(p=pWi
1fe00 74 68 3b 20 70 3b 20 70 3d 70 2d 3e 70 4f 75 74  th; p; p=p->pOut
1fe10 65 72 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  er){.      int i
1fe20 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1fe30 20 69 3c 70 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29   i<p->nCte; i++)
1fe40 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
1fe50 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
1fe60 6d 65 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  me, p->a[i].zNam
1fe70 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
1fe80 20 20 20 2a 70 70 43 6f 6e 74 65 78 74 20 3d 20     *ppContext = 
1fe90 70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  p;.          ret
1fea0 75 72 6e 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  urn &p->a[i];.  
1feb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1fec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1fed0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn 0;.}../* The 
1fee0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6d  code generator m
1fef0 61 69 6e 74 61 69 6e 73 20 61 20 73 74 61 63 6b  aintains a stack
1ff00 20 6f 66 20 61 63 74 69 76 65 20 57 49 54 48 20   of active WITH 
1ff10 63 6c 61 75 73 65 73 0a 2a 2a 20 77 69 74 68 20  clauses.** with 
1ff20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 57  the inner-most W
1ff30 49 54 48 20 63 6c 61 75 73 65 20 62 65 69 6e 67  ITH clause being
1ff40 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
1ff50 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
1ff60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 73  This routine pus
1ff70 68 65 73 20 74 68 65 20 57 49 54 48 20 63 6c 61  hes the WITH cla
1ff80 75 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  use passed as th
1ff90 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1ffa0 74 0a 2a 2a 20 6f 6e 74 6f 20 74 68 65 20 74 6f  t.** onto the to
1ffb0 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
1ffc0 49 66 20 61 72 67 75 6d 65 6e 74 20 62 46 72 65  If argument bFre
1ffd0 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
1ffe0 74 68 69 73 0a 2a 2a 20 57 49 54 48 20 63 6c 61  this.** WITH cla
1fff0 75 73 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  use will never b
20000 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68  e popped from th
20010 65 20 73 74 61 63 6b 2e 20 49 6e 20 74 68 69 73  e stack. In this
20020 20 63 61 73 65 20 69 74 0a 2a 2a 20 73 68 6f 75   case it.** shou
20030 6c 64 20 62 65 20 66 72 65 65 64 20 61 6c 6f 6e  ld be freed alon
20040 67 20 77 69 74 68 20 74 68 65 20 50 61 72 73 65  g with the Parse
20050 20 6f 62 6a 65 63 74 2e 20 49 6e 20 6f 74 68 65   object. In othe
20060 72 20 63 61 73 65 73 2c 20 77 68 65 6e 0a 2a 2a  r cases, when.**
20070 20 62 46 72 65 65 3d 3d 30 2c 20 74 68 65 20 57   bFree==0, the W
20080 69 74 68 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  ith object will 
20090 62 65 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77  be freed along w
200a0 69 74 68 20 74 68 65 20 53 45 4c 45 43 54 20 0a  ith the SELECT .
200b0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  ** statement wit
200c0 68 20 77 68 69 63 68 20 69 74 20 69 73 20 61 73  h which it is as
200d0 73 6f 63 69 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  sociated..*/.voi
200e0 64 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73  d sqlite3WithPus
200f0 68 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  h(Parse *pParse,
20100 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 75 38   With *pWith, u8
20110 20 62 46 72 65 65 29 7b 0a 20 20 61 73 73 65 72   bFree){.  asser
20120 74 28 20 62 46 72 65 65 3d 3d 30 20 7c 7c 20 70  t( bFree==0 || p
20130 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 30 20  Parse->pWith==0 
20140 29 3b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  );.  if( pWith )
20150 7b 0a 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75  {.    pWith->pOu
20160 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57  ter = pParse->pW
20170 69 74 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ith;.    pParse-
20180 3e 70 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a  >pWith = pWith;.
20190 20 20 20 20 70 50 61 72 73 65 2d 3e 62 46 72 65      pParse->bFre
201a0 65 57 69 74 68 20 3d 20 62 46 72 65 65 3b 0a 20  eWith = bFree;. 
201b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
201c0 20 66 75 6e 63 74 69 6f 6e 20 63 68 65 63 6b 73   function checks
201d0 20 69 66 20 61 72 67 75 6d 65 6e 74 20 70 46 72   if argument pFr
201e0 6f 6d 20 72 65 66 65 72 73 20 74 6f 20 61 20 43  om refers to a C
201f0 54 45 20 64 65 63 6c 61 72 65 64 20 62 79 20 0a  TE declared by .
20200 2a 2a 20 61 20 57 49 54 48 20 63 6c 61 75 73 65  ** a WITH clause
20210 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 63 75   on the stack cu
20220 72 72 65 6e 74 6c 79 20 6d 61 69 6e 74 61 69 6e  rrently maintain
20230 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
20240 2e 20 41 6e 64 2c 0a 2a 2a 20 69 66 20 63 75 72  . And,.** if cur
20250 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73 69 6e  rently processin
20260 67 20 61 20 43 54 45 20 65 78 70 72 65 73 73 69  g a CTE expressi
20270 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 61 20 72  on, if it is a r
20280 65 63 75 72 73 69 76 65 0a 2a 2a 20 72 65 66 65  ecursive.** refe
20290 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 75 72  rence to the cur
202a0 72 65 6e 74 20 43 54 45 2e 0a 2a 2a 0a 2a 2a 20  rent CTE..**.** 
202b0 49 66 20 70 46 72 6f 6d 20 66 61 6c 6c 73 20 69  If pFrom falls i
202c0 6e 74 6f 20 65 69 74 68 65 72 20 6f 66 20 74 68  nto either of th
202d0 65 20 74 77 6f 20 63 61 74 65 67 6f 72 69 65 73  e two categories
202e0 20 61 62 6f 76 65 2c 20 70 46 72 6f 6d 2d 3e 70   above, pFrom->p
202f0 54 61 62 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72  Tab.** and other
20300 20 66 69 65 6c 64 73 20 61 72 65 20 70 6f 70 75   fields are popu
20310 6c 61 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c  lated accordingl
20320 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  y. The caller sh
20330 6f 75 6c 64 20 63 68 65 63 6b 0a 2a 2a 20 28 70  ould check.** (p
20340 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 29 20 74  From->pTab!=0) t
20350 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  o determine whet
20360 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 73 75 63  her or not a suc
20370 63 65 73 73 66 75 6c 20 6d 61 74 63 68 0a 2a 2a  cessful match.**
20380 20 77 61 73 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   was found..**.*
20390 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
203a0 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
203b0 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  d, SQLITE_OK is 
203c0 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
203d0 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 20  rror.** occurs. 
203e0 49 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  If an error does
203f0 20 6f 63 63 75 72 2c 20 61 6e 20 65 72 72 6f 72   occur, an error
20400 20 6d 65 73 73 61 67 65 20 69 73 20 73 74 6f 72   message is stor
20410 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 72  ed in the.** par
20420 73 65 72 20 61 6e 64 20 73 6f 6d 65 20 65 72 72  ser and some err
20430 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 20 74 68  or code other th
20440 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  an SQLITE_OK ret
20450 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
20460 20 69 6e 74 20 77 69 74 68 45 78 70 61 6e 64 28   int withExpand(
20470 0a 20 20 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  .  Walker *pWalk
20480 65 72 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72  er, .  struct Sr
20490 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
204a0 6d 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  m.){.  Parse *pP
204b0 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
204c0 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
204d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
204e0 64 62 3b 0a 20 20 73 74 72 75 63 74 20 43 74 65  db;.  struct Cte
204f0 20 2a 70 43 74 65 3b 20 20 20 20 20 20 20 20 20   *pCte;         
20500 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65 64        /* Matched
20510 20 43 54 45 20 28 6f 72 20 4e 55 4c 4c 20 69 66   CTE (or NULL if
20520 20 6e 6f 20 6d 61 74 63 68 29 20 2a 2f 0a 20 20   no match) */.  
20530 57 69 74 68 20 2a 70 57 69 74 68 3b 20 20 20 20  With *pWith;    
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 2f 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 74  /* WITH clause t
20560 68 61 74 20 70 43 74 65 20 62 65 6c 6f 6e 67 73  hat pCte belongs
20570 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
20580 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
20590 20 29 3b 0a 0a 20 20 70 43 74 65 20 3d 20 73 65   );..  pCte = se
205a0 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2d  archWith(pParse-
205b0 3e 70 57 69 74 68 2c 20 70 46 72 6f 6d 2c 20 26  >pWith, pFrom, &
205c0 70 57 69 74 68 29 3b 0a 20 20 69 66 28 20 70 43  pWith);.  if( pC
205d0 74 65 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  te ){.    Table 
205e0 2a 70 54 61 62 3b 0a 20 20 20 20 45 78 70 72 4c  *pTab;.    ExprL
205f0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
20600 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 20   Select *pSel;. 
20610 20 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74     Select *pLeft
20620 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20630 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 53 45   /* Left-most SE
20640 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
20650 2f 0a 20 20 20 20 69 6e 74 20 62 4d 61 79 52 65  /.    int bMayRe
20660 63 75 72 73 69 76 65 3b 20 20 20 20 20 20 20 20  cursive;        
20670 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63      /* True if c
20680 6f 6d 70 6f 75 6e 64 20 6a 6f 69 6e 65 64 20 62  ompound joined b
20690 79 20 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f  y UNION [ALL] */
206a0 0a 20 20 20 20 57 69 74 68 20 2a 70 53 61 76 65  .    With *pSave
206b0 64 57 69 74 68 3b 20 20 20 20 20 20 20 20 20 20  dWith;          
206c0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61     /* Initial va
206d0 6c 75 65 20 6f 66 20 70 50 61 72 73 65 2d 3e 70  lue of pParse->p
206e0 57 69 74 68 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  With */..    /* 
206f0 49 66 20 70 43 74 65 2d 3e 7a 45 72 72 20 69 73  If pCte->zErr is
20700 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 74 20 74 68 69   non-NULL at thi
20710 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
20720 69 73 20 69 73 20 61 6e 20 69 6c 6c 65 67 61 6c  is is an illegal
20730 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76  .    ** recursiv
20740 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 43  e reference to C
20750 54 45 20 70 43 74 65 2e 20 4c 65 61 76 65 20 61  TE pCte. Leave a
20760 6e 20 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73  n error in pPars
20770 65 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  e and return.   
20780 20 2a 2a 20 65 61 72 6c 79 2e 20 49 66 20 70 43   ** early. If pC
20790 74 65 2d 3e 7a 45 72 72 20 69 73 20 4e 55 4c 4c  te->zErr is NULL
207a0 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 6e  , then this is n
207b0 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 72  ot a recursive r
207c0 65 66 65 72 65 6e 63 65 2e 0a 20 20 20 20 2a 2a  eference..    **
207d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 70   In this case, p
207e0 72 6f 63 65 65 64 2e 20 20 2a 2f 0a 20 20 20 20  roceed.  */.    
207f0 69 66 28 20 70 43 74 65 2d 3e 7a 45 72 72 20 29  if( pCte->zErr )
20800 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
20810 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20820 70 43 74 65 2d 3e 7a 45 72 72 2c 20 70 43 74 65  pCte->zErr, pCte
20830 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
20840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
20850 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
20860 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70  assert( pFrom->p
20870 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  Tab==0 );.    pF
20880 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  rom->pTab = pTab
20890 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
208a0 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
208b0 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 69  f(Table));.    i
208c0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74  f( pTab==0 ) ret
208d0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
208e0 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20     pTab->nRef = 
208f0 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61  1;.    pTab->zNa
20900 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
20910 72 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 7a  rDup(db, pCte->z
20920 4e 61 6d 65 29 3b 0a 20 20 20 20 70 54 61 62 2d  Name);.    pTab-
20930 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
20940 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d   pTab->nRowEst =
20950 20 31 30 34 38 35 37 36 3b 0a 20 20 20 20 70 54   1048576;.    pT
20960 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
20970 54 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20  TF_Ephemeral;.  
20980 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74    pFrom->pSelect
20990 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
209a0 44 75 70 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  Dup(db, pCte->pS
209b0 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69  elect, 0);.    i
209c0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
209d0 6c 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  led ) return SQL
209e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 61  ITE_NOMEM;.    a
209f0 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53  ssert( pFrom->pS
20a00 65 6c 65 63 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  elect );..    /*
20a10 20 43 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   Check if this i
20a20 73 20 61 20 72 65 63 75 72 73 69 76 65 20 43 54  s a recursive CT
20a30 45 2e 20 2a 2f 0a 20 20 20 20 70 53 65 6c 20 3d  E. */.    pSel =
20a40 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
20a50 0a 20 20 20 20 62 4d 61 79 52 65 63 75 72 73 69  .    bMayRecursi
20a60 76 65 20 3d 20 28 20 70 53 65 6c 2d 3e 6f 70 3d  ve = ( pSel->op=
20a70 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 53 65 6c 2d  =TK_ALL || pSel-
20a80 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
20a90 0a 20 20 20 20 69 66 28 20 62 4d 61 79 52 65 63  .    if( bMayRec
20aa0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
20ab0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 53 72 63  int i;.      Src
20ac0 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 70 46 72  List *pSrc = pFr
20ad0 6f 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  om->pSelect->pSr
20ae0 63 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  c;.      for(i=0
20af0 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
20b00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 74  i++){.        st
20b10 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20b20 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63  m *pItem = &pSrc
20b30 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ->a[i];.        
20b40 69 66 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  if( pItem->zData
20b50 62 61 73 65 3d 3d 30 20 0a 20 20 20 20 20 20 20  base==0 .       
20b60 20 20 26 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d    && pItem->zNam
20b70 65 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26  e!=0 .         &
20b80 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
20b90 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  Cmp(pItem->zName
20ba0 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 0a 20  , pCte->zName). 
20bb0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
20bc0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 54 61        pItem->pTa
20bd0 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
20be0 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 52 65 63      pItem->isRec
20bf0 75 72 73 69 76 65 20 3d 20 31 3b 0a 20 20 20 20  ursive = 1;.    
20c00 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
20c10 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ++;.          pS
20c20 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20  el->selFlags |= 
20c30 53 46 5f 52 65 63 75 72 73 69 76 65 3b 0a 20 20  SF_Recursive;.  
20c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20c50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e      }..    /* On
20c60 6c 79 20 6f 6e 65 20 72 65 63 75 72 73 69 76 65  ly one recursive
20c70 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 70 65   reference is pe
20c80 72 6d 69 74 74 65 64 2e 20 2a 2f 20 0a 20 20 20  rmitted. */ .   
20c90 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65 66 3e   if( pTab->nRef>
20ca0 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
20cb0 65 33 45 72 72 6f 72 4d 73 67 28 0a 20 20 20 20  e3ErrorMsg(.    
20cc0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 22 6d        pParse, "m
20cd0 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63  ultiple referenc
20ce0 65 73 20 74 6f 20 72 65 63 75 72 73 69 76 65 20  es to recursive 
20cf0 74 61 62 6c 65 3a 20 25 73 22 2c 20 70 43 74 65  table: %s", pCte
20d00 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
20d10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20d20 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
20d30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  }.    assert( pT
20d40 61 62 2d 3e 6e 52 65 66 3d 3d 31 20 7c 7c 20 28  ab->nRef==1 || (
20d50 28 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73 26  (pSel->selFlags&
20d60 53 46 5f 52 65 63 75 72 73 69 76 65 29 20 26 26  SF_Recursive) &&
20d70 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 32 20 29   pTab->nRef==2 )
20d80 29 3b 0a 0a 20 20 20 20 70 43 74 65 2d 3e 7a 45  );..    pCte->zE
20d90 72 72 20 3d 20 22 63 69 72 63 75 6c 61 72 20 72  rr = "circular r
20da0 65 66 65 72 65 6e 63 65 3a 20 25 73 22 3b 0a 20  eference: %s";. 
20db0 20 20 20 70 53 61 76 65 64 57 69 74 68 20 3d 20     pSavedWith = 
20dc0 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a 20  pParse->pWith;. 
20dd0 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68     pParse->pWith
20de0 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 73 71   = pWith;.    sq
20df0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
20e00 70 57 61 6c 6b 65 72 2c 20 62 4d 61 79 52 65 63  pWalker, bMayRec
20e10 75 72 73 69 76 65 20 3f 20 70 53 65 6c 2d 3e 70  ursive ? pSel->p
20e20 50 72 69 6f 72 20 3a 20 70 53 65 6c 29 3b 0a 0a  Prior : pSel);..
20e30 20 20 20 20 66 6f 72 28 70 4c 65 66 74 3d 70 53      for(pLeft=pS
20e40 65 6c 3b 20 70 4c 65 66 74 2d 3e 70 50 72 69 6f  el; pLeft->pPrio
20e50 72 3b 20 70 4c 65 66 74 3d 70 4c 65 66 74 2d 3e  r; pLeft=pLeft->
20e60 70 50 72 69 6f 72 29 3b 0a 20 20 20 20 70 45 4c  pPrior);.    pEL
20e70 69 73 74 20 3d 20 70 4c 65 66 74 2d 3e 70 45 4c  ist = pLeft->pEL
20e80 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 43 74  ist;.    if( pCt
20e90 65 2d 3e 70 43 6f 6c 73 20 29 7b 0a 20 20 20 20  e->pCols ){.    
20ea0 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
20eb0 78 70 72 21 3d 70 43 74 65 2d 3e 70 43 6f 6c 73  xpr!=pCte->pCols
20ec0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
20ed0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20ee0 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
20ef0 65 20 25 73 20 68 61 73 20 25 64 20 76 61 6c 75  e %s has %d valu
20f00 65 73 20 66 6f 72 20 25 64 20 63 6f 6c 75 6d 6e  es for %d column
20f10 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
20f20 70 43 74 65 2d 3e 7a 4e 61 6d 65 2c 20 70 45 4c  pCte->zName, pEL
20f30 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70 43 74 65  ist->nExpr, pCte
20f40 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78 70 72 0a 20  ->pCols->nExpr. 
20f50 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
20f60 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20    pParse->pWith 
20f70 3d 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20  = pSavedWith;.  
20f80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20f90 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
20fa0 20 7d 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20   }.      pEList 
20fb0 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b 0a 20  = pCte->pCols;. 
20fc0 20 20 20 7d 0a 0a 20 20 20 20 73 65 6c 65 63 74     }..    select
20fd0 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
20fe0 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ist(pParse, pELi
20ff0 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c  st, &pTab->nCol,
21000 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20   &pTab->aCol);. 
21010 20 20 20 69 66 28 20 62 4d 61 79 52 65 63 75 72     if( bMayRecur
21020 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 69 66  sive ){.      if
21030 28 20 70 53 65 6c 2d 3e 73 65 6c 46 6c 61 67 73  ( pSel->selFlags
21040 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65 20   & SF_Recursive 
21050 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 65 2d  ){.        pCte-
21060 3e 7a 45 72 72 20 3d 20 22 6d 75 6c 74 69 70 6c  >zErr = "multipl
21070 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
21080 72 65 6e 63 65 73 3a 20 25 73 22 3b 0a 20 20 20  rences: %s";.   
21090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
210a0 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 22    pCte->zErr = "
210b0 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
210c0 6e 63 65 20 69 6e 20 61 20 73 75 62 71 75 65 72  nce in a subquer
210d0 79 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 0a  y: %s";.      }.
210e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
210f0 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
21100 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   pSel);.    }.  
21110 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20 30    pCte->zErr = 0
21120 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57  ;.    pParse->pW
21130 69 74 68 20 3d 20 70 53 61 76 65 64 57 69 74 68  ith = pSavedWith
21140 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
21150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
21160 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
21170 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a  ITE_OMIT_CTE./*.
21180 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 43 54  ** If the SELECT
21190 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
211a0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 68  econd argument h
211b0 61 73 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64  as an associated
211c0 20 57 49 54 48 20 0a 2a 2a 20 63 6c 61 75 73 65   WITH .** clause
211d0 2c 20 70 6f 70 20 69 74 20 66 72 6f 6d 20 74 68  , pop it from th
211e0 65 20 73 74 61 63 6b 20 73 74 6f 72 65 64 20 61  e stack stored a
211f0 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 50 61  s part of the Pa
21200 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  rse object..**.*
21210 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21220 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 78  is used as the x
21230 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 28  SelectCallback2(
21240 29 20 63 61 6c 6c 62 61 63 6b 20 62 79 0a 2a 2a  ) callback by.**
21250 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
21260 70 61 6e 64 28 29 20 77 68 65 6e 20 77 61 6c 6b  pand() when walk
21270 69 6e 67 20 61 20 53 45 4c 45 43 54 20 74 72 65  ing a SELECT tre
21280 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 61 62  e to resolve tab
21290 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 61 6e 64 20  le.** names and 
212a0 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
212b0 65 20 65 6c 65 6d 65 6e 74 73 2e 20 0a 2a 2f 0a  e elements. .*/.
212c0 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
212d0 63 74 50 6f 70 57 69 74 68 28 57 61 6c 6b 65 72  ctPopWith(Walker
212e0 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
212f0 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a  t *p){.  Parse *
21300 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
21310 2d 3e 70 50 61 72 73 65 3b 0a 20 20 57 69 74 68  ->pParse;.  With
21320 20 2a 70 57 69 74 68 20 3d 20 66 69 6e 64 52 69   *pWith = findRi
21330 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74  ghtmost(p)->pWit
21340 68 3b 0a 20 20 69 66 28 20 70 57 69 74 68 21 3d  h;.  if( pWith!=
21350 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
21360 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d   pParse->pWith==
21370 70 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61  pWith );.    pPa
21380 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69  rse->pWith = pWi
21390 74 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a  th->pOuter;.  }.
213a0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
213b0 73 65 6c 65 63 74 50 6f 70 57 69 74 68 20 30 0a  selectPopWith 0.
213c0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
213d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
213e0 57 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20  Walker callback 
213f0 66 6f 72 20 22 65 78 70 61 6e 64 69 6e 67 22 20  for "expanding" 
21400 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
21410 6e 74 2e 0a 2a 2a 20 22 45 78 70 61 6e 64 69 6e  nt..** "Expandin
21420 67 22 20 6d 65 61 6e 73 20 74 6f 20 64 6f 20 74  g" means to do t
21430 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
21440 0a 2a 2a 20 20 20 20 28 31 29 20 20 4d 61 6b 65  .**    (1)  Make
21450 20 73 75 72 65 20 56 44 42 45 20 63 75 72 73 6f   sure VDBE curso
21460 72 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62  r numbers have b
21470 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20  een assigned to 
21480 65 76 65 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  every.**        
21490 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
214a0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  FROM clause..**.
214b0 2a 2a 20 20 20 20 28 32 29 20 20 46 69 6c 6c 20  **    (2)  Fill 
214c0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 2d  in the pTabList-
214d0 3e 61 5b 5d 2e 70 54 61 62 20 66 69 65 6c 64 73  >a[].pTab fields
214e0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
214f0 74 68 61 74 20 0a 2a 2a 20 20 20 20 20 20 20 20  that .**        
21500 20 64 65 66 69 6e 65 73 20 46 52 4f 4d 20 63 6c   defines FROM cl
21510 61 75 73 65 2e 20 20 57 68 65 6e 20 76 69 65 77  ause.  When view
21520 73 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  s appear in the 
21530 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 2a 2a 20  FROM clause,.** 
21540 20 20 20 20 20 20 20 20 66 69 6c 6c 20 70 54 61          fill pTa
21550 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 53 65 6c 65  bList->a[].pSele
21560 63 74 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  ct with a copy o
21570 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
21580 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
21590 20 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74    that implement
215a0 73 20 74 68 65 20 76 69 65 77 2e 20 20 41 20 63  s the view.  A c
215b0 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 74  opy is made of t
215c0 68 65 20 76 69 65 77 27 73 20 53 45 4c 45 43 54  he view's SELECT
215d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 74 61 74  .**         stat
215e0 65 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 77 65  ement so that we
215f0 20 63 61 6e 20 66 72 65 65 6c 79 20 6d 6f 64 69   can freely modi
21600 66 79 20 6f 72 20 64 65 6c 65 74 65 20 74 68 61  fy or delete tha
21610 74 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 20  t statement.**  
21620 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 77         without w
21630 6f 72 72 79 69 6e 67 20 61 62 6f 75 74 20 6d 65  orrying about me
21640 73 73 69 6e 67 20 75 70 20 74 68 65 20 70 72 65  ssing up the pre
21650 73 69 73 74 65 6e 74 20 72 65 70 72 65 73 65 6e  sistent represen
21660 74 61 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  tation.**       
21670 20 20 6f 66 20 74 68 65 20 76 69 65 77 2e 0a 2a    of the view..*
21680 2a 0a 2a 2a 20 20 20 20 28 33 29 20 20 41 64 64  *.**    (3)  Add
21690 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 57 48   terms to the WH
216a0 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 63  ERE clause to ac
216b0 63 6f 6d 6f 64 61 74 65 20 74 68 65 20 4e 41 54  comodate the NAT
216c0 55 52 41 4c 20 6b 65 79 77 6f 72 64 0a 2a 2a 20  URAL keyword.** 
216d0 20 20 20 20 20 20 20 20 6f 6e 20 6a 6f 69 6e 73          on joins
216e0 20 61 6e 64 20 74 68 65 20 4f 4e 20 61 6e 64 20   and the ON and 
216f0 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20  USING clause of 
21700 6a 6f 69 6e 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  joins..**.**    
21710 28 34 29 20 20 53 63 61 6e 20 74 68 65 20 6c 69  (4)  Scan the li
21720 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  st of columns in
21730 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
21740 28 70 45 4c 69 73 74 29 20 6c 6f 6f 6b 69 6e 67  (pEList) looking
21750 0a 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 20  .**         for 
21760 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
21770 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 20 6f 72   "*" operator or
21780 20 74 68 65 20 54 41 42 4c 45 2e 2a 20 6f 70 65   the TABLE.* ope
21790 72 61 74 6f 72 2e 0a 2a 2a 20 20 20 20 20 20 20  rator..**       
217a0 20 20 49 66 20 66 6f 75 6e 64 2c 20 65 78 70 61    If found, expa
217b0 6e 64 20 65 61 63 68 20 22 2a 22 20 74 6f 20 62  nd each "*" to b
217c0 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 69  e every column i
217d0 6e 20 65 76 65 72 79 20 74 61 62 6c 65 0a 2a 2a  n every table.**
217e0 20 20 20 20 20 20 20 20 20 61 6e 64 20 54 41 42           and TAB
217f0 4c 45 2e 2a 20 74 6f 20 62 65 20 65 76 65 72 79  LE.* to be every
21800 20 63 6f 6c 75 6d 6e 20 69 6e 20 54 41 42 4c 45   column in TABLE
21810 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ..**.*/.static i
21820 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  nt selectExpande
21830 72 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  r(Walker *pWalke
21840 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
21850 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
21860 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
21870 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  ;.  int i, j, k;
21880 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
21890 4c 69 73 74 3b 0a 20 20 45 78 70 72 4c 69 73 74  List;.  ExprList
218a0 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
218b0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
218c0 2a 70 46 72 6f 6d 3b 0a 20 20 73 71 6c 69 74 65  *pFrom;.  sqlite
218d0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
218e0 64 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 2c 20  db;.  Expr *pE, 
218f0 2a 70 52 69 67 68 74 2c 20 2a 70 45 78 70 72 3b  *pRight, *pExpr;
21900 0a 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 20  .  u16 selFlags 
21910 3d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 3b 0a 0a  = p->selFlags;..
21920 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
21930 20 53 46 5f 45 78 70 61 6e 64 65 64 3b 0a 20 20   SF_Expanded;.  
21940 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
21950 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
21960 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
21970 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70   }.  if( NEVER(p
21980 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 73  ->pSrc==0) || (s
21990 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70  elFlags & SF_Exp
219a0 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a 20 20 20  anded)!=0 ){.   
219b0 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
219c0 65 3b 0a 20 20 7d 0a 20 20 70 54 61 62 4c 69 73  e;.  }.  pTabLis
219d0 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
219e0 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
219f0 74 3b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68  t;.  sqlite3With
21a00 50 75 73 68 28 70 50 61 72 73 65 2c 20 66 69 6e  Push(pParse, fin
21a10 64 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 70  dRightmost(p)->p
21a20 57 69 74 68 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  With, 0);..  /* 
21a30 4d 61 6b 65 20 73 75 72 65 20 63 75 72 73 6f 72  Make sure cursor
21a40 20 6e 75 6d 62 65 72 73 20 68 61 76 65 20 62 65   numbers have be
21a50 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  en assigned to a
21a60 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ll entries in.  
21a70 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  ** the FROM clau
21a80 73 65 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  se of the SELECT
21a90 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f   statement..  */
21aa0 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
21ab0 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
21ac0 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 29  Parse, pTabList)
21ad0 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20  ;..  /* Look up 
21ae0 65 76 65 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  every table name
21af0 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
21b00 61 75 73 65 20 6f 66 20 74 68 65 20 73 65 6c 65  ause of the sele
21b10 63 74 2e 20 20 49 66 0a 20 20 2a 2a 20 61 6e 20  ct.  If.  ** an 
21b20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f  entry of the FRO
21b30 4d 20 63 6c 61 75 73 65 20 69 73 20 61 20 73 75  M clause is a su
21b40 62 71 75 65 72 79 20 69 6e 73 74 65 61 64 20 6f  bquery instead o
21b50 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
21b60 77 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 63 72 65  w,.  ** then cre
21b70 61 74 65 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ate a transient 
21b80 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
21b90 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 65 20  to describe the 
21ba0 73 75 62 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  subquery..  */. 
21bb0 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d   for(i=0, pFrom=
21bc0 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pTabList->a; i<p
21bd0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
21be0 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20  ++, pFrom++){.  
21bf0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
21c00 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
21c10 2d 3e 69 73 52 65 63 75 72 73 69 76 65 3d 3d 30  ->isRecursive==0
21c20 20 7c 7c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20   || pFrom->pTab 
21c30 29 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d  );.    if( pFrom
21c40 2d 3e 69 73 52 65 63 75 72 73 69 76 65 20 29 20  ->isRecursive ) 
21c50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
21c60 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30  ( pFrom->pTab!=0
21c70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
21c80 73 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20  s statement has 
21c90 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65  already been pre
21ca0 70 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73  pared.  There is
21cb0 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a   no need.      *
21cc0 2a 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e  * to go further.
21cd0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
21ce0 28 20 69 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65  ( i==0 );.#ifnde
21cf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
21d00 45 0a 20 20 20 20 20 20 73 65 6c 65 63 74 50 6f  E.      selectPo
21d10 70 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20 70  pWith(pWalker, p
21d20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
21d30 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
21d40 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
21d50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
21d60 20 20 20 20 69 66 28 20 77 69 74 68 45 78 70 61      if( withExpa
21d70 6e 64 28 70 57 61 6c 6b 65 72 2c 20 70 46 72 6f  nd(pWalker, pFro
21d80 6d 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  m) ) return WRC_
21d90 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 70  Abort;.    if( p
21da0 46 72 6f 6d 2d 3e 70 54 61 62 20 29 20 7b 7d 20  From->pTab ) {} 
21db0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
21dc0 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 4e 61 6d 65  if( pFrom->zName
21dd0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
21de0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
21df0 45 52 59 0a 20 20 20 20 20 20 53 65 6c 65 63 74  ERY.      Select
21e00 20 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e   *pSel = pFrom->
21e10 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 2f  pSelect;.      /
21e20 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e  * A sub-query in
21e30 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
21e40 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a   of a SELECT */.
21e50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
21e60 65 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  el!=0 );.      a
21e70 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
21e80 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ab==0 );.      s
21e90 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
21ea0 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b  (pWalker, pSel);
21eb0 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54  .      pFrom->pT
21ec0 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c 69  ab = pTab = sqli
21ed0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
21ee0 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
21ef0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ));.      if( pT
21f00 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
21f10 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
21f20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  pTab->nRef = 1;.
21f30 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
21f40 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
21f50 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  tf(db, "sqlite_s
21f60 71 5f 25 70 22 2c 20 28 76 6f 69 64 2a 29 70 54  q_%p", (void*)pT
21f70 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ab);.      while
21f80 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29  ( pSel->pPrior )
21f90 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d 3e 70  { pSel = pSel->p
21fa0 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20 20 73  Prior; }.      s
21fb0 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d  electColumnsFrom
21fc0 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
21fd0 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c 20 26   pSel->pEList, &
21fe0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
21ff0 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20  b->aCol);.      
22000 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
22010 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  ;.      pTab->nR
22020 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b  owEst = 1048576;
22030 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62  .      pTab->tab
22040 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70 68 65  Flags |= TF_Ephe
22050 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a 20 20  meral;.#endif.  
22060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
22070 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20 74 61  * An ordinary ta
22080 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65  ble or view name
22090 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
220a0 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  use */.      ass
220b0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62  ert( pFrom->pTab
220c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 46 72  ==0 );.      pFr
220d0 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 20  om->pTab = pTab 
220e0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
220f0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
22100 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20   0, pFrom);.    
22110 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20    if( pTab==0 ) 
22120 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
22130 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
22140 2d 3e 6e 52 65 66 3d 3d 30 78 66 66 66 66 20 29  ->nRef==0xffff )
22150 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22160 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
22170 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 72 65 66 65  , "too many refe
22180 72 65 6e 63 65 73 20 74 6f 20 5c 22 25 73 5c 22  rences to \"%s\"
22190 3a 20 6d 61 78 20 36 35 35 33 35 22 2c 0a 20 20  : max 65535",.  
221a0 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a           pTab->z
221b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Name);.        p
221c0 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  From->pTab = 0;.
221d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
221e0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
221f0 7d 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52  }.      pTab->nR
22200 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66 69 6e  ef++;.#if !defin
22210 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
22220 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
22230 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49   (SQLITE_OMIT_VI
22240 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20  RTUALTABLE).    
22250 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
22260 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75 61 6c  ect || IsVirtual
22270 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
22280 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20 68 65    /* We reach he
22290 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  re if the named 
222a0 74 61 62 6c 65 20 69 73 20 61 20 72 65 61 6c 6c  table is a reall
222b0 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  y a view */.    
222c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
222d0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
222e0 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20  s(pParse, pTab) 
222f0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
22300 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rt;.        asse
22310 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  rt( pFrom->pSele
22320 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ct==0 );.       
22330 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20   pFrom->pSelect 
22340 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
22350 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 65  up(db, pTab->pSe
22360 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lect, 0);.      
22370 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
22380 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 46 72  ect(pWalker, pFr
22390 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  om->pSelect);.  
223a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
223b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 61 74   }..    /* Locat
223c0 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  e the index name
223d0 64 20 62 79 20 74 68 65 20 49 4e 44 45 58 45 44  d by the INDEXED
223e0 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66 20 61   BY clause, if a
223f0 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ny. */.    if( s
22400 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
22410 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 46  ookup(pParse, pF
22420 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20 72 65  rom) ){.      re
22430 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
22440 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
22450 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41 4c 20  Process NATURAL 
22460 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20 4f 4e  keywords, and ON
22470 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
22480 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20 20 2a  es of joins..  *
22490 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
224a0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71 6c 69  ocFailed || sqli
224b0 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28 70 50  teProcessJoin(pP
224c0 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20 20 20  arse, p) ){.    
224d0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
224e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20  ;.  }..  /* For 
224f0 65 76 65 72 79 20 22 2a 22 20 74 68 61 74 20 6f  every "*" that o
22500 63 63 75 72 73 20 69 6e 20 74 68 65 20 63 6f 6c  ccurs in the col
22510 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65 72 74  umn list, insert
22520 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 20 20   the names of.  
22530 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69  ** all columns i
22540 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20 20 41  n all tables.  A
22550 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54 41 42  nd for every TAB
22560 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68 65 20  LE.* insert the 
22570 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61 6c  names.  ** of al
22580 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54 41 42  l columns in TAB
22590 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  LE.  The parser 
225a0 69 6e 73 65 72 74 65 64 20 61 20 73 70 65 63 69  inserted a speci
225b0 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  al expression.  
225c0 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b 5f 41  ** with the TK_A
225d0 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  LL operator for 
225e0 65 61 63 68 20 22 2a 22 20 74 68 61 74 20 69 74  each "*" that it
225f0 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 63 6f   found in the co
22600 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a 2a 20  lumn list..  ** 
22610 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
22620 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f 20 6c  de just has to l
22630 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41 4c 4c  ocate the TK_ALL
22640 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64   expressions and
22650 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65 61 63   expand.  ** eac
22660 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c 69 73  h one to the lis
22670 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73  t of all columns
22680 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 0a   in all tables..
22690 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 69    **.  ** The fi
226a0 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20 63 68  rst loop just ch
226b0 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 74  ecks to see if t
226c0 68 65 72 65 20 61 72 65 20 61 6e 79 20 22 2a 22  here are any "*"
226d0 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a 2a 20   operators.  ** 
226e0 74 68 61 74 20 6e 65 65 64 20 65 78 70 61 6e 64  that need expand
226f0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
22700 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
22710 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
22720 70 45 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6b  pE = pEList->a[k
22730 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
22740 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   pE->op==TK_ALL 
22750 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
22760 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f  ert( pE->op!=TK_
22770 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69 67 68  DOT || pE->pRigh
22780 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t!=0 );.    asse
22790 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
227a0 4f 54 20 7c 7c 20 28 70 45 2d 3e 70 4c 65 66 74  OT || (pE->pLeft
227b0 21 3d 30 20 26 26 20 70 45 2d 3e 70 4c 65 66 74  !=0 && pE->pLeft
227c0 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 29 20 29 3b 0a  ->op==TK_ID) );.
227d0 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d      if( pE->op==
227e0 54 4b 5f 44 4f 54 20 26 26 20 70 45 2d 3e 70 52  TK_DOT && pE->pR
227f0 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  ight->op==TK_ALL
22800 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
22810 69 66 28 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45  if( k<pEList->nE
22820 78 70 72 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  xpr ){.    /*.  
22830 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 68    ** If we get h
22840 65 72 65 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ere it means the
22850 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6e 74   result set cont
22860 61 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ains one or more
22870 20 22 2a 22 0a 20 20 20 20 2a 2a 20 6f 70 65 72   "*".    ** oper
22880 61 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ators that need 
22890 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64 2e 20  to be expanded. 
228a0 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61   Loop through ea
228b0 63 68 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  ch expression.  
228c0 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
228d0 6c 74 20 73 65 74 20 61 6e 64 20 65 78 70 61 6e  lt set and expan
228e0 64 20 74 68 65 6d 20 6f 6e 65 20 62 79 20 6f 6e  d them one by on
228f0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  e..    */.    st
22900 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
22910 65 6d 20 2a 61 20 3d 20 70 45 4c 69 73 74 2d 3e  em *a = pEList->
22920 61 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  a;.    ExprList 
22930 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 69  *pNew = 0;.    i
22940 6e 74 20 66 6c 61 67 73 20 3d 20 70 50 61 72 73  nt flags = pPars
22950 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20  e->db->flags;.  
22960 20 20 69 6e 74 20 6c 6f 6e 67 4e 61 6d 65 73 20    int longNames 
22970 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
22980 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21  E_FullColNames)!
22990 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
229a0 20 20 20 20 20 20 20 20 20 26 26 20 28 66 6c 61           && (fla
229b0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
229c0 74 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 3b 0a 0a  tColNames)==0;..
229d0 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 72 6f 63      /* When proc
229e0 65 73 73 69 6e 67 20 46 52 4f 4d 2d 63 6c 61 75  essing FROM-clau
229f0 73 65 20 73 75 62 71 75 65 72 69 65 73 2c 20 69  se subqueries, i
22a00 74 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  t is always the 
22a10 63 61 73 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  case.    ** that
22a20 20 66 75 6c 6c 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d   full_column_nam
22a30 65 73 3d 4f 46 46 20 61 6e 64 20 73 68 6f 72 74  es=OFF and short
22a40 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e  _column_names=ON
22a50 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 73 71  .  The.    ** sq
22a60 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
22a70 53 65 6c 65 63 74 28 29 20 72 6f 75 74 69 6e 65  Select() routine
22a80 20 6d 61 6b 65 73 20 69 74 20 73 6f 2e 20 2a 2f   makes it so. */
22a90 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
22aa0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
22ab0 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 0a 20 20  estedFrom)==0.  
22ac0 20 20 20 20 20 20 20 20 7c 7c 20 28 28 66 6c 61          || ((fla
22ad0 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c  gs & SQLITE_Full
22ae0 43 6f 6c 4e 61 6d 65 73 29 3d 3d 30 20 26 26 0a  ColNames)==0 &&.
22af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
22b00 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68  lags & SQLITE_Sh
22b10 6f 72 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 29  ortColNames)!=0)
22b20 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6b 3d 30   );..    for(k=0
22b30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; k<pEList->nExp
22b40 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 70  r; k++){.      p
22b50 45 20 3d 20 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a  E = a[k].pExpr;.
22b60 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
22b70 45 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  E->pRight;.     
22b80 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21   assert( pE->op!
22b90 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69 67 68  =TK_DOT || pRigh
22ba0 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  t!=0 );.      if
22bb0 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  ( pE->op!=TK_ALL
22bc0 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54 4b 5f   && (pE->op!=TK_
22bd0 44 4f 54 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f  DOT || pRight->o
22be0 70 21 3d 54 4b 5f 41 4c 4c 29 20 29 7b 0a 20 20  p!=TK_ALL) ){.  
22bf0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 70 61        /* This pa
22c00 72 74 69 63 75 6c 61 72 20 65 78 70 72 65 73 73  rticular express
22c10 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ion does not nee
22c20 64 20 74 6f 20 62 65 20 65 78 70 61 6e 64 65 64  d to be expanded
22c30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
22c40 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
22c50 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
22c60 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
22c70 61 5b 6b 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[k].pExpr);.   
22c80 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
22c90 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
22ca0 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
22cb0 5d 2e 7a 4e 61 6d 65 20 3d 20 61 5b 6b 5d 2e 7a  ].zName = a[k].z
22cc0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
22cd0 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45  pNew->a[pNew->nE
22ce0 78 70 72 2d 31 5d 2e 7a 53 70 61 6e 20 3d 20 61  xpr-1].zSpan = a
22cf0 5b 6b 5d 2e 7a 53 70 61 6e 3b 0a 20 20 20 20 20  [k].zSpan;.     
22d00 20 20 20 20 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 20       a[k].zName 
22d10 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
22d20 5b 6b 5d 2e 7a 53 70 61 6e 20 3d 20 30 3b 0a 20  [k].zSpan = 0;. 
22d30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22d40 20 61 5b 6b 5d 2e 70 45 78 70 72 20 3d 20 30 3b   a[k].pExpr = 0;
22d50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
22d60 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 65 78        /* This ex
22d70 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 22 2a  pression is a "*
22d80 22 20 6f 72 20 61 20 22 54 41 42 4c 45 2e 2a 22  " or a "TABLE.*"
22d90 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
22da0 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 61  .        ** expa
22db0 6e 64 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  nded. */.       
22dc0 20 69 6e 74 20 74 61 62 6c 65 53 65 65 6e 20 3d   int tableSeen =
22dd0 20 30 3b 20 20 20 20 20 20 2f 2a 20 53 65 74 20   0;      /* Set 
22de0 74 6f 20 31 20 77 68 65 6e 20 54 41 42 4c 45 20  to 1 when TABLE 
22df0 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20  matches */.     
22e00 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20     char *zTName 
22e10 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 74 65  = 0;       /* te
22e20 78 74 20 6f 66 20 6e 61 6d 65 20 6f 66 20 54 41  xt of name of TA
22e30 42 4c 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  BLE */.        i
22e40 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
22e50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  T ){.          a
22e60 73 73 65 72 74 28 20 70 45 2d 3e 70 4c 65 66 74  ssert( pE->pLeft
22e70 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
22e80 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
22e90 73 50 72 6f 70 65 72 74 79 28 70 45 2d 3e 70 4c  sProperty(pE->pL
22ea0 65 66 74 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  eft, EP_IntValue
22eb0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) );.          z
22ec0 54 4e 61 6d 65 20 3d 20 70 45 2d 3e 70 4c 65 66  TName = pE->pLef
22ed0 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
22ee0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
22ef0 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54  or(i=0, pFrom=pT
22f00 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
22f10 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
22f20 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20  , pFrom++){.    
22f30 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
22f40 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b  b = pFrom->pTab;
22f50 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65 63  .          Selec
22f60 74 20 2a 70 53 75 62 20 3d 20 70 46 72 6f 6d 2d  t *pSub = pFrom-
22f70 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
22f80 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
22f90 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a 41 6c 69  me = pFrom->zAli
22fa0 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f  as;.          co
22fb0 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
22fc0 61 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  aName = 0;.     
22fd0 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
22fe0 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
22ff0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
23000 20 20 20 20 20 20 20 7a 54 61 62 4e 61 6d 65 20         zTabName 
23010 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
23020 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23030 20 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c       if( db->mal
23040 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
23050 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
23060 20 70 53 75 62 3d 3d 30 20 7c 7c 20 28 70 53 75   pSub==0 || (pSu
23070 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  b->selFlags & SF
23080 5f 4e 65 73 74 65 64 46 72 6f 6d 29 3d 3d 30 20  _NestedFrom)==0 
23090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
230a0 53 75 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Sub = 0;.       
230b0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
230c0 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
230d0 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  p(zTName, zTabNa
230e0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
230f0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
23100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
23110 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 20              iDb 
23120 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
23130 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
23140 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
23150 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
23160 6d 65 20 3d 20 69 44 62 3e 3d 30 20 3f 20 64 62  me = iDb>=0 ? db
23170 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
23180 20 3a 20 22 2a 22 3b 0a 20 20 20 20 20 20 20 20   : "*";.        
23190 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6f    }.          fo
231a0 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e  r(j=0; j<pTab->n
231b0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
231c0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61         char *zNa
231d0 6d 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  me = pTab->aCol[
231e0 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
231f0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
23200 6e 61 6d 65 3b 20 20 2f 2a 20 54 68 65 20 63 6f  name;  /* The co
23210 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61  mputed column na
23220 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  me */.          
23230 20 20 63 68 61 72 20 2a 7a 54 6f 46 72 65 65 3b    char *zToFree;
23240 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 65 64 20 73     /* Malloced s
23250 74 72 69 6e 67 20 74 68 61 74 20 6e 65 65 64 73  tring that needs
23260 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
23270 20 20 20 20 20 20 20 20 20 20 20 20 54 6f 6b 65              Toke
23280 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20  n sColname;  /* 
23290 43 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d 6e 20  Computed column 
232a0 6e 61 6d 65 20 61 73 20 61 20 74 6f 6b 65 6e 20  name as a token 
232b0 2a 2f 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  */..            
232c0 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 20 29 3b  assert( zName );
232d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
232e0 20 7a 54 4e 61 6d 65 20 26 26 20 70 53 75 62 0a   zTName && pSub.
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
23300 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
23310 4e 61 6d 65 28 70 53 75 62 2d 3e 70 45 4c 69 73  Name(pSub->pELis
23320 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 30  t->a[j].zSpan, 0
23330 2c 20 7a 54 4e 61 6d 65 2c 20 30 29 3d 3d 30 0a  , zTName, 0)==0.
23340 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
23360 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
23370 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
23380 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
23390 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 27 68   is marked as 'h
233a0 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e 74 6c  idden' (currentl
233b0 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65 0a  y only possible.
233c0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66              ** f
233d0 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  or virtual table
233e0 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63 6c 75  s), do not inclu
233f0 64 65 20 69 74 20 69 6e 20 74 68 65 20 65 78 70  de it in the exp
23400 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  anded.          
23410 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20    ** result-set 
23420 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20 20 20  list..          
23430 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
23440 20 69 66 28 20 49 73 48 69 64 64 65 6e 43 6f 6c   if( IsHiddenCol
23450 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  umn(&pTab->aCol[
23460 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j]) ){.         
23470 20 20 20 20 20 61 73 73 65 72 74 28 49 73 56 69       assert(IsVi
23480 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a 20 20  rtual(pTab));.  
23490 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
234a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
234b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
234c0 74 61 62 6c 65 53 65 65 6e 20 3d 20 31 3b 0a 0a  tableSeen = 1;..
234d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
234e0 69 3e 30 20 26 26 20 7a 54 4e 61 6d 65 3d 3d 30  i>0 && zTName==0
234f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23500 20 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 6a 6f    if( (pFrom->jo
23510 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55  intype & JT_NATU
23520 52 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  RAL)!=0.        
23530 20 20 20 20 20 20 20 20 26 26 20 74 61 62 6c 65          && table
23540 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70  AndColumnIndex(p
23550 54 61 62 4c 69 73 74 2c 20 69 2c 20 7a 4e 61 6d  TabList, i, zNam
23560 65 2c 20 30 2c 20 30 29 0a 20 20 20 20 20 20 20  e, 0, 0).       
23570 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
23580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
23590 61 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 2c 20  a NATURAL join, 
235a0 6f 6d 69 74 20 74 68 65 20 6a 6f 69 6e 20 63 6f  omit the join co
235b0 6c 75 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 0a  lumns from the .
235c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235d0 2a 2a 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  ** table to the 
235e0 72 69 67 68 74 20 6f 66 20 74 68 65 20 6a 6f 69  right of the joi
235f0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
23600 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
23630 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
23640 64 65 78 28 70 46 72 6f 6d 2d 3e 70 55 73 69 6e  dex(pFrom->pUsin
23650 67 2c 20 7a 4e 61 6d 65 29 3e 3d 30 20 29 7b 0a  g, zName)>=0 ){.
23660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23670 2f 2a 20 49 6e 20 61 20 6a 6f 69 6e 20 77 69 74  /* In a join wit
23680 68 20 61 20 55 53 49 4e 47 20 63 6c 61 75 73 65  h a USING clause
23690 2c 20 6f 6d 69 74 20 63 6f 6c 75 6d 6e 73 20 69  , omit columns i
236a0 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  n the.          
236b0 20 20 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 63        ** using c
236c0 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20 74  lause from the t
236d0 61 62 6c 65 20 6f 6e 20 74 68 65 20 72 69 67 68  able on the righ
236e0 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  t. */.          
236f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
23710 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23720 20 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74            pRight
23730 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
23740 62 2c 20 54 4b 5f 49 44 2c 20 7a 4e 61 6d 65 29  b, TK_ID, zName)
23750 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 43  ;.            zC
23760 6f 6c 6e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  olname = zName;.
23770 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46              zToF
23780 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ree = 0;.       
23790 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61 6d       if( longNam
237a0 65 73 20 7c 7c 20 70 54 61 62 4c 69 73 74 2d 3e  es || pTabList->
237b0 6e 53 72 63 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSrc>1 ){.      
237c0 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c          Expr *pL
237d0 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eft;.           
237e0 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69 74     pLeft = sqlit
237f0 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44  e3Expr(db, TK_ID
23800 2c 20 7a 54 61 62 4e 61 6d 65 29 3b 0a 20 20 20  , zTabName);.   
23810 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
23820 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
23830 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
23840 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30  pLeft, pRight, 0
23850 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
23860 20 69 66 28 20 7a 53 63 68 65 6d 61 4e 61 6d 65   if( zSchemaName
23870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23880 20 20 20 20 70 4c 65 66 74 20 3d 20 73 71 6c 69      pLeft = sqli
23890 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
238a0 44 2c 20 7a 53 63 68 65 6d 61 4e 61 6d 65 29 3b  D, zSchemaName);
238b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
238c0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
238d0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
238e0 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 45 78  _DOT, pLeft, pEx
238f0 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pr, 0);.        
23900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23910 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67 4e 61        if( longNa
23920 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  mes ){.         
23930 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20         zColname 
23940 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
23950 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 7a 54  (db, "%s.%s", zT
23960 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a  abName, zName);.
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23980 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c 6e 61  zToFree = zColna
23990 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
239a0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
239b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
239c0 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 52 69       pExpr = pRi
239d0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ght;.           
239e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
239f0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
23a00 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
23a10 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70 72 29  se, pNew, pExpr)
23a20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 43  ;.            sC
23a30 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f 6c 6e  olname.z = zColn
23a40 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
23a50 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20 73 71   sColname.n = sq
23a60 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
23a70 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
23a80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
23a90 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
23aa0 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f 6c 6e  se, pNew, &sColn
23ab0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
23ac0 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 26 26       if( pNew &&
23ad0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
23ae0 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d  SF_NestedFrom)!=
23af0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
23b00 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
23b10 73 74 5f 69 74 65 6d 20 2a 70 58 20 3d 20 26 70  st_item *pX = &p
23b20 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78  New->a[pNew->nEx
23b30 70 72 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  pr-1];.         
23b40 20 20 20 20 20 69 66 28 20 70 53 75 62 20 29 7b       if( pSub ){
23b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23b60 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
23b70 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
23b80 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61   pSub->pEList->a
23b90 5b 6a 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  [j].zSpan);.    
23ba0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
23bb0 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d  case( pX->zSpan=
23bc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
23bd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23be0 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 7a             pX->z
23bf0 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50  Span = sqlite3MP
23c00 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
23c10 2e 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .%s",.          
23c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c40 20 7a 53 63 68 65 6d 61 4e 61 6d 65 2c 20 7a 54   zSchemaName, zT
23c50 61 62 4e 61 6d 65 2c 20 7a 43 6f 6c 6e 61 6d 65  abName, zColname
23c60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
23c70 20 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d     testcase( pX-
23c80 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20  >zSpan==0 );.   
23c90 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23ca0 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 62             pX->b
23cb0 53 70 61 6e 49 73 54 61 62 20 3d 20 31 3b 0a 20  SpanIsTab = 1;. 
23cc0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23cd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23ce0 44 62 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72  DbFree(db, zToFr
23cf0 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
23d00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23d10 20 20 20 69 66 28 20 21 74 61 62 6c 65 53 65 65     if( !tableSee
23d20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
23d30 66 28 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20  f( zTName ){.   
23d40 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23d50 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
23d60 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a   "no such table:
23d70 20 25 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20   %s", zTName);. 
23d80 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
23d90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
23da0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
23db0 73 65 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73  se, "no tables s
23dc0 70 65 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20  pecified");.    
23dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23de0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
23df0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
23e00 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45  istDelete(db, pE
23e10 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45  List);.    p->pE
23e20 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  List = pNew;.  }
23e30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
23e40 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
23e50 70 45 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c  pEList && p->pEL
23e60 69 73 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  ist->nExpr>db->a
23e70 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
23e80 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
23e90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
23ea0 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
23eb0 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72  any columns in r
23ec0 65 73 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d  esult set");.  }
23ed0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
23ee0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
23ef0 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f  ../*.** No-op ro
23f00 75 74 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61  utine for the pa
23f10 72 73 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e  rse-tree walker.
23f20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
23f30 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
23f40 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
23f50 62 61 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73  back then expres
23f60 73 69 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72  sion trees.** ar
23f70 65 20 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74  e walked without
23f80 20 61 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69   any actions bei
23f90 6e 67 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68  ng taken at each
23fa0 20 6e 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62   node.  Presumab
23fb0 6c 79 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  ly,.** when this
23fc0 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
23fd0 20 66 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70   for Walker.xExp
23fe0 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a  rCallback then .
23ff0 2a 2a 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63  ** Walker.xSelec
24000 74 43 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74  tCallback is set
24010 20 74 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   to do something
24020 20 75 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72   useful for ever
24030 79 20 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69  y .** subquery i
24040 6e 20 74 68 65 20 70 61 72 73 65 72 20 74 72 65  n the parser tre
24050 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24060 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61   exprWalkNoop(Wa
24070 6c 6b 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45  lker *NotUsed, E
24080 78 70 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a  xpr *NotUsed2){.
24090 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
240a0 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
240b0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
240c0 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
240d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
240e0 74 69 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61  tine "expands" a
240f0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
24100 74 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  t and all of its
24110 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20   subqueries..** 
24120 46 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  For additional i
24130 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68  nformation on wh
24140 61 74 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22  at it means to "
24150 65 78 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54  expand" a SELECT
24160 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73  .** statement, s
24170 65 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f  ee the comment o
24180 6e 20 74 68 65 20 73 65 6c 65 63 74 45 78 70 61  n the selectExpa
24190 6e 64 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61  nd worker callba
241a0 63 6b 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ck above..**.** 
241b0 45 78 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45  Expanding a SELE
241c0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
241d0 74 68 65 20 66 69 72 73 74 20 73 74 65 70 20 69  the first step i
241e0 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a  n processing a.*
241f0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
24200 6e 74 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20  nt.  The SELECT 
24210 73 74 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62  statement must b
24220 65 20 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72  e expanded befor
24230 65 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75  e.** name resolu
24240 74 69 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65  tion is performe
24250 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74  d..**.** If anyt
24260 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
24270 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
24280 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
24290 6f 20 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65  o pParse..** The
242a0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
242b0 6e 20 63 61 6e 20 64 65 74 65 63 74 20 74 68 65  n can detect the
242c0 20 70 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b   problem by look
242d0 69 6e 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e  ing at pParse->n
242e0 45 72 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50  Err.** and/or pP
242f0 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
24300 46 61 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  Failed..*/.stati
24310 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65  c void sqlite3Se
24320 6c 65 63 74 45 78 70 61 6e 64 28 50 61 72 73 65  lectExpand(Parse
24330 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
24340 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61   *pSelect){.  Wa
24350 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74  lker w;.  memset
24360 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
24370 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
24380 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c 6b  lback = exprWalk
24390 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Noop;.  w.pParse
243a0 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 69 66 28   = pParse;.  if(
243b0 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70   pParse->hasComp
243c0 6f 75 6e 64 20 29 7b 0a 20 20 20 20 77 2e 78 53  ound ){.    w.xS
243d0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
243e0 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
243f0 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 3b  electToSubquery;
24400 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  .    sqlite3Walk
24410 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
24420 63 74 29 3b 0a 20 20 7d 0a 20 20 77 2e 78 53 65  ct);.  }.  w.xSe
24430 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73  lectCallback = s
24440 65 6c 65 63 74 45 78 70 61 6e 64 65 72 3b 0a 20  electExpander;. 
24450 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
24460 63 6b 32 20 3d 20 73 65 6c 65 63 74 50 6f 70 57  ck2 = selectPopW
24470 69 74 68 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  ith;.  sqlite3Wa
24480 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65  lkSelect(&w, pSe
24490 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  lect);.}...#ifnd
244a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
244b0 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68  UBQUERY./*.** Th
244c0 69 73 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78  is is a Walker.x
244d0 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63  SelectCallback c
244e0 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20  allback for the 
244f0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70  sqlite3SelectTyp
24500 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72  eInfo().** inter
24510 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  face..**.** For 
24520 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65  each FROM-clause
24530 20 73 75 62 71 75 65 72 79 2c 20 61 64 64 20 43   subquery, add C
24540 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20  olumn.zType and 
24550 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20  Column.zColl.** 
24560 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
24570 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
24580 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65 6e  re that represen
24590 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ts the result se
245a0 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62  t.** of that sub
245b0 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  query..**.** The
245c0 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
245d0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
245e0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
245f0 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
24600 2a 2a 20 62 79 20 73 65 6c 65 63 74 45 78 70 61  ** by selectExpa
24610 6e 64 65 72 28 29 20 62 75 74 20 74 68 65 20 74  nder() but the t
24620 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  ype and collatio
24630 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61  n information wa
24640 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20  s omitted.** at 
24650 74 68 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75  that point becau
24660 73 65 20 69 64 65 6e 74 69 66 69 65 72 73 20 68  se identifiers h
24670 61 64 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ad not yet been 
24680 72 65 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a  resolved.  This.
24690 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
246a0 6c 6c 65 64 20 61 66 74 65 72 20 69 64 65 6e 74  lled after ident
246b0 69 66 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e  ifier resolution
246c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
246d0 20 73 65 6c 65 63 74 41 64 64 53 75 62 71 75 65   selectAddSubque
246e0 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65  ryTypeInfo(Walke
246f0 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
24700 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
24710 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 69  *pParse;.  int i
24720 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  ;.  SrcList *pTa
24730 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
24740 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46  SrcList_item *pF
24750 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rom;..  assert( 
24760 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
24770 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69  _Resolved );.  i
24780 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  f( (p->selFlags 
24790 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e 66 6f  & SF_HasTypeInfo
247a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73  )==0 ){.    p->s
247b0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61  elFlags |= SF_Ha
247c0 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70  sTypeInfo;.    p
247d0 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
247e0 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70 54 61  >pParse;.    pTa
247f0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
24800 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  .    for(i=0, pF
24810 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
24820 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
24830 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
24840 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  {.      Table *p
24850 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61  Tab = pFrom->pTa
24860 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  b;.      if( ALW
24870 41 59 53 28 70 54 61 62 21 3d 30 29 20 26 26 20  AYS(pTab!=0) && 
24880 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
24890 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 21  & TF_Ephemeral)!
248a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
248b0 20 41 20 73 75 62 2d 71 75 65 72 79 20 69 6e 20   A sub-query in 
248c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
248d0 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20  of a SELECT */. 
248e0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
248f0 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65  Sel = pFrom->pSe
24900 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 69 66  lect;.        if
24910 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20  ( pSel ){.      
24920 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
24930 3e 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d  >pPrior ) pSel =
24940 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20   pSel->pPrior;. 
24950 20 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 41           selectA
24960 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
24970 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
24980 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a 20 20   pTab, pSel);.  
24990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
249a0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
249b0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
249c0 72 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74  routine adds dat
249d0 61 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74  atype and collat
249e0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66  ing sequence inf
249f0 6f 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74  ormation to.** t
24a00 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
24a10 72 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d  res of all FROM-
24a20 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65  clause subquerie
24a30 73 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54  s in a.** SELECT
24a40 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
24a50 2a 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69  * Use this routi
24a60 6e 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65  ne after name re
24a70 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  solution..*/.sta
24a80 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33  tic void sqlite3
24a90 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66  SelectAddTypeInf
24aa0 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  o(Parse *pParse,
24ab0 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
24ac0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
24ad0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
24ae0 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65    Walker w;.  me
24af0 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
24b00 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c  of(w));.  w.xSel
24b10 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 73  ectCallback2 = s
24b20 65 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79  electAddSubquery
24b30 54 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45  TypeInfo;.  w.xE
24b40 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78  xprCallback = ex
24b50 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e  prWalkNoop;.  w.
24b60 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
24b70 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
24b80 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74  lect(&w, pSelect
24b90 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
24ba0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24bb0 20 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43   sets up a SELEC
24bc0 54 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  T statement for 
24bd0 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65  processing.  The
24be0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  .** following is
24bf0 20 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a   accomplished:.*
24c00 2a 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45  *.**     *  VDBE
24c10 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   Cursor numbers 
24c20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  are assigned to 
24c30 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20  all FROM-clause 
24c40 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20  terms..**     * 
24c50 20 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   Ephemeral Table
24c60 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65   objects are cre
24c70 61 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f  ated for all FRO
24c80 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
24c90 69 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f  ies..**     *  O
24ca0 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
24cb0 73 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20  ses are shifted 
24cc0 69 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65  into WHERE state
24cd0 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20  ments.**     *  
24ce0 57 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e  Wildcards "*" an
24cf0 64 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72  d "TABLE.*" in r
24d00 65 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65  esult sets are e
24d10 78 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20  xpanded..**     
24d20 2a 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69  *  Identifiers i
24d30 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65  n expression are
24d40 20 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c   matched to tabl
24d50 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
24d60 6f 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75  outine acts recu
24d70 72 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73  rsively on all s
24d80 75 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e  ubqueries within
24d90 20 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a   the SELECT..*/.
24da0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
24db0 63 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20  ctPrep(.  Parse 
24dc0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
24dd0 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
24de0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
24df0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
24e00 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
24e10 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
24e20 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
24e30 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
24e40 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
24e50 65 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65  ext for containe
24e60 72 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  r */.){.  sqlite
24e70 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56  3 *db;.  if( NEV
24e80 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
24e90 6e 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  n;.  db = pParse
24ea0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
24eb0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
24ec0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
24ed0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61  selFlags & SF_Ha
24ee0 73 54 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75  sTypeInfo ) retu
24ef0 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  rn;.  sqlite3Sel
24f00 65 63 74 45 78 70 61 6e 64 28 70 50 61 72 73 65  ectExpand(pParse
24f10 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , p);.  if( pPar
24f20 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
24f30 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
24f40 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
24f50 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
24f60 65 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f  es(pParse, p, pO
24f70 75 74 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70  uterNC);.  if( p
24f80 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
24f90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24fa0 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69  ) return;.  sqli
24fb0 74 65 33 53 65 6c 65 63 74 41 64 64 54 79 70 65  te3SelectAddType
24fc0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b  Info(pParse, p);
24fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
24fe0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63  the aggregate ac
24ff0 63 75 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  cumulator..**.**
25000 20 54 68 65 20 61 67 67 72 65 67 61 74 65 20 61   The aggregate a
25010 63 63 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20  ccumulator is a 
25020 73 65 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65  set of memory ce
25030 6c 6c 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a  lls that hold.**
25040 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
25050 73 75 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63  sults while calc
25060 75 6c 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65  ulating an aggre
25070 67 61 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72  gate.  This.** r
25080 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
25090 20 63 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65   code that store
250a0 73 20 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f  s NULLs in all o
250b0 66 20 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a  f those memory.*
250c0 2a 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74  * cells..*/.stat
250d0 69 63 20 76 6f 69 64 20 72 65 73 65 74 41 63 63  ic void resetAcc
250e0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
250f0 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
25100 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
25110 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
25120 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
25130 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
25140 5f 66 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20  _func *pFunc;.  
25150 69 6e 74 20 6e 52 65 67 20 3d 20 70 41 67 67 49  int nReg = pAggI
25160 6e 66 6f 2d 3e 6e 46 75 6e 63 20 2b 20 70 41 67  nfo->nFunc + pAg
25170 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  gInfo->nColumn;.
25180 20 20 69 66 28 20 6e 52 65 67 3d 3d 30 20 29 20    if( nReg==0 ) 
25190 72 65 74 75 72 6e 3b 0a 23 69 66 64 65 66 20 53  return;.#ifdef S
251a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
251b0 20 56 65 72 69 66 79 20 74 68 61 74 20 61 6c 6c   Verify that all
251c0 20 41 67 67 49 6e 66 6f 20 72 65 67 69 73 74 65   AggInfo registe
251d0 72 73 20 61 72 65 20 77 69 74 68 69 6e 20 74 68  rs are within th
251e0 65 20 72 61 6e 67 65 20 73 70 65 63 69 66 69 65  e range specifie
251f0 64 20 62 79 0a 20 20 2a 2a 20 41 67 67 49 6e 66  d by.  ** AggInf
25200 6f 2e 6d 6e 52 65 67 2e 2e 41 67 67 49 6e 66 6f  o.mnReg..AggInfo
25210 2e 6d 78 52 65 67 20 2a 2f 0a 20 20 61 73 73 65  .mxReg */.  asse
25220 72 74 28 20 6e 52 65 67 3d 3d 70 41 67 67 49 6e  rt( nReg==pAggIn
25230 66 6f 2d 3e 6d 78 52 65 67 2d 70 41 67 67 49 6e  fo->mxReg-pAggIn
25240 66 6f 2d 3e 6d 6e 52 65 67 2b 31 20 29 3b 0a 20  fo->mnReg+1 );. 
25250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
25260 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  Info->nColumn; i
25270 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
25280 20 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b   pAggInfo->aCol[
25290 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66  i].iMem>=pAggInf
252a0 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20  o->mnReg.       
252b0 20 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61    && pAggInfo->a
252c0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  Col[i].iMem<=pAg
252d0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
252e0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
252f0 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  <pAggInfo->nFunc
25300 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
25310 72 74 28 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46  rt( pAggInfo->aF
25320 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3e 3d 70 41 67  unc[i].iMem>=pAg
25330 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 0a 20 20 20  gInfo->mnReg.   
25340 20 20 20 20 20 20 26 26 20 70 41 67 67 49 6e 66        && pAggInf
25350 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e 69 4d 65 6d  o->aFunc[i].iMem
25360 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65  <=pAggInfo->mxRe
25370 67 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  g );.  }.#endif.
25380 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25390 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
253a0 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  0, pAggInfo->mnR
253b0 65 67 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 6d 78  eg, pAggInfo->mx
253c0 52 65 67 29 3b 0a 20 20 66 6f 72 28 70 46 75 6e  Reg);.  for(pFun
253d0 63 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  c=pAggInfo->aFun
253e0 63 2c 20 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  c, i=0; i<pAggIn
253f0 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20  fo->nFunc; i++, 
25400 70 46 75 6e 63 2b 2b 29 7b 0a 20 20 20 20 69 66  pFunc++){.    if
25410 28 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e  ( pFunc->iDistin
25420 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  ct>=0 ){.      E
25430 78 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d  xpr *pE = pFunc-
25440 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
25450 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
25460 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49  operty(pE, EP_xI
25470 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
25480 20 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73    if( pE->x.pLis
25490 74 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c  t==0 || pE->x.pL
254a0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  ist->nExpr!=1 ){
254b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
254c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
254d0 20 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65   "DISTINCT aggre
254e0 67 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20  gates must have 
254f0 65 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20  exactly one ".  
25500 20 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65           "argume
25510 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46  nt");.        pF
25520 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  unc->iDistinct =
25530 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
25540 7b 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  {.        KeyInf
25550 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65  o *pKeyInfo = ke
25560 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
25570 74 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e  t(pParse, pE->x.
25580 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20  pList, 0);.     
25590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
255a0 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45  dOp4(v, OP_OpenE
255b0 70 68 65 6d 65 72 61 6c 2c 20 70 46 75 6e 63 2d  phemeral, pFunc-
255c0 3e 69 44 69 73 74 69 6e 63 74 2c 20 30 2c 20 30  >iDistinct, 0, 0
255d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
255e0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
255f0 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f  r*)pKeyInfo, P4_
25600 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
25610 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
25620 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20  *.** Invoke the 
25630 4f 50 5f 41 67 67 46 69 6e 61 6c 69 7a 65 20 6f  OP_AggFinalize o
25640 70 63 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  pcode for every 
25650 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
25660 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 41 67 67  on.** in the Agg
25670 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
25680 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
25690 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
256a0 6f 6e 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ons(Parse *pPars
256b0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
256c0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
256d0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
256e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
256f0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
25700 20 2a 70 46 3b 0a 20 20 66 6f 72 28 69 3d 30 2c   *pF;.  for(i=0,
25710 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 46   pF=pAggInfo->aF
25720 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  unc; i<pAggInfo-
25730 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b  >nFunc; i++, pF+
25740 2b 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  +){.    ExprList
25750 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
25760 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
25770 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
25780 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
25790 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
257a0 63 74 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ct) );.    sqlit
257b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
257c0 4f 50 5f 41 67 67 46 69 6e 61 6c 2c 20 70 46 2d  OP_AggFinal, pF-
257d0 3e 69 4d 65 6d 2c 20 70 4c 69 73 74 20 3f 20 70  >iMem, pList ? p
257e0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c  List->nExpr : 0,
257f0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
25800 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
25810 29 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46  )pF->pFunc, P4_F
25820 55 4e 43 44 45 46 29 3b 0a 20 20 7d 0a 7d 0a 0a  UNCDEF);.  }.}..
25830 2f 2a 0a 2a 2a 20 55 70 64 61 74 65 20 74 68 65  /*.** Update the
25840 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 6d 65 6d   accumulator mem
25850 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 6e  ory cells for an
25860 20 61 67 67 72 65 67 61 74 65 20 62 61 73 65 64   aggregate based
25870 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 75 72 72 65   on.** the curre
25880 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
25890 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
258a0 69 64 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c  id updateAccumul
258b0 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72  ator(Parse *pPar
258c0 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67  se, AggInfo *pAg
258d0 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  gInfo){.  Vdbe *
258e0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
258f0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
25900 74 20 72 65 67 48 69 74 20 3d 20 30 3b 0a 20 20  t regHit = 0;.  
25910 69 6e 74 20 61 64 64 72 48 69 74 54 65 73 74 20  int addrHitTest 
25920 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 41 67  = 0;.  struct Ag
25930 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a  gInfo_func *pF;.
25940 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
25950 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20 20 70 41 67  _col *pC;..  pAg
25960 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
25970 65 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30  e = 1;.  for(i=0
25980 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pF=pAggInfo->a
25990 46 75 6e 63 3b 20 69 3c 70 41 67 67 49 6e 66 6f  Func; i<pAggInfo
259a0 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46  ->nFunc; i++, pF
259b0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 72  ++){.    int nAr
259c0 67 3b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 4e  g;.    int addrN
259d0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ext = 0;.    int
259e0 20 72 65 67 41 67 67 3b 0a 20 20 20 20 45 78 70   regAgg;.    Exp
259f0 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
25a00 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  F->pExpr->x.pLis
25a10 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  t;.    assert( !
25a20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
25a30 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  pF->pExpr, EP_xI
25a40 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
25a50 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
25a60 20 20 20 6e 41 72 67 20 3d 20 70 4c 69 73 74 2d     nArg = pList-
25a70 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 72 65  >nExpr;.      re
25a80 67 41 67 67 20 3d 20 73 71 6c 69 74 65 33 47 65  gAgg = sqlite3Ge
25a90 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
25aa0 65 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 20 20  e, nArg);.      
25ab0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
25ac0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
25ad0 70 4c 69 73 74 2c 20 72 65 67 41 67 67 2c 20 53  pList, regAgg, S
25ae0 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 29 3b  QLITE_ECEL_DUP);
25af0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25b00 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 20 20    nArg = 0;.    
25b10 20 20 72 65 67 41 67 67 20 3d 20 30 3b 0a 20 20    regAgg = 0;.  
25b20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
25b30 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29 7b 0a  iDistinct>=0 ){.
25b40 20 20 20 20 20 20 61 64 64 72 4e 65 78 74 20 3d        addrNext =
25b50 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
25b60 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
25b70 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20  assert( nArg==1 
25b80 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 44 69 73  );.      codeDis
25b90 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20 70 46  tinct(pParse, pF
25ba0 2d 3e 69 44 69 73 74 69 6e 63 74 2c 20 61 64 64  ->iDistinct, add
25bb0 72 4e 65 78 74 2c 20 31 2c 20 72 65 67 41 67 67  rNext, 1, regAgg
25bc0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
25bd0 20 70 46 2d 3e 70 46 75 6e 63 2d 3e 66 75 6e 63   pF->pFunc->func
25be0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
25bf0 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20 29 7b 0a  UNC_NEEDCOLL ){.
25c00 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
25c10 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  Coll = 0;.      
25c20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
25c30 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
25c40 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
25c50 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
25c60 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74 21 3d 30   );  /* pList!=0
25c70 20 69 66 20 70 46 2d 3e 70 46 75 6e 63 20 68 61   if pF->pFunc ha
25c80 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f 0a 20 20  s NEEDCOLL */.  
25c90 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 49 74      for(j=0, pIt
25ca0 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 21 70 43  em=pList->a; !pC
25cb0 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67 3b 20 6a  oll && j<nArg; j
25cc0 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
25cd0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
25ce0 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
25cf0 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
25d00 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
25d10 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
25d20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c   ){.        pCol
25d30 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
25d40 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
25d50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 67   }.      if( reg
25d60 48 69 74 3d 3d 30 20 26 26 20 70 41 67 67 49 6e  Hit==0 && pAggIn
25d70 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  fo->nAccumulator
25d80 20 29 20 72 65 67 48 69 74 20 3d 20 2b 2b 70 50   ) regHit = ++pP
25d90 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
25da0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25db0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op4(v, OP_CollSe
25dc0 71 2c 20 72 65 67 48 69 74 2c 20 30 2c 20 30 2c  q, regHit, 0, 0,
25dd0 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20   (char *)pColl, 
25de0 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20  P4_COLLSEQ);.   
25df0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64   }.    sqlite3Vd
25e00 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
25e10 67 67 53 74 65 70 2c 20 30 2c 20 72 65 67 41 67  ggStep, 0, regAg
25e20 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a 20 20 20  g, pF->iMem,.   
25e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e40 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46     (void*)pF->pF
25e50 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29  unc, P4_FUNCDEF)
25e60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
25e70 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
25e80 29 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69  )nArg);.    sqli
25e90 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
25ea0 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
25eb0 65 2c 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29  e, regAgg, nArg)
25ec0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
25ed0 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
25ee0 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
25ef0 72 67 29 3b 0a 20 20 20 20 69 66 28 20 61 64 64  rg);.    if( add
25f00 72 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 73  rNext ){.      s
25f10 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
25f20 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 4e 65  eLabel(v, addrNe
25f30 78 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xt);.      sqlit
25f40 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72  e3ExprCacheClear
25f50 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a  (pParse);.    }.
25f60 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
25f70 20 70 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 20   populating the 
25f80 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67 69  accumulator regi
25f90 73 74 65 72 73 2c 20 63 6c 65 61 72 20 74 68 65  sters, clear the
25fa0 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 20   column cache.. 
25fb0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
25fc0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 72 65 71  f any of the req
25fd0 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 76 61 6c  uired column val
25fe0 75 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ues are already 
25ff0 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a 20 69 6e  present .  ** in
26000 20 72 65 67 69 73 74 65 72 73 2c 20 73 71 6c 69   registers, sqli
26010 74 65 33 45 78 70 72 43 6f 64 65 28 29 20 6d 61  te3ExprCode() ma
26020 79 20 75 73 65 20 4f 50 5f 53 43 6f 70 79 20 74  y use OP_SCopy t
26030 6f 20 63 6f 70 79 20 74 68 65 20 76 61 6c 75 65  o copy the value
26040 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e 69 4d 65  .  ** to pC->iMe
26050 6d 2e 20 42 75 74 20 62 79 20 74 68 65 20 74 69  m. But by the ti
26060 6d 65 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  me the value is 
26070 75 73 65 64 2c 20 74 68 65 20 6f 72 69 67 69 6e  used, the origin
26080 61 6c 20 72 65 67 69 73 74 65 72 0a 20 20 2a 2a  al register.  **
26090 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
260a0 73 65 64 2c 20 69 6e 76 61 6c 69 64 61 74 69 6e  sed, invalidatin
260b0 67 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  g the underlying
260c0 20 62 75 66 66 65 72 20 68 6f 6c 64 69 6e 67 20   buffer holding 
260d0 74 68 65 0a 20 20 2a 2a 20 74 65 78 74 20 6f 72  the.  ** text or
260e0 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20 53 65 65   blob value. See
260f0 20 74 69 63 6b 65 74 20 5b 38 38 33 30 33 34 64   ticket [883034d
26100 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  cb5]..  **.  ** 
26110 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74 69 6f 6e  Another solution
26120 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 63 68 61   would be to cha
26130 6e 67 65 20 74 68 65 20 4f 50 5f 53 43 6f 70 79  nge the OP_SCopy
26140 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 63 61   used to copy ca
26150 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c 75 65 73  ched.  ** values
26160 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70 79 2e 0a   to an OP_Copy..
26170 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 48 69    */.  if( regHi
26180 74 20 29 7b 0a 20 20 20 20 61 64 64 72 48 69 74  t ){.    addrHit
26190 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Test = sqlite3Vd
261a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
261b0 66 2c 20 72 65 67 48 69 74 29 3b 0a 20 20 7d 0a  f, regHit);.  }.
261c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
261d0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
261e0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 3d 70  .  for(i=0, pC=p
261f0 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69  AggInfo->aCol; i
26200 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75  <pAggInfo->nAccu
26210 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c 20 70 43  mulator; i++, pC
26220 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
26230 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
26240 20 70 43 2d 3e 70 45 78 70 72 2c 20 70 43 2d 3e   pC->pExpr, pC->
26250 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 70 41 67  iMem);.  }.  pAg
26260 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
26270 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
26280 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
26290 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 61 64  Parse);.  if( ad
262a0 64 72 48 69 74 54 65 73 74 20 29 7b 0a 20 20 20  drHitTest ){.   
262b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
262c0 48 65 72 65 28 76 2c 20 61 64 64 72 48 69 74 54  Here(v, addrHitT
262d0 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  est);.  }.}../*.
262e0 2a 2a 20 41 64 64 20 61 20 73 69 6e 67 6c 65 20  ** Add a single 
262f0 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
26300 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 56 44  uction to the VD
26310 42 45 20 74 6f 20 65 78 70 6c 61 69 6e 20 61 20  BE to explain a 
26320 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28  simple.** count(
26330 2a 29 20 71 75 65 72 79 20 28 22 53 45 4c 45 43  *) query ("SELEC
26340 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
26350 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64  pTab")..*/.#ifnd
26360 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
26370 58 50 4c 41 49 4e 0a 73 74 61 74 69 63 20 76 6f  XPLAIN.static vo
26380 69 64 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65  id explainSimple
26390 43 6f 75 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  Count(.  Parse *
263a0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
263b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
263c0 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
263d0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
263f0 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75  * Table being qu
26400 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78  eried */.  Index
26410 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20   *pIdx          
26420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26430 64 65 78 20 75 73 65 64 20 74 6f 20 6f 70 74 69  dex used to opti
26440 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72 20 4e 55  mize scan, or NU
26450 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  LL */.){.  if( p
26460 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
26470 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
26480 45 71 70 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Eqp = sqlite3MPr
26490 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
264a0 20 22 53 43 41 4e 20 54 41 42 4c 45 20 25 73 25   "SCAN TABLE %s%
264b0 73 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54  s%s",.        pT
264c0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  ab->zName, .    
264d0 20 20 20 20 70 49 64 78 20 3f 20 22 20 55 53 49      pIdx ? " USI
264e0 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
264f0 58 20 22 20 3a 20 22 22 2c 0a 20 20 20 20 20 20  X " : "",.      
26500 20 20 70 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a    pIdx ? pIdx->z
26510 4e 61 6d 65 20 3a 20 22 22 0a 20 20 20 20 29 3b  Name : "".    );
26520 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
26530 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20 20 20  AddOp4(.        
26540 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f  pParse->pVdbe, O
26550 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73  P_Explain, pPars
26560 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c  e->iSelectId, 0,
26570 20 30 2c 20 7a 45 71 70 2c 20 50 34 5f 44 59 4e   0, zEqp, P4_DYN
26580 41 4d 49 43 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  AMIC.    );.  }.
26590 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
265a0 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f   explainSimpleCo
265b0 75 6e 74 28 61 2c 62 2c 63 29 0a 23 65 6e 64 69  unt(a,b,c).#endi
265c0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
265d0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  e code for the S
265e0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
265f0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 70 20 61  given in the p a
26600 72 67 75 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a  rgument.  .**.**
26610 20 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65   The results are
26620 20 72 65 74 75 72 6e 65 64 20 61 63 63 6f 72 64   returned accord
26630 69 6e 67 20 74 6f 20 74 68 65 20 53 65 6c 65 63  ing to the Selec
26640 74 44 65 73 74 20 73 74 72 75 63 74 75 72 65 2e  tDest structure.
26650 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  .** See comments
26660 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
26670 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 66 6f  for further info
26680 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rmation..**.** T
26690 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
266a0 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
266b0 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
266c0 79 20 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20  y errors are.** 
266d0 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65  encountered, the
266e0 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
266f0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
26700 73 20 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61  s left in.** pPa
26710 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
26720 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
26730 20 64 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74   does NOT free t
26740 68 65 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  he Select struct
26750 75 72 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20  ure passed in.  
26760 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66  The.** calling f
26770 75 6e 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  unction needs to
26780 20 64 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74   do that..*/.int
26790 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a   sqlite3Select(.
267a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
267b0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
267c0 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
267d0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
267e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
267f0 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
26800 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
26810 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
26820 2a 70 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57  *pDest      /* W
26830 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
26840 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  he query results
26850 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
26860 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
26870 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
26880 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20   */.  WhereInfo 
26890 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20  *pWInfo;     /* 
268a0 52 65 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69  Return from sqli
268b0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
268c0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
268d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
268e0 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
268f0 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ne under constru
26900 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
26910 73 41 67 67 3b 20 20 20 20 20 20 20 20 20 20 20  sAgg;           
26920 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65    /* True for se
26930 6c 65 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20  lect lists like 
26940 22 63 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20  "count(*)" */.  
26950 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
26960 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
26970 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74  f columns to ext
26980 72 61 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69  ract. */.  SrcLi
26990 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20  st *pTabList;   
269a0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
269b0 6c 65 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72  les to select fr
269c0 6f 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  om */.  Expr *pW
269d0 68 65 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f  here;          /
269e0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
269f0 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
26a00 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
26a10 70 4f 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20  pOrderBy;    /* 
26a20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
26a30 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
26a40 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
26a50 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a  *pGroupBy;    /*
26a60 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
26a70 61 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  ause.  May be NU
26a80 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48  LL */.  Expr *pH
26a90 61 76 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f  aving;         /
26aa0 2a 20 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61  * The HAVING cla
26ab0 75 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  use.  May be NUL
26ac0 4c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  L */.  int rc = 
26ad0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
26ae0 20 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   Value to return
26af0 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
26b00 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ion */.  int add
26b10 72 53 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20  rSortIndex;     
26b20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e  /* Address of an
26b30 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
26b40 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  l instruction */
26b50 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78 20 73  .  DistinctCtx s
26b60 44 69 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66  Distinct; /* Inf
26b70 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65  o on how to code
26b80 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
26b90 79 77 6f 72 64 20 2a 2f 0a 20 20 41 67 67 49 6e  yword */.  AggIn
26ba0 66 6f 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20  fo sAggInfo;    
26bb0 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
26bc0 20 75 73 65 64 20 62 79 20 61 67 67 72 65 67 61   used by aggrega
26bd0 74 65 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20  te queries */.  
26be0 69 6e 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20  int iEnd;       
26bf0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
26c00 73 20 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20  s of the end of 
26c10 74 68 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73  the query */.  s
26c20 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
26c30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
26c40 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
26c50 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
26c60 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
26c70 0a 20 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53  .  int iRestoreS
26c80 65 6c 65 63 74 49 64 20 3d 20 70 50 61 72 73 65  electId = pParse
26c90 2d 3e 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70  ->iSelectId;.  p
26ca0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
26cb0 20 3d 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74   = pParse->iNext
26cc0 53 65 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64  SelectId++;.#end
26cd0 69 66 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  if..  db = pPars
26ce0 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d  e->db;.  if( p==
26cf0 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
26d00 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
26d10 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74  >nErr ){.    ret
26d20 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
26d30 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
26d40 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
26d50 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
26d60 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
26d70 6d 65 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f  memset(&sAggInfo
26d80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67  , 0, sizeof(sAgg
26d90 49 6e 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49  Info));..  if( I
26da0 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28  gnorableOrderby(
26db0 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73  pDest) ){.    as
26dc0 73 65 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73  sert(pDest->eDes
26dd0 74 3d 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c  t==SRT_Exists ||
26de0 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
26df0 52 54 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20  RT_Union || .   
26e00 20 20 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65          pDest->e
26e10 44 65 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74  Dest==SRT_Except
26e20 20 7c 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74   || pDest->eDest
26e30 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a  ==SRT_Discard);.
26e40 20 20 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20      /* If ORDER 
26e50 42 59 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66  BY makes no diff
26e60 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75  erence in the ou
26e70 74 70 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65  tput then neithe
26e80 72 20 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49  r does.    ** DI
26e90 53 54 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e  STINCT so it can
26ea0 20 62 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e   be removed too.
26eb0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
26ec0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
26ed0 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  , p->pOrderBy);.
26ee0 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20      p->pOrderBy 
26ef0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  = 0;.    p->selF
26f00 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74  lags &= ~SF_Dist
26f10 69 6e 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  inct;.  }.  sqli
26f20 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
26f30 61 72 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70  arse, p, 0);.  p
26f40 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
26f50 64 65 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73  derBy;.  pTabLis
26f60 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70  t = p->pSrc;.  p
26f70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
26f80 74 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  t;.  if( pParse-
26f90 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
26fa0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
26fb0 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
26fc0 3b 0a 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20  ;.  }.  isAgg = 
26fd0 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
26fe0 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b  F_Aggregate)!=0;
26ff0 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
27000 74 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65  t!=0 );..  /* Be
27010 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63  gin generating c
27020 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  ode..  */.  v = 
27030 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
27040 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
27050 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
27060 5f 65 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  _end;..  /* If w
27070 72 69 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79  riting to memory
27080 20 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61   or generating a
27090 20 73 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61   set.  ** only a
270a0 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d   single column m
270b0 61 79 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  ay be output..  
270c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
270d0 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
270e0 20 20 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75    if( checkForMu
270f0 6c 74 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45  ltiColumnSelectE
27100 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65  rror(pParse, pDe
27110 73 74 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  st, pEList->nExp
27120 72 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  r) ){.    goto s
27130 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23  elect_end;.  }.#
27140 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
27150 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c  rate code for al
27160 6c 20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e  l sub-queries in
27170 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
27180 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
27190 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
271a0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
271b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
271c0 5f 56 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30  _VIEW).  for(i=0
271d0 3b 20 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20  ; !p->pPrior && 
271e0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
271f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
27200 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
27210 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  *pItem = &pTabLi
27220 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65  st->a[i];.    Se
27230 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
27240 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
27250 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  = pItem->pSelect
27260 3b 0a 20 20 20 20 69 6e 74 20 69 73 41 67 67 53  ;.    int isAggS
27270 75 62 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75  ub;..    if( pSu
27280 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  b==0 ) continue;
27290 0a 0a 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d  ..    /* Sometim
272a0 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20  es the code for 
272b0 61 20 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20  a subquery will 
272c0 62 65 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72  be generated mor
272d0 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e  e than.    ** on
272e0 63 65 2c 20 69 66 20 74 68 65 20 73 75 62 71 75  ce, if the subqu
272f0 65 72 79 20 69 73 20 70 61 72 74 20 6f 66 20 74  ery is part of t
27300 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
27310 69 6e 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a  in a LEFT JOIN,.
27320 20 20 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70      ** for examp
27330 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
27340 65 2c 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65  e, do not regene
27350 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
27360 20 6d 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a   manifest.    **
27370 20 61 20 76 69 65 77 20 6f 72 20 74 68 65 20 63   a view or the c
27380 6f 2d 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70  o-routine to imp
27390 6c 65 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20  lement a view.  
273a0 54 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  The first instan
273b0 63 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66  ce.    ** is suf
273c0 66 69 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20  ficient, though 
273d0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
273e0 6f 20 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76  o manifest the v
273f0 69 65 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20  iew does need.  
27400 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b    ** to be invok
27410 65 64 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20  ed again. */.   
27420 20 69 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72   if( pItem->addr
27430 46 69 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20  FillSub ){.     
27440 20 69 66 28 20 70 49 74 65 6d 2d 3e 76 69 61 43   if( pItem->viaC
27450 6f 72 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20  oroutine==0 ){. 
27460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
27470 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
27480 6f 73 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67  osub, pItem->reg
27490 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61  Return, pItem->a
274a0 64 64 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20  ddrFillSub);.   
274b0 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69     }.      conti
274c0 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
274d0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72  /* Increment Par
274e0 73 65 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68  se.nHeight by th
274f0 65 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 20  e height of the 
27500 6c 61 72 67 65 73 74 20 65 78 70 72 65 73 73 69  largest expressi
27510 6f 6e 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72  on.    ** tree r
27520 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 74 68  eferred to by th
27530 69 73 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73  is, the parent s
27540 65 6c 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64  elect. The child
27550 20 73 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d   select.    ** m
27560 61 79 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65  ay contain expre
27570 73 73 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61  ssion trees of a
27580 74 20 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53  t most.    ** (S
27590 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
275a0 45 50 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67  EPTH-Parse.nHeig
275b0 68 74 29 20 68 65 69 67 68 74 2e 20 54 68 69 73  ht) height. This
275c0 20 69 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a   is a bit.    **
275d0 20 6d 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69   more conservati
275e0 76 65 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72  ve than necessar
275f0 79 2c 20 62 75 74 20 6d 75 63 68 20 65 61 73 69  y, but much easi
27600 65 72 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e  er than enforcin
27610 67 0a 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63  g.    ** an exac
27620 74 20 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a  t limit..    */.
27630 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
27640 67 68 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65  ght += sqlite3Se
27650 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70  lectExprHeight(p
27660 29 3b 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62  );..    isAggSub
27670 20 3d 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61   = (pSub->selFla
27680 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
27690 65 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66  e)!=0;.    if( f
276a0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 70  lattenSubquery(p
276b0 50 61 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41  Parse, p, i, isA
276c0 67 67 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b  gg, isAggSub) ){
276d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
276e0 75 62 71 75 65 72 79 20 63 61 6e 20 62 65 20 61  ubquery can be a
276f0 62 73 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73  bsorbed into its
27700 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20   parent. */.    
27710 20 20 69 66 28 20 69 73 41 67 67 53 75 62 20 29    if( isAggSub )
27720 7b 0a 20 20 20 20 20 20 20 20 69 73 41 67 67 20  {.        isAgg 
27730 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
27740 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
27750 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20  ggregate;.      
27760 7d 0a 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a  }.      i = -1;.
27770 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
27780 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a  abList->nSrc==1.
27790 20 20 20 20 20 20 20 20 20 20 20 26 26 20 4f 70             && Op
277a0 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65  timizationEnable
277b0 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62  d(db, SQLITE_Sub
277c0 71 43 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20  qCoroutine).    
277d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c  ){.      /* Impl
277e0 65 6d 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69  ement a co-routi
277f0 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74  ne that will ret
27800 75 72 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  urn a single row
27810 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20   of the result. 
27820 20 20 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65       ** set on e
27830 61 63 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a  ach invocation..
27840 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
27850 6e 74 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c  nt addrTop = sql
27860 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
27870 64 64 72 28 76 29 2b 31 3b 0a 20 20 20 20 20 20  ddr(v)+1;.      
27880 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
27890 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
278a0 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
278b0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
278c0 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
278d0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
278e0 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20  , 0, addrTop);. 
278f0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
27900 28 28 76 2c 20 22 25 73 22 2c 20 70 49 74 65 6d  ((v, "%s", pItem
27910 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
27920 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64  .      pItem->ad
27930 64 72 46 69 6c 6c 53 75 62 20 3d 20 61 64 64 72  drFillSub = addr
27940 54 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Top;.      sqlit
27950 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
27960 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f  (&dest, SRT_Coro
27970 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e 72 65  utine, pItem->re
27980 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
27990 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
279a0 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
279b0 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
279c0 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
279d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
279e0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
279f0 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
27a00 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
27a10 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
27a20 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  )pSub->nSelectRo
27a30 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  w;.      pItem->
27a40 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  viaCoroutine = 1
27a50 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72  ;.      pItem->r
27a60 65 67 52 65 73 75 6c 74 20 3d 20 64 65 73 74 2e  egResult = dest.
27a70 69 53 64 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  iSdst;.      sql
27a80 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
27a90 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
27aa0 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
27ab0 75 72 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  urn);.      sqli
27ac0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
27ad0 76 2c 20 61 64 64 72 54 6f 70 2d 31 29 3b 0a 20  v, addrTop-1);. 
27ae0 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61       sqlite3Clea
27af0 72 54 65 6d 70 52 65 67 43 61 63 68 65 28 70 50  rTempRegCache(pP
27b00 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
27b10 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  {.      /* Gener
27b20 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
27b30 20 74 68 61 74 20 77 69 6c 6c 20 66 69 6c 6c 20   that will fill 
27b40 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62  an ephemeral tab
27b50 6c 65 20 77 69 74 68 0a 20 20 20 20 20 20 2a 2a  le with.      **
27b60 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
27b70 74 68 69 73 20 73 75 62 71 75 65 72 79 2e 20 20  this subquery.  
27b80 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
27b90 75 62 20 77 69 6c 6c 20 70 6f 69 6e 74 0a 20 20  ub will point.  
27ba0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 61 64      ** to the ad
27bb0 64 72 65 73 73 20 6f 66 20 74 68 65 20 67 65 6e  dress of the gen
27bc0 65 72 61 74 65 64 20 73 75 62 72 6f 75 74 69 6e  erated subroutin
27bd0 65 2e 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  e.  pItem->regRe
27be0 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73  turn.      ** is
27bf0 20 61 20 72 65 67 69 73 74 65 72 20 61 6c 6c 6f   a register allo
27c00 63 61 74 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  cated to hold th
27c10 65 20 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74  e subroutine ret
27c20 75 72 6e 20 61 64 64 72 65 73 73 0a 20 20 20 20  urn address.    
27c30 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 74    */.      int t
27c40 6f 70 41 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  opAddr;.      in
27c50 74 20 6f 6e 63 65 41 64 64 72 20 3d 20 30 3b 0a  t onceAddr = 0;.
27c60 20 20 20 20 20 20 69 6e 74 20 72 65 74 41 64 64        int retAdd
27c70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
27c80 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
27c90 53 75 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Sub==0 );.      
27ca0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
27cb0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
27cc0 6d 3b 0a 20 20 20 20 20 20 74 6f 70 41 64 64 72  m;.      topAddr
27cd0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
27ce0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
27cf0 65 72 2c 20 30 2c 20 70 49 74 65 6d 2d 3e 72 65  er, 0, pItem->re
27d00 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20 20  gReturn);.      
27d10 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
27d20 75 62 20 3d 20 74 6f 70 41 64 64 72 2b 31 3b 0a  ub = topAddr+1;.
27d30 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
27d40 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  >isCorrelated==0
27d50 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
27d60 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
27d70 73 20 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64  s not correlated
27d80 20 61 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e   and if we are n
27d90 6f 74 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20  ot inside of.   
27da0 20 20 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65       ** a trigge
27db0 72 2c 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20  r, then we only 
27dc0 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
27dd0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
27de0 20 73 75 62 71 75 65 72 79 0a 20 20 20 20 20 20   subquery.      
27df0 20 20 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20    ** once. */.  
27e00 20 20 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d        onceAddr =
27e10 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65   sqlite3CodeOnce
27e20 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
27e30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
27e40 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
27e50 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
27e60 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
27e70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27e80 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65     VdbeNoopComme
27e90 6e 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c  nt((v, "material
27ea0 69 7a 65 20 5c 22 25 73 5c 22 22 2c 20 70 49 74  ize \"%s\"", pIt
27eb0 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
27ec0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27ed0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
27ee0 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52  stInit(&dest, SR
27ef0 54 5f 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65  T_EphemTab, pIte
27f00 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
27f10 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
27f20 65 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c  eger(pItem->iSel
27f30 65 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73  ectId, (u8)pPars
27f40 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
27f50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27f60 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
27f70 53 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  Sub, &dest);.   
27f80 20 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e     pItem->pTab->
27f90 6e 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67  nRowEst = (unsig
27fa0 6e 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63  ned)pSub->nSelec
27fb0 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  tRow;.      if( 
27fc0 6f 6e 63 65 41 64 64 72 20 29 20 73 71 6c 69 74  onceAddr ) sqlit
27fd0 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
27fe0 2c 20 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20  , onceAddr);.   
27ff0 20 20 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c     retAddr = sql
28000 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
28010 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74  , OP_Return, pIt
28020 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
28030 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
28040 74 28 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20  t((v, "end %s", 
28050 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61  pItem->pTab->zNa
28060 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  me));.      sqli
28070 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
28080 76 2c 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41  v, topAddr, retA
28090 64 64 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ddr);.      sqli
280a0 74 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43  te3ClearTempRegC
280b0 61 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20  ache(pParse);.  
280c0 20 20 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50    }.    if( /*pP
280d0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20  arse->nErr ||*/ 
280e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
280f0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
28100 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d  elect_end;.    }
28110 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
28120 69 67 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53  ight -= sqlite3S
28130 65 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28  electExprHeight(
28140 70 29 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  p);.    pTabList
28150 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
28160 69 66 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72  if( !IgnorableOr
28170 64 65 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a  derby(pDest) ){.
28180 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
28190 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
281a0 20 20 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74    }.  }.  pEList
281b0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65   = p->pEList;.#e
281c0 6e 64 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20  ndif.  pWhere = 
281d0 70 2d 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72  p->pWhere;.  pGr
281e0 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
281f0 70 42 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d  pBy;.  pHaving =
28200 20 70 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73   p->pHaving;.  s
28210 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
28220 3d 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  = (p->selFlags &
28230 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30   SF_Distinct)!=0
28240 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
28250 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
28260 53 45 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74  SELECT.  /* If t
28270 68 65 72 65 20 69 73 20 61 72 65 20 61 20 73 65  here is are a se
28280 71 75 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65  quence of querie
28290 73 2c 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65  s, do the earlie
282a0 72 20 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20  r ones first..  
282b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
282c0 6f 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d  or ){.    rc = m
282d0 75 6c 74 69 53 65 6c 65 63 74 28 70 50 61 72 73  ultiSelect(pPars
282e0 65 2c 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20  e, p, pDest);.  
282f0 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
28300 67 65 72 28 70 50 61 72 73 65 2d 3e 69 53 65 6c  ger(pParse->iSel
28310 65 63 74 49 64 2c 20 69 52 65 73 74 6f 72 65 53  ectId, iRestoreS
28320 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 72 65  electId);.    re
28330 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
28340 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  dif..  /* If the
28350 72 65 20 69 73 20 62 6f 74 68 20 61 20 47 52 4f  re is both a GRO
28360 55 50 20 42 59 20 61 6e 64 20 61 6e 20 4f 52 44  UP BY and an ORD
28370 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64  ER BY clause and
28380 20 74 68 65 79 20 61 72 65 0a 20 20 2a 2a 20 69   they are.  ** i
28390 64 65 6e 74 69 63 61 6c 2c 20 74 68 65 6e 20 64  dentical, then d
283a0 69 73 61 62 6c 65 20 74 68 65 20 4f 52 44 45 52  isable the ORDER
283b0 20 42 59 20 63 6c 61 75 73 65 20 73 69 6e 63 65   BY clause since
283c0 20 74 68 65 20 47 52 4f 55 50 20 42 59 0a 20 20   the GROUP BY.  
283d0 2a 2a 20 77 69 6c 6c 20 63 61 75 73 65 20 65 6c  ** will cause el
283e0 65 6d 65 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f  ements to come o
283f0 75 74 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ut in the correc
28400 74 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69  t order.  This i
28410 73 0a 20 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69  s.  ** an optimi
28420 7a 61 74 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72  zation - the cor
28430 72 65 63 74 20 61 6e 73 77 65 72 20 73 68 6f 75  rect answer shou
28440 6c 64 20 72 65 73 75 6c 74 20 72 65 67 61 72 64  ld result regard
28450 6c 65 73 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74  less..  ** Use t
28460 68 65 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42  he SQLITE_GroupB
28470 79 4f 72 64 65 72 20 66 6c 61 67 20 77 69 74 68  yOrder flag with
28480 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
28490 5f 4f 50 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20  _OPTIMIZER.  ** 
284a0 74 6f 20 64 69 73 61 62 6c 65 20 74 68 69 73 20  to disable this 
284b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
284c0 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
284d0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  s..  */.  if( sq
284e0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f 6d  lite3ExprListCom
284f0 70 61 72 65 28 70 2d 3e 70 47 72 6f 75 70 42 79  pare(p->pGroupBy
28500 2c 20 70 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d  , pOrderBy, -1)=
28510 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  =0.         && O
28520 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
28530 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 47 72  ed(db, SQLITE_Gr
28540 6f 75 70 42 79 4f 72 64 65 72 29 20 29 7b 0a 20  oupByOrder) ){. 
28550 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
28560 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
28570 65 20 71 75 65 72 79 20 69 73 20 44 49 53 54 49  e query is DISTI
28580 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44 45  NCT with an ORDE
28590 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f 74 20  R BY but is not 
285a0 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20 61 6e  an aggregate, an
285b0 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 73  d .  ** if the s
285c0 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20 74 68  elect-list is th
285d0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 4f 52  e same as the OR
285e0 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74 68 65  DER BY list, the
285f0 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20 20 2a  n this query.  *
28600 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69 74 74  * can be rewritt
28610 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20 42 59  en as a GROUP BY
28620 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  . In other words
28630 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  , this:.  **.  *
28640 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44 49 53  *     SELECT DIS
28650 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e  TINCT xyz FROM .
28660 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79 7a 0a  .. ORDER BY xyz.
28670 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61    **.  ** is tra
28680 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a  nsformed to:.  *
28690 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
286a0 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47  T xyz FROM ... G
286b0 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a  ROUP BY xyz.  **
286c0 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  .  ** The second
286d0 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65 72 72   form is preferr
286e0 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65 20 69  ed as a single i
286f0 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d 74 61  ndex (or temp-ta
28700 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20 20 2a  ble) may be .  *
28710 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  * used for both 
28720 74 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  the ORDER BY and
28730 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63 65 73   DISTINCT proces
28740 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69 6e 61  sing. As origina
28750 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  lly .  ** writte
28760 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75 73 74  n the query must
28770 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61 62 6c   use a temp-tabl
28780 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6f  e for at least o
28790 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ne of the ORDER 
287a0 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44 49 53  .  ** BY and DIS
287b0 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e  TINCT, and an in
287c0 64 65 78 20 6f 72 20 73 65 70 61 72 61 74 65 20  dex or separate 
287d0 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72 20 74  temp-table for t
287e0 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20  he other..  */. 
287f0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
28800 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
28810 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 3d  |SF_Aggregate))=
28820 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a 20 20  =SF_Distinct .  
28830 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 4c   && sqlite3ExprL
28840 69 73 74 43 6f 6d 70 61 72 65 28 70 4f 72 64 65  istCompare(pOrde
28850 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  rBy, p->pEList, 
28860 2d 31 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  -1)==0.  ){.    
28870 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  p->selFlags &= ~
28880 53 46 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20  SF_Distinct;.   
28890 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73   p->pGroupBy = s
288a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
288b0 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  p(db, p->pEList,
288c0 20 30 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42   0);.    pGroupB
288d0 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b  y = p->pGroupBy;
288e0 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
288f0 30 3b 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65  0;.    /* Notice
28900 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67   that even thoug
28910 68 74 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68  ht SF_Distinct h
28920 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20  as been cleared 
28930 66 72 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73  from p->selFlags
28940 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69  ,.    ** the sDi
28950 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73  stinct.isTnct is
28960 20 73 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e   still set.  Hen
28970 63 65 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65  ce, isTnct repre
28980 73 65 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a  sents the.    **
28990 20 6f 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e   original settin
289a0 67 20 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74  g of the SF_Dist
289b0 69 6e 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74  inct flag, not t
289c0 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 74 69  he current setti
289d0 6e 67 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ng */.    assert
289e0 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
289f0 63 74 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ct );.  }..  /* 
28a00 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
28a10 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
28a20 74 68 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e  then this sortin
28a30 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67  g.  ** index mig
28a40 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
28a50 75 6e 75 73 65 64 20 69 66 20 74 68 65 20 64 61  unused if the da
28a60 74 61 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20  ta can be .  ** 
28a70 65 78 74 72 61 63 74 65 64 20 69 6e 20 70 72 65  extracted in pre
28a80 2d 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20  -sorted order.  
28a90 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63  If that is the c
28aa0 61 73 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  ase, then the.  
28ab0 2a 2a 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  ** OP_OpenEpheme
28ac0 72 61 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ral instruction 
28ad0 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
28ae0 74 6f 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e  to an OP_Noop on
28af0 63 65 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72  ce.  ** we figur
28b00 65 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 73  e out that the s
28b10 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20  orting index is 
28b20 6e 6f 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65  not needed.  The
28b30 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20   addrSortIndex. 
28b40 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20   ** variable is 
28b50 75 73 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61  used to facilita
28b60 74 65 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a  te that change..
28b70 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
28b80 72 42 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  rBy ){.    KeyIn
28b90 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
28ba0 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
28bb0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
28bc0 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
28bd0 79 2c 20 30 29 3b 0a 20 20 20 20 70 4f 72 64 65  y, 0);.    pOrde
28be0 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20  rBy->iECursor = 
28bf0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
28c00 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
28c10 70 68 6d 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72  phm[2] = addrSor
28c20 74 49 6e 64 65 78 20 3d 0a 20 20 20 20 20 20 73  tIndex =.      s
28c30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
28c40 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
28c50 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
28c80 73 6f 72 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  sor, pOrderBy->n
28c90 45 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20  Expr+2, 0,.     
28ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cb0 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
28cc0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
28cd0 4f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  O);.  }else{.   
28ce0 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 20 3d   addrSortIndex =
28cf0 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   -1;.  }..  /* I
28d00 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
28d10 64 65 73 74 69 6e 65 64 20 66 6f 72 20 61 20 74  destined for a t
28d20 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20  emporary table, 
28d30 6f 70 65 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  open that table.
28d40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73  .  */.  if( pDes
28d50 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  t->eDest==SRT_Ep
28d60 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 73 71  hemTab ){.    sq
28d70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
28d80 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
28d90 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ral, pDest->iSDP
28da0 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  arm, pEList->nEx
28db0 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  pr);.  }..  /* S
28dc0 65 74 20 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a  et the limiter..
28dd0 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71    */.  iEnd = sq
28de0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
28df0 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c  el(v);.  p->nSel
28e00 65 63 74 52 6f 77 20 3d 20 4c 41 52 47 45 53 54  ectRow = LARGEST
28e10 5f 49 4e 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74  _INT64;.  comput
28e20 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
28e30 70 50 61 72 73 65 2c 20 70 2c 20 69 45 6e 64 29  pParse, p, iEnd)
28e40 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
28e50 74 3d 3d 30 20 26 26 20 61 64 64 72 53 6f 72 74  t==0 && addrSort
28e60 49 6e 64 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20  Index>=0 ){.    
28e70 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
28e80 28 76 2c 20 61 64 64 72 53 6f 72 74 49 6e 64 65  (v, addrSortInde
28e90 78 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  x)->opcode = OP_
28ea0 53 6f 72 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20  SorterOpen;.    
28eb0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
28ec0 46 5f 55 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d  F_UseSorter;.  }
28ed0 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69  ..  /* Open a vi
28ee0 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 20 75  rtual index to u
28ef0 73 65 20 66 6f 72 20 74 68 65 20 64 69 73 74 69  se for the disti
28f00 6e 63 74 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20  nct set..  */.  
28f10 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
28f20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 7b  & SF_Distinct ){
28f30 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74  .    sDistinct.t
28f40 61 62 54 6e 63 74 20 3d 20 70 50 61 72 73 65 2d  abTnct = pParse-
28f50 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69  >nTab++;.    sDi
28f60 73 74 69 6e 63 74 2e 61 64 64 72 54 6e 63 74 20  stinct.addrTnct 
28f70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
28f80 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op4(v, OP_OpenEp
28f90 68 65 6d 65 72 61 6c 2c 0a 20 20 20 20 20 20 20  hemeral,.       
28fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fb0 20 20 20 20 20 20 20 20 20 73 44 69 73 74 69 6e           sDistin
28fc0 63 74 2e 74 61 62 54 6e 63 74 2c 20 30 2c 20 30  ct.tabTnct, 0, 0
28fd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ff0 20 20 28 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f    (char*)keyInfo
29000 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
29010 72 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  rse, p->pEList, 
29020 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0),.            
29030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29040 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
29050 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
29060 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
29070 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
29080 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
29090 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
290a0 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
290b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
290c0 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
290d0 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
290e0 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  NCT_NOOP;.  }.. 
290f0 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
29100 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
29110 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74    /* No aggregat
29120 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
29130 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
29140 73 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 77 63  se */.    u16 wc
29150 74 72 6c 46 6c 61 67 73 20 3d 20 28 73 44 69 73  trlFlags = (sDis
29160 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20 57  tinct.isTnct ? W
29170 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e  HERE_WANT_DISTIN
29180 43 54 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  CT : 0);..    /*
29190 20 42 65 67 69 6e 20 74 68 65 20 64 61 74 61 62   Begin the datab
291a0 61 73 65 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20  ase scan. */.   
291b0 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65   pWInfo = sqlite
291c0 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72  3WhereBegin(pPar
291d0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57  se, pTabList, pW
291e0 68 65 72 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  here, pOrderBy, 
291f0 70 2d 3e 70 45 4c 69 73 74 2c 0a 20 20 20 20 20  p->pEList,.     
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 20 20 20 20 20 20 20 20 20 77 63 74 72 6c 46            wctrlF
29220 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 69 66  lags, 0);.    if
29230 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f  ( pWInfo==0 ) go
29240 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
29250 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
29260 65 72 65 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e  ereOutputRowCoun
29270 74 28 70 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e  t(pWInfo) < p->n
29280 53 65 6c 65 63 74 52 6f 77 20 29 7b 0a 20 20 20  SelectRow ){.   
29290 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77     p->nSelectRow
292a0 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f   = sqlite3WhereO
292b0 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57  utputRowCount(pW
292c0 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Info);.    }.   
292d0 20 69 66 28 20 73 44 69 73 74 69 6e 63 74 2e 69   if( sDistinct.i
292e0 73 54 6e 63 74 20 26 26 20 73 71 6c 69 74 65 33  sTnct && sqlite3
292f0 57 68 65 72 65 49 73 44 69 73 74 69 6e 63 74 28  WhereIsDistinct(
29300 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20  pWInfo) ){.     
29310 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
29320 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 57 68  Type = sqlite3Wh
29330 65 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57  ereIsDistinct(pW
29340 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Info);.    }.   
29350 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 26 26   if( pOrderBy &&
29360 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
29370 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 20 29  rdered(pWInfo) )
29380 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a   pOrderBy = 0;..
29390 20 20 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e      /* If sortin
293a0 67 20 69 6e 64 65 78 20 74 68 61 74 20 77 61 73  g index that was
293b0 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
293c0 69 6f 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  ior OP_OpenEphem
293d0 65 72 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73  eral .    ** ins
293e0 74 72 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75  truction ended u
293f0 70 20 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64  p not being need
29400 65 64 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20  ed, then change 
29410 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  the OP_OpenEphem
29420 65 72 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f  eral.    ** into
29430 20 61 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20   an OP_Noop..   
29440 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72   */.    if( addr
29450 53 6f 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20  SortIndex>=0 && 
29460 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20  pOrderBy==0 ){. 
29470 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29480 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20  ChangeToNoop(v, 
29490 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a  addrSortIndex);.
294a0 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65        p->addrOpe
294b0 6e 45 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20  nEphm[2] = -1;. 
294c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65     }..    /* Use
294d0 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e   the standard in
294e0 6e 65 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20  ner loop. */.   
294f0 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70   selectInnerLoop
29500 28 70 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69  (pParse, p, pELi
29510 73 74 2c 20 2d 31 2c 20 70 4f 72 64 65 72 42 79  st, -1, pOrderBy
29520 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44  , &sDistinct, pD
29530 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
29540 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
29550 57 68 65 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62  WhereContinueLab
29560 65 6c 28 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20  el(pWInfo),.    
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29580 73 71 6c 69 74 65 33 57 68 65 72 65 42 72 65 61  sqlite3WhereBrea
29590 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b  kLabel(pWInfo));
295a0 0a 0a 20 20 20 20 2f 2a 20 45 6e 64 20 74 68 65  ..    /* End the
295b0 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 20 6c   database scan l
295c0 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
295d0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
295e0 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  pWInfo);.  }else
295f0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  {.    /* This ca
29600 73 65 20 77 68 65 6e 20 74 68 65 72 65 20 65 78  se when there ex
29610 69 73 74 20 61 67 67 72 65 67 61 74 65 20 66 75  ist aggregate fu
29620 6e 63 74 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f  nctions or a GRO
29630 55 50 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  UP BY clause.   
29640 20 2a 2a 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20   ** or both */. 
29650 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
29660 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63  NC;    /* Name c
29670 6f 6e 74 65 78 74 20 66 6f 72 20 70 72 6f 63 65  ontext for proce
29680 73 73 69 6e 67 20 61 67 67 72 65 67 61 74 65 20  ssing aggregate 
29690 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
296a0 20 20 20 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20     int iAMem;   
296b0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
296c0 4d 65 6d 20 61 64 64 72 65 73 73 20 66 6f 72 20  Mem address for 
296d0 73 74 6f 72 69 6e 67 20 63 75 72 72 65 6e 74 20  storing current 
296e0 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20  GROUP BY */.    
296f0 69 6e 74 20 69 42 4d 65 6d 3b 20 20 20 20 20 20  int iBMem;      
29700 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
29710 20 61 64 64 72 65 73 73 20 66 6f 72 20 70 72 65   address for pre
29720 76 69 6f 75 73 20 47 52 4f 55 50 20 42 59 20 2a  vious GROUP BY *
29730 2f 0a 20 20 20 20 69 6e 74 20 69 55 73 65 46 6c  /.    int iUseFl
29740 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d  ag;       /* Mem
29750 20 61 64 64 72 65 73 73 20 68 6f 6c 64 69 6e 67   address holding
29760 20 66 6c 61 67 20 69 6e 64 69 63 61 74 69 6e 67   flag indicating
29770 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 0a 20   that at least. 
29780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29790 20 20 20 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f         ** one ro
297a0 77 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 74  w of the input t
297b0 6f 20 74 68 65 20 61 67 67 72 65 67 61 74 6f 72  o the aggregator
297c0 20 68 61 73 20 62 65 65 6e 0a 20 20 20 20 20 20   has been.      
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297e0 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 64 20 2a    ** processed *
297f0 2f 0a 20 20 20 20 69 6e 74 20 69 41 62 6f 72 74  /.    int iAbort
29800 46 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d  Flag;     /* Mem
29810 20 61 64 64 72 65 73 73 20 77 68 69 63 68 20 63   address which c
29820 61 75 73 65 73 20 71 75 65 72 79 20 61 62 6f 72  auses query abor
29830 74 20 69 66 20 70 6f 73 69 74 69 76 65 20 2a 2f  t if positive */
29840 0a 20 20 20 20 69 6e 74 20 67 72 6f 75 70 42 79  .    int groupBy
29850 53 6f 72 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73  Sort;    /* Rows
29860 20 63 6f 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63   come from sourc
29870 65 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f 72  e in GROUP BY or
29880 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  der */.    int a
29890 64 64 72 45 6e 64 3b 20 20 20 20 20 20 20 20 2f  ddrEnd;        /
298a0 2a 20 45 6e 64 20 6f 66 20 70 72 6f 63 65 73 73  * End of process
298b0 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
298c0 45 43 54 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ECT */.    int s
298d0 6f 72 74 50 54 61 62 20 3d 20 30 3b 20 20 20 2f  ortPTab = 0;   /
298e0 2a 20 50 73 65 75 64 6f 74 61 62 6c 65 20 75 73  * Pseudotable us
298f0 65 64 20 74 6f 20 64 65 63 6f 64 65 20 73 6f 72  ed to decode sor
29900 74 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ting results */.
29910 20 20 20 20 69 6e 74 20 73 6f 72 74 4f 75 74 20      int sortOut 
29920 3d 20 30 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75  = 0;    /* Outpu
29930 74 20 72 65 67 69 73 74 65 72 20 66 72 6f 6d 20  t register from 
29940 74 68 65 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20  the sorter */.. 
29950 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79     /* Remove any
29960 20 61 6e 64 20 61 6c 6c 20 61 6c 69 61 73 65 73   and all aliases
29970 20 62 65 74 77 65 65 6e 20 74 68 65 20 72 65 73   between the res
29980 75 6c 74 20 73 65 74 20 61 6e 64 20 74 68 65 0a  ult set and the.
29990 20 20 20 20 2a 2a 20 47 52 4f 55 50 20 42 59 20      ** GROUP BY 
299a0 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
299b0 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
299c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 20  ){.      int k; 
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299e0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
299f0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  ounter */.      
29a00 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
29a10 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a  item *pItem;  /*
29a20 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
29a30 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
29a40 61 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20  a list */..     
29a50 20 66 6f 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74   for(k=p->pEList
29a60 2d 3e 6e 45 78 70 72 2c 20 70 49 74 65 6d 3d 70  ->nExpr, pItem=p
29a70 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30  ->pEList->a; k>0
29a80 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; k--, pItem++){
29a90 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
29aa0 75 2e 78 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a  u.x.iAlias = 0;.
29ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
29ac0 72 28 6b 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45  r(k=pGroupBy->nE
29ad0 78 70 72 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  xpr, pItem=pGrou
29ae0 70 42 79 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  pBy->a; k>0; k--
29af0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
29b00 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
29b10 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
29b20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
29b30 6e 53 65 6c 65 63 74 52 6f 77 3e 31 30 30 20 29  nSelectRow>100 )
29b40 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
29b50 20 31 30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   100;.    }else{
29b60 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
29b70 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  tRow = 1;.    }.
29b80 0a 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  . .    /* Create
29b90 20 61 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70   a label to jump
29ba0 20 74 6f 20 77 68 65 6e 20 77 65 20 77 61 6e 74   to when we want
29bb0 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 71 75   to abort the qu
29bc0 65 72 79 20 2a 2f 0a 20 20 20 20 61 64 64 72 45  ery */.    addrE
29bd0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
29be0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
29bf0 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b     /* Convert TK
29c00 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e  _COLUMN nodes in
29c10 74 6f 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  to TK_AGG_COLUMN
29c20 20 61 6e 64 20 6d 61 6b 65 20 65 6e 74 72 69 65   and make entrie
29c30 73 20 69 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67  s in.    ** sAgg
29c40 49 6e 66 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f  Info for all TK_
29c50 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
29c60 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
29c70 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
29c80 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
29c90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
29ca0 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
29cb0 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
29cc0 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
29cd0 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
29ce0 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
29cf0 0a 20 20 20 20 73 4e 43 2e 70 41 67 67 49 6e 66  .    sNC.pAggInf
29d00 6f 20 3d 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20  o = &sAggInfo;. 
29d10 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65     sAggInfo.mnRe
29d20 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  g = pParse->nMem
29d30 2b 31 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f  +1;.    sAggInfo
29d40 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20  .nSortingColumn 
29d50 3d 20 70 47 72 6f 75 70 42 79 20 3f 20 70 47 72  = pGroupBy ? pGr
29d60 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a  oupBy->nExpr+1 :
29d70 20 30 3b 0a 20 20 20 20 73 41 67 67 49 6e 66 6f   0;.    sAggInfo
29d80 2e 70 47 72 6f 75 70 42 79 20 3d 20 70 47 72 6f  .pGroupBy = pGro
29d90 75 70 42 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  upBy;.    sqlite
29da0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
29db0 69 73 74 28 26 73 4e 43 2c 20 70 45 4c 69 73 74  ist(&sNC, pEList
29dc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
29dd0 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
29de0 28 26 73 4e 43 2c 20 70 4f 72 64 65 72 42 79 29  (&sNC, pOrderBy)
29df0 3b 0a 20 20 20 20 69 66 28 20 70 48 61 76 69 6e  ;.    if( pHavin
29e00 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
29e10 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
29e20 72 65 67 61 74 65 73 28 26 73 4e 43 2c 20 70 48  regates(&sNC, pH
29e30 61 76 69 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20  aving);.    }.  
29e40 20 20 73 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75    sAggInfo.nAccu
29e50 6d 75 6c 61 74 6f 72 20 3d 20 73 41 67 67 49 6e  mulator = sAggIn
29e60 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  fo.nColumn;.    
29e70 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
29e80 6e 66 6f 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  nfo.nFunc; i++){
29e90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
29ea0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
29eb0 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
29ec0 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  ].pExpr, EP_xIsS
29ed0 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
29ee0 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  sNC.ncFlags |= N
29ef0 43 5f 49 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20  C_InAggFunc;.   
29f00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
29f10 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
29f20 43 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e  C, sAggInfo.aFun
29f30 63 5b 69 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c  c[i].pExpr->x.pL
29f40 69 73 74 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e  ist);.      sNC.
29f50 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49  ncFlags &= ~NC_I
29f60 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a  nAggFunc;.    }.
29f70 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52      sAggInfo.mxR
29f80 65 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  eg = pParse->nMe
29f90 6d 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  m;.    if( db->m
29fa0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
29fb0 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a  to select_end;..
29fc0 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e      /* Processin
29fd0 67 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 73  g for aggregates
29fe0 20 77 69 74 68 20 47 52 4f 55 50 20 42 59 20 69   with GROUP BY i
29ff0 73 20 76 65 72 79 20 64 69 66 66 65 72 65 6e 74  s very different
2a000 20 61 6e 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68   and.    ** much
2a010 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 74 68   more complex th
2a020 61 6e 20 61 67 67 72 65 67 61 74 65 73 20 77 69  an aggregates wi
2a030 74 68 6f 75 74 20 61 20 47 52 4f 55 50 20 42 59  thout a GROUP BY
2a040 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2a050 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
2a060 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
2a070 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67  Info;  /* Keying
2a080 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
2a090 20 74 68 65 20 67 72 6f 75 70 20 62 79 20 63 6c   the group by cl
2a0a0 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ause */.      in
2a0b0 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20  t j1;           
2a0c0 20 20 2f 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70    /* A-vs-B comp
2a0d0 61 72 69 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a  arision jump */.
2a0e0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 4f 75        int addrOu
2a0f0 74 70 75 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61  tputRow;  /* Sta
2a100 72 74 20 6f 66 20 73 75 62 72 6f 75 74 69 6e 65  rt of subroutine
2a110 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 61 20   that outputs a 
2a120 72 65 73 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20  result row */.  
2a130 20 20 20 20 69 6e 74 20 72 65 67 4f 75 74 70 75      int regOutpu
2a140 74 52 6f 77 3b 20 20 20 2f 2a 20 52 65 74 75 72  tRow;   /* Retur
2a150 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74  n address regist
2a160 65 72 20 66 6f 72 20 6f 75 74 70 75 74 20 73 75  er for output su
2a170 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  broutine */.    
2a180 20 20 69 6e 74 20 61 64 64 72 53 65 74 41 62 6f    int addrSetAbo
2a190 72 74 3b 20 20 20 2f 2a 20 53 65 74 20 74 68 65  rt;   /* Set the
2a1a0 20 61 62 6f 72 74 20 66 6c 61 67 20 61 6e 64 20   abort flag and 
2a1b0 72 65 74 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20  return */.      
2a1c0 69 6e 74 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f  int addrTopOfLoo
2a1d0 70 3b 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68  p;  /* Top of th
2a1e0 65 20 69 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a  e input loop */.
2a1f0 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 6f        int addrSo
2a200 72 74 69 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65  rtingIdx; /* The
2a210 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
2a220 6c 20 66 6f 72 20 74 68 65 20 73 6f 72 74 69 6e  l for the sortin
2a230 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  g index */.     
2a240 20 69 6e 74 20 61 64 64 72 52 65 73 65 74 3b 20   int addrReset; 
2a250 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
2a260 6e 65 20 66 6f 72 20 72 65 73 65 74 74 69 6e 67  ne for resetting
2a270 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
2a280 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
2a290 67 52 65 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  gReset;       /*
2a2a0 20 52 65 74 75 72 6e 20 61 64 64 72 65 73 73 20   Return address 
2a2b0 72 65 67 69 73 74 65 72 20 66 6f 72 20 72 65 73  register for res
2a2c0 65 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  et subroutine */
2a2d0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
2a2e0 65 72 65 20 69 73 20 61 20 47 52 4f 55 50 20 42  ere is a GROUP B
2a2f0 59 20 63 6c 61 75 73 65 20 77 65 20 6d 69 67 68  Y clause we migh
2a300 74 20 6e 65 65 64 20 61 20 73 6f 72 74 69 6e 67  t need a sorting
2a310 20 69 6e 64 65 78 20 74 6f 0a 20 20 20 20 20 20   index to.      
2a320 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e  ** implement it.
2a330 20 20 41 6c 6c 6f 63 61 74 65 20 74 68 61 74 20    Allocate that 
2a340 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f  sorting index no
2a350 77 2e 20 20 49 66 20 69 74 20 74 75 72 6e 73 20  w.  If it turns 
2a360 6f 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  out.      ** tha
2a370 74 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64  t we do not need
2a380 20 69 74 20 61 66 74 65 72 20 61 6c 6c 2c 20 74   it after all, t
2a390 68 65 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  he OP_SorterOpen
2a3a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20 20 20   instruction.   
2a3b0 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f     ** will be co
2a3c0 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 4e  nverted into a N
2a3d0 6f 6f 70 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a  oop.  .      */.
2a3e0 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 73        sAggInfo.s
2a3f0 6f 72 74 69 6e 67 49 64 78 20 3d 20 70 50 61 72  ortingIdx = pPar
2a400 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2a410 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79    pKeyInfo = key
2a420 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
2a430 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
2a440 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 64 64  y, 0);.      add
2a450 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73 71  rSortingIdx = sq
2a460 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
2a470 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e  v, OP_SorterOpen
2a480 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41 67  , .          sAg
2a490 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2a4a0 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74  , sAggInfo.nSort
2a4b0 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20  ingColumn, .    
2a4c0 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a 29        0, (char*)
2a4d0 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59  pKeyInfo, P4_KEY
2a4e0 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  INFO);..      /*
2a4f0 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
2a500 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65  ry locations use
2a510 64 20 62 79 20 47 52 4f 55 50 20 42 59 20 61 67  d by GROUP BY ag
2a520 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69  gregate processi
2a530 6e 67 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ng.      */.    
2a540 20 20 69 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70    iUseFlag = ++p
2a550 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2a560 20 20 20 69 41 62 6f 72 74 46 6c 61 67 20 3d 20     iAbortFlag = 
2a570 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2a580 20 20 20 20 20 20 72 65 67 4f 75 74 70 75 74 52        regOutputR
2a590 6f 77 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ow = ++pParse->n
2a5a0 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 4f  Mem;.      addrO
2a5b0 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c 69 74  utputRow = sqlit
2a5c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2a5d0 76 29 3b 0a 20 20 20 20 20 20 72 65 67 52 65 73  v);.      regRes
2a5e0 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  et = ++pParse->n
2a5f0 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 52  Mem;.      addrR
2a600 65 73 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  eset = sqlite3Vd
2a610 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
2a620 20 20 20 20 20 20 69 41 4d 65 6d 20 3d 20 70 50        iAMem = pP
2a630 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
2a640 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
2a650 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
2a660 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 42 4d  nExpr;.      iBM
2a670 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
2a680 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61  m + 1;.      pPa
2a690 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72  rse->nMem += pGr
2a6a0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
2a6b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a6c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2a6d0 67 65 72 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c  ger, 0, iAbortFl
2a6e0 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ag);.      VdbeC
2a6f0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6c 65 61  omment((v, "clea
2a700 72 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  r abort flag"));
2a710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2a720 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2a730 6e 74 65 67 65 72 2c 20 30 2c 20 69 55 73 65 46  nteger, 0, iUseF
2a740 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2a750 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
2a760 69 63 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  icate accumulato
2a770 72 20 65 6d 70 74 79 22 29 29 3b 0a 20 20 20 20  r empty"));.    
2a780 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a790 4f 70 33 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  Op3(v, OP_Null, 
2a7a0 30 2c 20 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b  0, iAMem, iAMem+
2a7b0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d  pGroupBy->nExpr-
2a7c0 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65  1);..      /* Be
2a7d0 67 69 6e 20 61 20 6c 6f 6f 70 20 74 68 61 74 20  gin a loop that 
2a7e0 77 69 6c 6c 20 65 78 74 72 61 63 74 20 61 6c 6c  will extract all
2a7f0 20 73 6f 75 72 63 65 20 72 6f 77 73 20 69 6e 20   source rows in 
2a800 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 2e 0a  GROUP BY order..
2a810 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 6d 69        ** This mi
2a820 67 68 74 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20  ght involve two 
2a830 73 65 70 61 72 61 74 65 20 6c 6f 6f 70 73 20 77  separate loops w
2a840 69 74 68 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69  ith an OP_Sort i
2a850 6e 20 62 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20  n between, or.  
2a860 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
2a870 62 65 20 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70  be a single loop
2a880 20 74 68 61 74 20 75 73 65 73 20 61 6e 20 69 6e   that uses an in
2a890 64 65 78 20 74 6f 20 65 78 74 72 61 63 74 20 69  dex to extract i
2a8a0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20  nformation.     
2a8b0 20 2a 2a 20 69 6e 20 74 68 65 20 72 69 67 68 74   ** in the right
2a8c0 20 6f 72 64 65 72 20 74 6f 20 62 65 67 69 6e 20   order to begin 
2a8d0 77 69 74 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  with..      */. 
2a8e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a8f0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
2a900 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
2a910 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
2a920 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
2a930 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
2a940 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
2a950 65 72 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30  ere, pGroupBy, 0
2a960 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
2a970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a980 20 20 20 20 57 48 45 52 45 5f 47 52 4f 55 50 42      WHERE_GROUPB
2a990 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  Y, 0);.      if(
2a9a0 20 70 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74   pWInfo==0 ) got
2a9b0 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
2a9c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
2a9d0 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
2a9e0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Info) ){.       
2a9f0 20 2f 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a 65   /* The optimize
2aa00 72 20 69 73 20 61 62 6c 65 20 74 6f 20 64 65 6c  r is able to del
2aa10 69 76 65 72 20 72 6f 77 73 20 69 6e 20 67 72 6f  iver rows in gro
2aa20 75 70 20 62 79 20 6f 72 64 65 72 20 73 6f 0a 20  up by order so. 
2aa30 20 20 20 20 20 20 20 2a 2a 20 77 65 20 64 6f 20         ** we do 
2aa40 6e 6f 74 20 68 61 76 65 20 74 6f 20 73 6f 72 74  not have to sort
2aa50 2e 20 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70  .  The OP_OpenEp
2aa60 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
2aa70 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a  ll be.        **
2aa80 20 63 61 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72   cancelled later
2aa90 20 62 65 63 61 75 73 65 20 77 65 20 73 74 69 6c   because we stil
2aaa0 6c 20 6e 65 65 64 20 74 6f 20 75 73 65 20 74 68  l need to use th
2aab0 65 20 70 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20  e pKeyInfo.     
2aac0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 67 72     */.        gr
2aad0 6f 75 70 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20  oupBySort = 0;. 
2aae0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2aaf0 20 20 20 20 2f 2a 20 52 6f 77 73 20 61 72 65 20      /* Rows are 
2ab00 63 6f 6d 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e  coming out in un
2ab10 64 65 74 65 72 6d 69 6e 65 64 20 6f 72 64 65 72  determined order
2ab20 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 70 75  .  We have to pu
2ab30 73 68 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 61  sh.        ** ea
2ab40 63 68 20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f  ch row into a so
2ab50 72 74 69 6e 67 20 69 6e 64 65 78 2c 20 74 65 72  rting index, ter
2ab60 6d 69 6e 61 74 65 20 74 68 65 20 66 69 72 73 74  minate the first
2ab70 20 6c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a   loop,.        *
2ab80 2a 20 74 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72  * then loop over
2ab90 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2aba0 65 78 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ex in order to g
2abb0 65 74 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  et the output.  
2abc0 20 20 20 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74        ** in sort
2abd0 65 64 20 6f 72 64 65 72 0a 20 20 20 20 20 20 20  ed order.       
2abe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2abf0 72 65 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20  regBase;.       
2ac00 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 0a   int regRecord;.
2ac10 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
2ac20 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 47  ;.        int nG
2ac30 72 6f 75 70 42 79 3b 0a 0a 20 20 20 20 20 20 20  roupBy;..       
2ac40 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
2ac50 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
2ac60 20 20 20 20 20 20 20 28 73 44 69 73 74 69 6e 63         (sDistinc
2ac70 74 2e 69 73 54 6e 63 74 20 26 26 20 28 70 2d 3e  t.isTnct && (p->
2ac80 73 65 6c 46 6c 61 67 73 26 53 46 5f 44 69 73 74  selFlags&SF_Dist
2ac90 69 6e 63 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20  inct)==0) ?.    
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acb0 22 44 49 53 54 49 4e 43 54 22 20 3a 20 22 47 52  "DISTINCT" : "GR
2acc0 4f 55 50 20 42 59 22 29 3b 0a 0a 20 20 20 20 20  OUP BY");..     
2acd0 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20 3d     groupBySort =
2ace0 20 31 3b 0a 20 20 20 20 20 20 20 20 6e 47 72 6f   1;.        nGro
2acf0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 2d  upBy = pGroupBy-
2ad00 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
2ad10 6e 43 6f 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20  nCol = nGroupBy 
2ad20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d  + 1;.        j =
2ad30 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20   nGroupBy+1;.   
2ad40 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2ad50 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e  sAggInfo.nColumn
2ad60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2ad70 20 20 69 66 28 20 73 41 67 67 49 6e 66 6f 2e 61    if( sAggInfo.a
2ad80 43 6f 6c 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f  Col[i].iSorterCo
2ad90 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
2ada0 20 20 20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20         nCol++;. 
2adb0 20 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a             j++;.
2adc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2add0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
2ade0 67 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47  gBase = sqlite3G
2adf0 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
2ae00 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  se, nCol);.     
2ae10 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
2ae20 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
2ae30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ae40 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
2ae50 74 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  t(pParse, pGroup
2ae60 42 79 2c 20 72 65 67 42 61 73 65 2c 20 30 29 3b  By, regBase, 0);
2ae70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2ae80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2ae90 5f 53 65 71 75 65 6e 63 65 2c 20 73 41 67 67 49  _Sequence, sAggI
2aea0 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72  nfo.sortingIdx,r
2aeb0 65 67 42 61 73 65 2b 6e 47 72 6f 75 70 42 79 29  egBase+nGroupBy)
2aec0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
2aed0 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
2aee0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2aef0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
2af00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
2af10 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f  truct AggInfo_co
2af20 6c 20 2a 70 43 6f 6c 20 3d 20 26 73 41 67 67 49  l *pCol = &sAggI
2af30 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20  nfo.aCol[i];.   
2af40 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 2d         if( pCol-
2af50 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d  >iSorterColumn>=
2af60 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  j ){.           
2af70 20 69 6e 74 20 72 31 20 3d 20 6a 20 2b 20 72 65   int r1 = j + re
2af80 67 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20  gBase;.         
2af90 20 20 20 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20     int r2;..    
2afa0 20 20 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c          r2 = sql
2afb0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
2afc0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20  olumn(pParse, . 
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2aff0 6f 6c 2d 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e  ol->pTab, pCol->
2b000 69 43 6f 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69  iColumn, pCol->i
2b010 54 61 62 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20  Table, r1, 0);. 
2b020 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2b030 31 21 3d 72 32 20 29 7b 0a 20 20 20 20 20 20 20  1!=r2 ){.       
2b040 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2b050 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2b060 43 6f 70 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20  Copy, r2, r1);. 
2b070 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b080 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20           j++;.  
2b090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b0a0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 52    }.        regR
2b0b0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
2b0c0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
2b0d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2b0e0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2b0f0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
2b100 65 67 42 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65  egBase, nCol, re
2b110 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20  gRecord);.      
2b120 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b130 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2b140 49 6e 73 65 72 74 2c 20 73 41 67 67 49 6e 66 6f  Insert, sAggInfo
2b150 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 72 65 67  .sortingIdx, reg
2b160 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20  Record);.       
2b170 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
2b180 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
2b190 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 20  egRecord);.     
2b1a0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
2b1b0 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
2b1c0 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c  e, regBase, nCol
2b1d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2b1e0 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2b1f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67 67  o);.        sAgg
2b200 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50  Info.sortingIdxP
2b210 54 61 62 20 3d 20 73 6f 72 74 50 54 61 62 20 3d  Tab = sortPTab =
2b220 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2b230 0a 20 20 20 20 20 20 20 20 73 6f 72 74 4f 75 74  .        sortOut
2b240 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2b250 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2b260 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b270 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70  eAddOp3(v, OP_Op
2b280 65 6e 50 73 65 75 64 6f 2c 20 73 6f 72 74 50 54  enPseudo, sortPT
2b290 61 62 2c 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f  ab, sortOut, nCo
2b2a0 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
2b2b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2b2c0 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
2b2d0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
2b2e0 49 64 78 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  Idx, addrEnd);. 
2b2f0 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2b300 6e 74 28 28 76 2c 20 22 47 52 4f 55 50 20 42 59  nt((v, "GROUP BY
2b310 20 73 6f 72 74 22 29 29 3b 0a 20 20 20 20 20 20   sort"));.      
2b320 20 20 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f    sAggInfo.useSo
2b330 72 74 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20  rtingIdx = 1;.  
2b340 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2b350 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
2b360 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  se);.      }..  
2b370 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
2b380 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
2b390 50 20 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73  P BY terms and s
2b3a0 74 6f 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20  tore in b0, b1, 
2b3b0 62 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28  b2....      ** (
2b3c0 62 30 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63  b0 is memory loc
2b3d0 61 74 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62  ation iBMem+0, b
2b3e0 31 20 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e  1 is iBMem+1, an
2b3f0 64 20 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20  d so forth).    
2b400 20 20 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72    ** Then compar
2b410 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 47 52  e the current GR
2b420 4f 55 50 20 42 59 20 74 65 72 6d 73 20 61 67 61  OUP BY terms aga
2b430 69 6e 73 74 20 74 68 65 20 47 52 4f 55 50 20 42  inst the GROUP B
2b440 59 20 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a  Y terms.      **
2b450 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f   from the previo
2b460 75 73 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79  us row currently
2b470 20 73 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61   stored in a0, a
2b480 31 2c 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a  1, a2....      *
2b490 2f 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f  /.      addrTopO
2b4a0 66 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  fLoop = sqlite3V
2b4b0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2b4c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2b4d0 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
2b4e0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
2b4f0 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b  ( groupBySort ){
2b500 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b510 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2b520 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67  _SorterData, sAg
2b530 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2b540 2c 20 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20  , sortOut);.    
2b550 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2b560 30 3b 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e  0; j<pGroupBy->n
2b570 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
2b580 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
2b590 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ort ){.         
2b5a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b5b0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2b5c0 20 73 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42   sortPTab, j, iB
2b5d0 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20  Mem+j);.        
2b5e0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c    if( j==0 ) sql
2b5f0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
2b600 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
2b610 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20  CACHE);.        
2b620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b630 20 73 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74   sAggInfo.direct
2b640 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Mode = 1;.      
2b650 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2b660 6f 64 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f  ode(pParse, pGro
2b670 75 70 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  upBy->a[j].pExpr
2b680 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20  , iBMem+j);.    
2b690 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2b6a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b6b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70  ddOp4(v, OP_Comp
2b6c0 61 72 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65  are, iAMem, iBMe
2b6d0 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  m, pGroupBy->nEx
2b6e0 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2b700 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
2b710 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
2b720 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
2b730 20 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65       j1 = sqlite
2b740 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2b750 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
2b760 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2b770 4f 50 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30  OP_Jump, j1+1, 0
2b780 2c 20 6a 31 2b 31 29 3b 0a 0a 20 20 20 20 20 20  , j1+1);..      
2b790 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
2b7a0 20 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65   that runs whene
2b7b0 76 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59  ver the GROUP BY
2b7c0 20 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20   changes..      
2b7d0 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68  ** Changes in th
2b7e0 65 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64  e GROUP BY are d
2b7f0 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70  etected by the p
2b800 72 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20  revious code.   
2b810 20 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66     ** block.  If
2b820 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63   there were no c
2b830 68 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f  hanges, this blo
2b840 63 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20  ck is skipped.. 
2b850 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2b860 20 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65   This code copie
2b870 73 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20  s current group 
2b880 62 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62  by terms in b0,b
2b890 31 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a  1,b2,....      *
2b8a0 2a 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c  * over to a0,a1,
2b8b0 61 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c  a2.  It then cal
2b8c0 6c 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75  ls the output su
2b8d0 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a  broutine.      *
2b8e0 2a 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65  * and resets the
2b8f0 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d   aggregate accum
2b900 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
2b910 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a   in preparation.
2b920 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
2b930 20 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62   next GROUP BY b
2b940 61 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atch..      */. 
2b950 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2b960 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
2b970 20 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70   iBMem, iAMem, p
2b980 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b  GroupBy->nExpr);
2b990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2b9a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2b9b0 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
2b9c0 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
2b9d0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
2b9e0 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
2b9f0 74 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20  t one row"));.  
2ba00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2ba10 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
2ba20 73 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61  s, iAbortFlag, a
2ba30 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 56  ddrEnd);.      V
2ba40 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2ba50 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
2ba60 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2ba70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2ba80 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
2ba90 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
2baa0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2bab0 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
2bac0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
2bad0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2bae0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2baf0 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
2bb00 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
2bb10 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
2bb20 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
2bb30 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2bb40 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2bb50 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  j1);.      updat
2bb60 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
2bb70 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2bb80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2bb90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2bba0 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
2bbb0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2bbc0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
2bbd0 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
2bbe0 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
2bbf0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
2bc00 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
2bc10 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
2bc20 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
2bc30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2bc40 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2bc50 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
2bc60 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
2bc70 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
2bc80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2bc90 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2bca0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  pWInfo);.       
2bcb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
2bcc0 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72  geToNoop(v, addr
2bcd0 53 6f 72 74 69 6e 67 49 64 78 29 3b 0a 20 20 20  SortingIdx);.   
2bce0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4f     }..      /* O
2bcf0 75 74 70 75 74 20 74 68 65 20 66 69 6e 61 6c 20  utput the final 
2bd00 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 0a 20 20  row of result.  
2bd10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
2bd20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2bd30 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
2bd40 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
2bd50 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2bd60 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2bd70 22 6f 75 74 70 75 74 20 66 69 6e 61 6c 20 72 6f  "output final ro
2bd80 77 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  w"));..      /* 
2bd90 4a 75 6d 70 20 6f 76 65 72 20 74 68 65 20 73 75  Jump over the su
2bda0 62 72 6f 75 74 69 6e 65 73 0a 20 20 20 20 20 20  broutines.      
2bdb0 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2bdc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2bdd0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6e  _Goto, 0, addrEn
2bde0 64 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  d);..      /* Ge
2bdf0 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
2be00 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74 73  ine that outputs
2be10 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66   a single row of
2be20 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20   the result.    
2be30 20 20 2a 2a 20 73 65 74 2e 20 20 54 68 69 73 20    ** set.  This 
2be40 73 75 62 72 6f 75 74 69 6e 65 20 66 69 72 73 74  subroutine first
2be50 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 69 55   looks at the iU
2be60 73 65 46 6c 61 67 2e 20 20 49 66 20 69 55 73 65  seFlag.  If iUse
2be70 46 6c 61 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  Flag.      ** is
2be80 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2be90 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
2bea0 20 73 75 62 72 6f 75 74 69 6e 65 20 69 73 20 61   subroutine is a
2beb0 20 6e 6f 2d 6f 70 2e 20 20 49 66 0a 20 20 20 20   no-op.  If.    
2bec0 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73    ** the process
2bed0 69 6e 67 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  ing calls for th
2bee0 65 20 71 75 65 72 79 20 74 6f 20 61 62 6f 72 74  e query to abort
2bef0 2c 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  , this subroutin
2bf00 65 0a 20 20 20 20 20 20 2a 2a 20 69 6e 63 72 65  e.      ** incre
2bf10 6d 65 6e 74 73 20 74 68 65 20 69 41 62 6f 72 74  ments the iAbort
2bf20 46 6c 61 67 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  Flag memory loca
2bf30 74 69 6f 6e 20 62 65 66 6f 72 65 20 72 65 74 75  tion before retu
2bf40 72 6e 69 6e 67 20 69 6e 0a 20 20 20 20 20 20 2a  rning in.      *
2bf50 2a 20 6f 72 64 65 72 20 74 6f 20 73 69 67 6e 61  * order to signa
2bf60 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  l the caller to 
2bf70 61 62 6f 72 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  abort..      */.
2bf80 20 20 20 20 20 20 61 64 64 72 53 65 74 41 62 6f        addrSetAbo
2bf90 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
2bfa0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2bfb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2bfc0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
2bfd0 74 65 67 65 72 2c 20 31 2c 20 69 41 62 6f 72 74  teger, 1, iAbort
2bfe0 46 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62  Flag);.      Vdb
2bff0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 65  eComment((v, "se
2c000 74 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b  t abort flag"));
2c010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c020 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
2c030 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
2c040 52 6f 77 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Row);.      sqli
2c050 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
2c060 62 65 6c 28 76 2c 20 61 64 64 72 4f 75 74 70 75  bel(v, addrOutpu
2c070 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 61 64 64  tRow);.      add
2c080 72 4f 75 74 70 75 74 52 6f 77 20 3d 20 73 71 6c  rOutputRow = sql
2c090 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2c0a0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
2c0b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
2c0c0 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 55 73  v, OP_IfPos, iUs
2c0d0 65 46 6c 61 67 2c 20 61 64 64 72 4f 75 74 70 75  eFlag, addrOutpu
2c0e0 74 52 6f 77 2b 32 29 3b 0a 20 20 20 20 20 20 56  tRow+2);.      V
2c0f0 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2c100 47 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  Groupby result g
2c110 65 6e 65 72 61 74 6f 72 20 65 6e 74 72 79 20 70  enerator entry p
2c120 6f 69 6e 74 22 29 29 3b 0a 20 20 20 20 20 20 73  oint"));.      s
2c130 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
2c140 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72  (v, OP_Return, r
2c150 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  egOutputRow);.  
2c160 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
2c170 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
2c180 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2c190 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
2c1a0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48  False(pParse, pH
2c1b0 61 76 69 6e 67 2c 20 61 64 64 72 4f 75 74 70 75  aving, addrOutpu
2c1c0 74 52 6f 77 2b 31 2c 20 53 51 4c 49 54 45 5f 4a  tRow+1, SQLITE_J
2c1d0 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
2c1e0 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f    selectInnerLoo
2c1f0 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e  p(pParse, p, p->
2c200 70 45 4c 69 73 74 2c 20 2d 31 2c 20 70 4f 72 64  pEList, -1, pOrd
2c210 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20  erBy,.          
2c220 20 20 20 20 20 20 20 20 20 20 20 20 26 73 44 69              &sDi
2c230 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20  stinct, pDest,. 
2c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c250 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52       addrOutputR
2c260 6f 77 2b 31 2c 20 61 64 64 72 53 65 74 41 62 6f  ow+1, addrSetAbo
2c270 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rt);.      sqlit
2c280 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
2c290 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75  OP_Return, regOu
2c2a0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
2c2b0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2c2c0 22 65 6e 64 20 67 72 6f 75 70 62 79 20 72 65 73  "end groupby res
2c2d0 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 22 29 29  ult generator"))
2c2e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
2c2f0 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
2c300 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 73 65  e that will rese
2c310 74 20 74 68 65 20 67 72 6f 75 70 2d 62 79 20 61  t the group-by a
2c320 63 63 75 6d 75 6c 61 74 6f 72 0a 20 20 20 20 20  ccumulator.     
2c330 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
2c340 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2c350 6c 28 76 2c 20 61 64 64 72 52 65 73 65 74 29 3b  l(v, addrReset);
2c360 0a 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75  .      resetAccu
2c370 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
2c380 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
2c390 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c3a0 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2c3b0 2c 20 72 65 67 52 65 73 65 74 29 3b 0a 20 20 20  , regReset);.   
2c3c0 20 20 0a 20 20 20 20 7d 20 2f 2a 20 65 6e 64 69    .    } /* endi
2c3d0 66 20 70 47 72 6f 75 70 42 79 2e 20 20 42 65 67  f pGroupBy.  Beg
2c3e0 69 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  in aggregate que
2c3f0 72 69 65 73 20 77 69 74 68 6f 75 74 20 47 52 4f  ries without GRO
2c400 55 50 20 42 59 3a 20 2a 2f 0a 20 20 20 20 65 6c  UP BY: */.    el
2c410 73 65 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  se {.      ExprL
2c420 69 73 74 20 2a 70 44 65 6c 20 3d 20 30 3b 0a 23  ist *pDel = 0;.#
2c430 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2c440 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 0a 20 20  IT_BTREECOUNT.  
2c450 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
2c460 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62  .      if( (pTab
2c470 20 3d 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74   = isSimpleCount
2c480 28 70 2c 20 26 73 41 67 67 49 6e 66 6f 29 29 21  (p, &sAggInfo))!
2c490 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
2c4a0 20 49 66 20 69 73 53 69 6d 70 6c 65 43 6f 75 6e   If isSimpleCoun
2c4b0 74 28 29 20 72 65 74 75 72 6e 73 20 61 20 70 6f  t() returns a po
2c4c0 69 6e 74 65 72 20 74 6f 20 61 20 54 61 62 6c 65  inter to a Table
2c4d0 20 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 6e   structure, then
2c4e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2c4f0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73  SQL statement is
2c500 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
2c510 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2c520 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 75   **   SELECT cou
2c530 6e 74 28 2a 29 20 46 52 4f 4d 20 3c 74 62 6c 3e  nt(*) FROM <tbl>
2c540 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2c550 20 20 20 20 2a 2a 20 77 68 65 72 65 20 74 68 65      ** where the
2c560 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
2c570 20 72 65 74 75 72 6e 65 64 20 72 65 70 72 65 73   returned repres
2c580 65 6e 74 73 20 74 61 62 6c 65 20 3c 74 62 6c 3e  ents table <tbl>
2c590 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2c5a0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 73 74 61       ** This sta
2c5b0 74 65 6d 65 6e 74 20 69 73 20 73 6f 20 63 6f 6d  tement is so com
2c5c0 6d 6f 6e 20 74 68 61 74 20 69 74 20 69 73 20 6f  mon that it is o
2c5d0 70 74 69 6d 69 7a 65 64 20 73 70 65 63 69 61 6c  ptimized special
2c5e0 6c 79 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20  ly. The.        
2c5f0 2a 2a 20 4f 50 5f 43 6f 75 6e 74 20 69 6e 73 74  ** OP_Count inst
2c600 72 75 63 74 69 6f 6e 20 69 73 20 65 78 65 63 75  ruction is execu
2c610 74 65 64 20 65 69 74 68 65 72 20 6f 6e 20 74 68  ted either on th
2c620 65 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 20 74  e intkey table t
2c630 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
2c640 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
2c650 20 66 6f 72 20 74 61 62 6c 65 20 3c 74 62 6c 3e   for table <tbl>
2c660 20 6f 72 20 6f 6e 20 6f 6e 65 20 6f 66 20 69 74   or on one of it
2c670 73 20 69 6e 64 65 78 65 73 2e 20 49 74 0a 20 20  s indexes. It.  
2c680 20 20 20 20 20 20 2a 2a 20 69 73 20 62 65 74 74        ** is bett
2c690 65 72 20 74 6f 20 65 78 65 63 75 74 65 20 74 68  er to execute th
2c6a0 65 20 6f 70 20 6f 6e 20 61 6e 20 69 6e 64 65 78  e op on an index
2c6b0 2c 20 61 73 20 69 6e 64 65 78 65 73 20 61 72 65  , as indexes are
2c6c0 20 61 6c 6d 6f 73 74 0a 20 20 20 20 20 20 20 20   almost.        
2c6d0 2a 2a 20 61 6c 77 61 79 73 20 73 70 72 65 61 64  ** always spread
2c6e0 20 61 63 72 6f 73 73 20 6c 65 73 73 20 70 61 67   across less pag
2c6f0 65 73 20 74 68 61 6e 20 74 68 65 69 72 20 63 6f  es than their co
2c700 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c  rresponding tabl
2c710 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
2c720 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74         const int
2c730 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
2c740 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
2c750 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
2c760 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
2c770 63 6f 6e 73 74 20 69 6e 74 20 69 43 73 72 20 3d  const int iCsr =
2c780 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
2c790 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
2c7a0 6f 20 73 63 61 6e 20 62 2d 74 72 65 65 20 2a 2f  o scan b-tree */
2c7b0 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a  .        Index *
2c7c0 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c7e0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
2c7f0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 4b 65  le */.        Ke
2c800 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
2c810 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2c820 20 20 20 2f 2a 20 4b 65 79 69 6e 66 6f 20 66 6f     /* Keyinfo fo
2c830 72 20 73 63 61 6e 6e 65 64 20 69 6e 64 65 78 20  r scanned index 
2c840 2a 2f 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  */.        Index
2c850 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20   *pBest = 0;    
2c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c870 2f 2a 20 42 65 73 74 20 69 6e 64 65 78 20 66 6f  /* Best index fo
2c880 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  und so far */.  
2c890 20 20 20 20 20 20 69 6e 74 20 69 52 6f 6f 74 20        int iRoot 
2c8a0 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 20 20 20  = pTab->tnum;   
2c8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2c8c0 6f 74 20 70 61 67 65 20 6f 66 20 73 63 61 6e 6e  ot page of scann
2c8d0 65 64 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20  ed b-tree */..  
2c8e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
2c8f0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
2c900 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
2c910 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
2c920 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
2c930 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
2c940 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
2c950 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
2c960 68 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20  h for the index 
2c970 74 68 61 74 20 68 61 73 20 74 68 65 20 6c 6f 77  that has the low
2c980 65 73 74 20 73 63 61 6e 20 63 6f 73 74 2e 0a 20  est scan cost.. 
2c990 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2c9a0 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d 31 35    ** (2011-04-15
2c9b0 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20 66 75  ) Do not do a fu
2c9c0 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20 75 6e  ll scan of an un
2c9d0 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e 0a 20  ordered index.. 
2c9e0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2c9f0 20 20 2a 2a 20 28 32 30 31 33 2d 31 30 2d 30 33    ** (2013-10-03
2ca00 29 20 44 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 74  ) Do not count t
2ca10 68 65 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20  he entries in a 
2ca20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 2e 0a 20  partial index.. 
2ca30 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2ca40 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69 63 65    ** In practice
2ca50 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   the KeyInfo str
2ca60 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f 74 20  ucture will not 
2ca70 62 65 20 75 73 65 64 2e 20 49 74 20 69 73 20 6f  be used. It is o
2ca80 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  nly .        ** 
2ca90 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70 20 4f  passed to keep O
2caa0 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70 70 79  P_OpenRead happy
2cab0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2cac0 20 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77       if( !HasRow
2cad0 69 64 28 70 54 61 62 29 20 29 20 70 42 65 73 74  id(pTab) ) pBest
2cae0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
2caf0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
2cb00 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 49 64  .        for(pId
2cb10 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
2cb20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
2cb30 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
2cb40 20 20 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e     if( pIdx->bUn
2cb50 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20  ordered==0.     
2cb60 20 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 73        && pIdx->s
2cb70 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a  zIdxRow<pTab->sz
2cb80 54 61 62 52 6f 77 0a 20 20 20 20 20 20 20 20 20  TabRow.         
2cb90 20 20 26 26 20 70 49 64 78 2d 3e 70 50 61 72 74    && pIdx->pPart
2cba0 49 64 78 57 68 65 72 65 3d 3d 30 0a 20 20 20 20  IdxWhere==0.    
2cbb0 20 20 20 20 20 20 20 26 26 20 28 21 70 42 65 73         && (!pBes
2cbc0 74 20 7c 7c 20 70 49 64 78 2d 3e 73 7a 49 64 78  t || pIdx->szIdx
2cbd0 52 6f 77 3c 70 42 65 73 74 2d 3e 73 7a 49 64 78  Row<pBest->szIdx
2cbe0 52 6f 77 29 0a 20 20 20 20 20 20 20 20 20 20 29  Row).          )
2cbf0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42  {.            pB
2cc00 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
2cc10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cc20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  }.        if( pB
2cc30 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  est ){.         
2cc40 20 69 52 6f 6f 74 20 3d 20 70 42 65 73 74 2d 3e   iRoot = pBest->
2cc50 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  tnum;.          
2cc60 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pKeyInfo = sqlit
2cc70 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
2cc80 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29 3b  (pParse, pBest);
2cc90 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2cca0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72 65      /* Open a re
2ccb0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
2ccc0 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f 43  execute the OP_C
2ccd0 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65 20  ount, close the 
2cce0 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20 20  cursor. */.     
2ccf0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2cd00 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70  dOp4Int(v, OP_Op
2cd10 65 6e 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52  enRead, iCsr, iR
2cd20 6f 6f 74 2c 20 69 44 62 2c 20 31 29 3b 0a 20 20  oot, iDb, 1);.  
2cd30 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
2cd40 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
2cd50 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2cd60 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
2cd70 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f   *)pKeyInfo, P4_
2cd80 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
2cd90 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
2cda0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2cdb0 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43 73 72 2c   OP_Count, iCsr,
2cdc0 20 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b   sAggInfo.aFunc[
2cdd0 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  0].iMem);.      
2cde0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2cdf0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
2ce00 20 69 43 73 72 29 3b 0a 20 20 20 20 20 20 20 20   iCsr);.        
2ce10 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75  explainSimpleCou
2ce20 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  nt(pParse, pTab,
2ce30 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 7d   pBest);.      }
2ce40 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53  else.#endif /* S
2ce50 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
2ce60 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20 20 20 7b  COUNT */.      {
2ce70 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2ce80 6b 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  k if the query i
2ce90 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
2cea0 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 73 3a  following forms:
2ceb0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2cec0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
2ced0 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a  min(x) FROM ....
2cee0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c          **   SEL
2cef0 45 43 54 20 6d 61 78 28 78 29 20 46 52 4f 4d 20  ECT max(x) FROM 
2cf00 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ....        **. 
2cf10 20 20 20 20 20 20 20 2a 2a 20 49 66 20 69 74 20         ** If it 
2cf20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20 74 68 65  is, then ask the
2cf30 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65 2e 63   code in where.c
2cf40 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 73   to attempt to s
2cf50 6f 72 74 20 72 65 73 75 6c 74 73 0a 20 20 20 20  ort results.    
2cf60 20 20 20 20 2a 2a 20 61 73 20 69 66 20 74 68 65      ** as if the
2cf70 72 65 20 77 61 73 20 61 6e 20 22 4f 52 44 45 52  re was an "ORDER
2cf80 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52 44 45 52   ON x" or "ORDER
2cf90 20 4f 4e 20 78 20 44 45 53 43 22 20 63 6c 61 75   ON x DESC" clau
2cfa0 73 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  se. .        ** 
2cfb0 49 66 20 77 68 65 72 65 2e 63 20 69 73 20 61 62  If where.c is ab
2cfc0 6c 65 20 74 6f 20 70 72 6f 64 75 63 65 20 72 65  le to produce re
2cfd0 73 75 6c 74 73 20 73 6f 72 74 65 64 20 69 6e 20  sults sorted in 
2cfe0 74 68 69 73 20 6f 72 64 65 72 2c 20 74 68 65 6e  this order, then
2cff0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 20  .        ** add 
2d000 76 64 62 65 20 63 6f 64 65 20 74 6f 20 62 72 65  vdbe code to bre
2d010 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 70 72  ak out of the pr
2d020 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70 20 61 66  ocessing loop af
2d030 74 65 72 20 74 68 65 20 0a 20 20 20 20 20 20 20  ter the .       
2d040 20 2a 2a 20 66 69 72 73 74 20 69 74 65 72 61 74   ** first iterat
2d050 69 6f 6e 20 28 73 69 6e 63 65 20 74 68 65 20 66  ion (since the f
2d060 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  irst iteration o
2d070 66 20 74 68 65 20 6c 6f 6f 70 20 69 73 20 0a 20  f the loop is . 
2d080 20 20 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e         ** guaran
2d090 74 65 65 64 20 74 6f 20 6f 70 65 72 61 74 65 20  teed to operate 
2d0a0 6f 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 20  on the row with 
2d0b0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f 72 20 6d  the minimum or m
2d0c0 61 78 69 6d 75 6d 20 0a 20 20 20 20 20 20 20 20  aximum .        
2d0d0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78 2c 20 74  ** value of x, t
2d0e0 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72 65 71 75  he only row requ
2d0f0 69 72 65 64 29 2e 0a 20 20 20 20 20 20 20 20 2a  ired)..        *
2d100 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73  *.        ** A s
2d110 70 65 63 69 61 6c 20 66 6c 61 67 20 6d 75 73 74  pecial flag must
2d120 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 73 71   be passed to sq
2d130 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
2d140 29 20 74 6f 20 73 6c 69 67 68 74 6c 79 0a 20 20  ) to slightly.  
2d150 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 20        ** modify 
2d160 62 65 68 61 76 69 6f 72 20 61 73 20 66 6f 6c 6c  behavior as foll
2d170 6f 77 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ows:.        **.
2d180 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 49          **   + I
2d190 66 20 74 68 65 20 71 75 65 72 79 20 69 73 20 61  f the query is a
2d1a0 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 22   "SELECT min(x)"
2d1b0 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 6f 70 20  , then the loop 
2d1c0 63 6f 64 65 64 20 62 79 0a 20 20 20 20 20 20 20  coded by.       
2d1d0 20 2a 2a 20 20 20 20 20 77 68 65 72 65 2e 63 20   **     where.c 
2d1e0 73 68 6f 75 6c 64 20 6e 6f 74 20 69 74 65 72 61  should not itera
2d1f0 74 65 20 6f 76 65 72 20 61 6e 79 20 76 61 6c 75  te over any valu
2d200 65 73 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 76  es with a NULL v
2d210 61 6c 75 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  alue.        ** 
2d220 20 20 20 20 66 6f 72 20 78 2e 0a 20 20 20 20 20      for x..     
2d230 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2d240 20 20 20 2b 20 54 68 65 20 6f 70 74 69 6d 69 7a     + The optimiz
2d250 65 72 20 63 6f 64 65 20 69 6e 20 77 68 65 72 65  er code in where
2d260 2e 63 20 28 74 68 65 20 74 68 69 6e 67 20 74 68  .c (the thing th
2d270 61 74 20 64 65 63 69 64 65 73 20 77 68 69 63 68  at decides which
2d280 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2d290 69 6e 64 65 78 20 6f 72 20 69 6e 64 69 63 65 73  index or indices
2d2a0 20 74 6f 20 75 73 65 29 20 73 68 6f 75 6c 64 20   to use) should 
2d2b0 70 6c 61 63 65 20 61 20 64 69 66 66 65 72 65 6e  place a differen
2d2c0 74 20 70 72 69 6f 72 69 74 79 20 6f 6e 20 0a 20  t priority on . 
2d2d0 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 73 61         **     sa
2d2e0 74 69 73 66 79 69 6e 67 20 74 68 65 20 27 4f 52  tisfying the 'OR
2d2f0 44 45 52 20 42 59 27 20 63 6c 61 75 73 65 20 74  DER BY' clause t
2d300 68 61 6e 20 69 74 20 64 6f 65 73 20 69 6e 20 6f  han it does in o
2d310 74 68 65 72 20 63 61 73 65 73 2e 0a 20 20 20 20  ther cases..    
2d320 20 20 20 20 2a 2a 20 20 20 20 20 52 65 66 65 72      **     Refer
2d330 20 74 6f 20 63 6f 64 65 20 61 6e 64 20 63 6f 6d   to code and com
2d340 6d 65 6e 74 73 20 69 6e 20 77 68 65 72 65 2e 63  ments in where.c
2d350 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20   for details..  
2d360 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d370 20 45 78 70 72 4c 69 73 74 20 2a 70 4d 69 6e 4d   ExprList *pMinM
2d380 61 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ax = 0;.        
2d390 75 38 20 66 6c 61 67 20 3d 20 57 48 45 52 45 5f  u8 flag = WHERE_
2d3a0 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 0a  ORDERBY_NORMAL;.
2d3b0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2d3c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 47 72 6f   assert( p->pGro
2d3d0 75 70 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20  upBy==0 );.     
2d3e0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
2d3f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
2d400 28 20 70 2d 3e 70 48 61 76 69 6e 67 3d 3d 30 20  ( p->pHaving==0 
2d410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61  ){.          fla
2d420 67 20 3d 20 6d 69 6e 4d 61 78 51 75 65 72 79 28  g = minMaxQuery(
2d430 26 73 41 67 67 49 6e 66 6f 2c 20 26 70 4d 69 6e  &sAggInfo, &pMin
2d440 4d 61 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Max);.        }.
2d450 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d460 66 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 4d 69 6e  flag==0 || (pMin
2d470 4d 61 78 21 3d 30 20 26 26 20 70 4d 69 6e 4d 61  Max!=0 && pMinMa
2d480 78 2d 3e 6e 45 78 70 72 3d 3d 31 29 20 29 3b 0a  x->nExpr==1) );.
2d490 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61  .        if( fla
2d4a0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  g ){.          p
2d4b0 4d 69 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  MinMax = sqlite3
2d4c0 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20  ExprListDup(db, 
2d4d0 70 4d 69 6e 4d 61 78 2c 20 30 29 3b 0a 20 20 20  pMinMax, 0);.   
2d4e0 20 20 20 20 20 20 20 70 44 65 6c 20 3d 20 70 4d         pDel = pM
2d4f0 69 6e 4d 61 78 3b 0a 20 20 20 20 20 20 20 20 20  inMax;.         
2d500 20 69 66 28 20 70 4d 69 6e 4d 61 78 20 26 26 20   if( pMinMax && 
2d510 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
2d520 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
2d530 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73   pMinMax->a[0].s
2d540 6f 72 74 4f 72 64 65 72 20 3d 20 66 6c 61 67 21  ortOrder = flag!
2d550 3d 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  =WHERE_ORDERBY_M
2d560 49 4e 20 3f 31 3a 30 3b 0a 20 20 20 20 20 20 20  IN ?1:0;.       
2d570 20 20 20 20 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b       pMinMax->a[
2d580 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54  0].pExpr->op = T
2d590 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20  K_COLUMN;.      
2d5a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2d5b0 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68    .        /* Th
2d5c0 69 73 20 63 61 73 65 20 72 75 6e 73 20 69 66 20  is case runs if 
2d5d0 74 68 65 20 61 67 67 72 65 67 61 74 65 20 68 61  the aggregate ha
2d5e0 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c  s no GROUP BY cl
2d5f0 61 75 73 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ause.  The.     
2d600 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67     ** processing
2d610 20 69 73 20 6d 75 63 68 20 73 69 6d 70 6c 65 72   is much simpler
2d620 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20   since there is 
2d630 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 6f  only a single ro
2d640 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  w.        ** of 
2d650 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 20 20  output..        
2d660 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 74  */.        reset
2d670 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72  Accumulator(pPar
2d680 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a  se, &sAggInfo);.
2d690 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d          pWInfo =
2d6a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2d6b0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
2d6c0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4d 69  ist, pWhere, pMi
2d6d0 6e 4d 61 78 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a  nMax,0,flag,0);.
2d6e0 20 20 20 20 20 20 20 20 69 66 28 20 70 57 49 6e          if( pWIn
2d6f0 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  fo==0 ){.       
2d700 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
2d710 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  stDelete(db, pDe
2d720 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  l);.          go
2d730 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  to select_end;. 
2d740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d750 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
2d760 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
2d770 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 61  Info);.        a
2d780 73 73 65 72 74 28 20 70 4d 69 6e 4d 61 78 3d 3d  ssert( pMinMax==
2d790 30 20 7c 7c 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 || pMinMax->nE
2d7a0 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  xpr==1 );.      
2d7b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
2d7c0 72 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e  reIsOrdered(pWIn
2d7d0 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  fo) ){.         
2d7e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d7f0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
2d800 2c 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 72  , sqlite3WhereBr
2d810 65 61 6b 4c 61 62 65 6c 28 70 57 49 6e 66 6f 29  eakLabel(pWInfo)
2d820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62  );.          Vdb
2d830 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73  eComment((v, "%s
2d840 28 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20  () by index",.  
2d850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66                (f
2d860 6c 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52  lag==WHERE_ORDER
2d870 42 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61  BY_MIN?"min":"ma
2d880 78 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  x")));.        }
2d890 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d8a0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
2d8b0 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69  ;.        finali
2d8c0 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
2d8d0 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
2d8e0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2d8f0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
2d900 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
2d910 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
2d920 20 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e   pHaving, addrEn
2d930 64 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  d, SQLITE_JUMPIF
2d940 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
2d950 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2d960 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
2d970 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 0a 20 20  t, -1, 0, 0, .  
2d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d990 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72 45      pDest, addrE
2d9a0 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  nd, addrEnd);.  
2d9b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
2d9c0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  istDelete(db, pD
2d9d0 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  el);.    }.    s
2d9e0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2d9f0 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45 6e  eLabel(v, addrEn
2da00 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a 20  d);.    .  } /* 
2da10 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65 20  endif aggregate 
2da20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28 20  query */..  if( 
2da30 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
2da40 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49  ype==WHERE_DISTI
2da50 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 7b  NCT_UNORDERED ){
2da60 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d 70  .    explainTemp
2da70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22 44  Table(pParse, "D
2da80 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a 0a  ISTINCT");.  }..
2da90 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
2daa0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
2dab0 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65 65  use, then we nee
2dac0 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72 65  d to sort the re
2dad0 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20 73  sults.  ** and s
2dae0 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  end them to the 
2daf0 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79 20  callback one by 
2db00 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
2db10 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
2db20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2db30 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45 52 20  (pParse, "ORDER 
2db40 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72 61  BY");.    genera
2db50 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72 73  teSortTail(pPars
2db60 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74 2d  e, p, v, pEList-
2db70 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b 0a  >nExpr, pDest);.
2db80 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68    }..  /* Jump h
2db90 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69 73  ere to skip this
2dba0 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73 71   query.  */.  sq
2dbb0 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
2dbc0 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b 0a  Label(v, iEnd);.
2dbd0 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54  .  /* The SELECT
2dbe0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
2dbf0 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20 74  y coded.   Set t
2dc00 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  he return code t
2dc10 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69  o 0.  ** to indi
2dc20 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e 0a  cate no errors..
2dc30 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a 0a    */.  rc = 0;..
2dc40 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75 6d    /* Control jum
2dc50 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61 6e  ps to here if an
2dc60 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
2dc70 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72 20  tered above, or 
2dc80 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65 73  upon.  ** succes
2dc90 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20 74  sful coding of t
2dca0 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a  he SELECT..  */.
2dcb0 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65 78  select_end:.  ex
2dcc0 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
2dcd0 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
2dce0 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  d, iRestoreSelec
2dcf0 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65 6e  tId);..  /* Iden
2dd00 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  tify column name
2dd10 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66 20  s if results of 
2dd20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 74  the SELECT are t
2dd30 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a  o be output..  *
2dd40 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
2dd50 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d 3e  TE_OK && pDest->
2dd60 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
2dd70 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74  t ){.    generat
2dd80 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  eColumnNames(pPa
2dd90 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2dda0 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 73  EList);.  }..  s
2ddb0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2ddc0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29 3b   sAggInfo.aCol);
2ddd0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2dde0 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46  (db, sAggInfo.aF
2ddf0 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unc);.  return r
2de00 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  c;.}..#if define
2de10 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
2de20 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f 2a  TREE_EXPLAIN)./*
2de30 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  .** Generate a h
2de40 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64 65  uman-readable de
2de50 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 74  scription of a t
2de60 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  he Select object
2de70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2de80 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63   explainOneSelec
2de90 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  t(Vdbe *pVdbe, S
2dea0 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71 6c  elect *p){.  sql
2deb0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2dec0 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43 54  f(pVdbe, "SELECT
2ded0 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65   ");.  if( p->se
2dee0 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73  lFlags & (SF_Dis
2def0 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61  tinct|SF_Aggrega
2df00 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  te) ){.    if( p
2df10 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2df20 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
2df30 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2df40 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 44  Printf(pVdbe, "D
2df50 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20 20  ISTINCT ");.    
2df60 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  }.    if( p->sel
2df70 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65  Flags & SF_Aggre
2df80 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71  gate ){.      sq
2df90 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2dfa0 74 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f 66  tf(pVdbe, "agg_f
2dfb0 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20  lag ");.    }.  
2dfc0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2dfd0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73  NL(pVdbe);.    s
2dfe0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2dff0 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20 20 22  ntf(pVdbe, "   "
2e000 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
2e010 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2e020 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73 74  pVdbe, p->pEList
2e030 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c  );.  sqlite3Expl
2e040 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2e050 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20 70  if( p->pSrc && p
2e060 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a  ->pSrc->nSrc ){.
2e070 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
2e080 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2e090 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f 4d  ntf(pVdbe, "FROM
2e0a0 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2e0b0 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64 62  ExplainPush(pVdb
2e0c0 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  e);.    for(i=0;
2e0d0 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
2e0e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
2e0f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2e100 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
2e110 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
2e120 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e130 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b 25  rintf(pVdbe, "{%
2e140 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d 2d  d,*} = ", pItem-
2e150 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
2e160 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
2e170 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
2e180 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c  qlite3ExplainSel
2e190 65 63 74 28 70 56 64 62 65 2c 20 70 49 74 65 6d  ect(pVdbe, pItem
2e1a0 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
2e1b0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
2e1c0 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
2e1d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e1e0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28  rintf(pVdbe, " (
2e1f0 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70 49  tabname=%s)", pI
2e200 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
2e210 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 74     }else if( pIt
2e230 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  em->zName ){.   
2e240 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
2e250 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2e260 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e   "%s", pItem->zN
2e270 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
2e280 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
2e290 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
2e2a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e2b0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 28  rintf(pVdbe, " (
2e2c0 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  AS %s)", pItem->
2e2d0 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
2e2e0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
2e2f0 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
2e300 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LEFT ){.        
2e310 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2e320 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c 45  intf(pVdbe, " LE
2e330 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20 20  FT-JOIN");.     
2e340 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2e350 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2e360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2e370 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56  te3ExplainPop(pV
2e380 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  dbe);.  }.  if( 
2e390 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20 20  p->pWhere ){.   
2e3a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e3b0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57 48  rintf(pVdbe, "WH
2e3c0 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  ERE ");.    sqli
2e3d0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2e3e0 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65 29  Vdbe, p->pWhere)
2e3f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2e400 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2e410 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72 6f   }.  if( p->pGro
2e420 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  upBy ){.    sqli
2e430 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2e440 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42 59  (pVdbe, "GROUPBY
2e450 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
2e460 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
2e470 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75 70  pVdbe, p->pGroup
2e480 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
2e490 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
2e4a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
2e4b0 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73 71  Having ){.    sq
2e4c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2e4d0 74 66 28 70 56 64 62 65 2c 20 22 48 41 56 49 4e  tf(pVdbe, "HAVIN
2e4e0 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  G ");.    sqlite
2e4f0 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64  3ExplainExpr(pVd
2e500 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b  be, p->pHaving);
2e510 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2e520 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20  ainNL(pVdbe);.  
2e530 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
2e540 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  rBy ){.    sqlit
2e550 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2e560 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59 20  pVdbe, "ORDERBY 
2e570 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
2e580 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70  xplainExprList(p
2e590 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72 42  Vdbe, p->pOrderB
2e5a0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  y);.    sqlite3E
2e5b0 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2e5c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4c  .  }.  if( p->pL
2e5d0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
2e5e0 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2e5f0 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20 22  (pVdbe, "LIMIT "
2e600 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2e610 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
2e620 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
2e630 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2e640 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
2e650 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20 29  if( p->pOffset )
2e660 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2e670 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2e680 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20 20  , "OFFSET ");.  
2e690 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e6a0 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
2e6b0 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c  Offset);.    sql
2e6c0 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2e6d0 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  dbe);.  }.}.void
2e6e0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
2e6f0 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64 62  elect(Vdbe *pVdb
2e700 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
2e710 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
2e720 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e730 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28 6e  rintf(pVdbe, "(n
2e740 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a 20  ull-select)");. 
2e750 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2e760 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e770 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77 68  ush(pVdbe);.  wh
2e780 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65 78  ile( p ){.    ex
2e790 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 70  plainOneSelect(p
2e7a0 56 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70 20  Vdbe, p);.    p 
2e7b0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
2e7c0 69 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61 6b  if( p==0 ) break
2e7d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2e7e0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
2e7f0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e800 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2e810 25 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70 4e  %s\n", selectOpN
2e820 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 7d  ame(p->op));.  }
2e830 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2e840 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
2e850 45 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  END");.  sqlite3
2e860 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65  ExplainPop(pVdbe
2e870 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66 20  );.}../* End of 
2e880 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64 65  the structure de
2e890 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f 64  bug printing cod
2e8a0 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
2e8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e8d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2e8f0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
2e900 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2e910 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20 2a  _TREE_EXPLAIN) *
2e920 2f 0a                                            /.