/ Hex Artifact Content
Login

Artifact 9dc9177bfb9278a603e3835e828ff60ec68fba6f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  fset);.  sqlite3
0400: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0410: 2d 3e 70 57 69 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pWith);.}../*.
0420: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0430: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0440: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0450: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0460: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0470: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0480: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0490: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
04a0: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
04b0: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
04c0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04d0: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
04e0: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
04f0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0500: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0510: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0520: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0530: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0540: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0550: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0560: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0570: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0580: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0590: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
05a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
05b0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
05c0: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
05d0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
05e0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
05f0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0600: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0610: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0620: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0630: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0640: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0650: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0660: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0670: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0680: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0690: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
06a0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
06b0: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
06c0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
06d0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
06e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
06f0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0700: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0710: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0720: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0730: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0740: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0750: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0760: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0770: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0780: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0790: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
07a0: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
07b0: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07c0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07d0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07f0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0810: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0820: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0830: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0840: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0850: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0860: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0870: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0880: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0890: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
08a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
08b0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08c0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08d0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0900: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0910: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0920: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0930: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0940: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0950: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0960: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0970: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0980: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0990: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
09a0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09c0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09e0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09f0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0a00: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
0a10: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a20: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a30: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
0a40: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
0a50: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
0a60: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
0a70: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
0a80: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
0a90: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
0aa0: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
0ab0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0ac0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0ad0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ae0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0af0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0b00: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  ] = -1;.  if( db
0b10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0b20: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
0b30: 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ct(db, pNew);.  
0b40: 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61    if( pNew!=&sta
0b50: 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62  ndin ) sqlite3Db
0b60: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
0b70: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
0b80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
0b90: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
0ba0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
0bb0: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
0bc0: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
0bd0: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
0be0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0bf0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0c00: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0c10: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0c20: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0c40: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0c50: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0c60: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0c70: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0c80: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0c90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0ca0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
0cb0: 65 6e 20 31 20 74 6f 20 33 20 69 64 65 6e 74 69  en 1 to 3 identi
0cc0: 66 69 65 72 73 20 70 72 65 63 65 64 69 6e 67 20  fiers preceding 
0cd0: 74 68 65 20 4a 4f 49 4e 20 6b 65 79 77 6f 72 64  the JOIN keyword
0ce0: 2c 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 0a  , determine the.
0cf0: 2a 2a 20 74 79 70 65 20 6f 66 20 6a 6f 69 6e 2e  ** type of join.
0d00: 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
0d10: 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ger constant tha
0d20: 74 20 65 78 70 72 65 73 73 65 73 20 74 68 61 74  t expresses that
0d30: 20 74 79 70 65 0a 2a 2a 20 69 6e 20 74 65 72 6d   type.** in term
0d40: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
0d50: 6e 67 20 62 69 74 20 76 61 6c 75 65 73 3a 0a 2a  ng bit values:.*
0d60: 2a 0a 2a 2a 20 20 20 20 20 4a 54 5f 49 4e 4e 45  *.**     JT_INNE
0d70: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 43 52 4f 53  R.**     JT_CROS
0d80: 53 0a 2a 2a 20 20 20 20 20 4a 54 5f 4f 55 54 45  S.**     JT_OUTE
0d90: 52 0a 2a 2a 20 20 20 20 20 4a 54 5f 4e 41 54 55  R.**     JT_NATU
0da0: 52 41 4c 0a 2a 2a 20 20 20 20 20 4a 54 5f 4c 45  RAL.**     JT_LE
0db0: 46 54 0a 2a 2a 20 20 20 20 20 4a 54 5f 52 49 47  FT.**     JT_RIG
0dc0: 48 54 0a 2a 2a 0a 2a 2a 20 41 20 66 75 6c 6c 20  HT.**.** A full 
0dd0: 6f 75 74 65 72 20 6a 6f 69 6e 20 69 73 20 74 68  outer join is th
0de0: 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  e combination of
0df0: 20 4a 54 5f 4c 45 46 54 20 61 6e 64 20 4a 54 5f   JT_LEFT and JT_
0e00: 52 49 47 48 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  RIGHT..**.** If 
0e10: 61 6e 20 69 6c 6c 65 67 61 6c 20 6f 72 20 75 6e  an illegal or un
0e20: 73 75 70 70 6f 72 74 65 64 20 6a 6f 69 6e 20 74  supported join t
0e30: 79 70 65 20 69 73 20 73 65 65 6e 2c 20 74 68 65  ype is seen, the
0e40: 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 0a 2a  n still return.*
0e50: 2a 20 61 20 6a 6f 69 6e 20 74 79 70 65 2c 20 62  * a join type, b
0e60: 75 74 20 70 75 74 20 61 6e 20 65 72 72 6f 72 20  ut put an error 
0e70: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
0e80: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20  ructure..*/.int 
0e90: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
0ea0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
0eb0: 6f 6b 65 6e 20 2a 70 41 2c 20 54 6f 6b 65 6e 20  oken *pA, Token 
0ec0: 2a 70 42 2c 20 54 6f 6b 65 6e 20 2a 70 43 29 7b  *pB, Token *pC){
0ed0: 0a 20 20 69 6e 74 20 6a 6f 69 6e 74 79 70 65 20  .  int jointype 
0ee0: 3d 20 30 3b 0a 20 20 54 6f 6b 65 6e 20 2a 61 70  = 0;.  Token *ap
0ef0: 41 6c 6c 5b 33 5d 3b 0a 20 20 54 6f 6b 65 6e 20  All[3];.  Token 
0f00: 2a 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  *p;.            
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f20: 20 2f 2a 20 20 20 30 31 32 33 34 35 36 37 38 39   /*   0123456789
0f30: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 34 35   123456789 12345
0f40: 36 37 38 39 20 31 32 33 20 2a 2f 0a 20 20 73 74  6789 123 */.  st
0f50: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
0f60: 7a 4b 65 79 54 65 78 74 5b 5d 20 3d 20 22 6e 61  zKeyText[] = "na
0f70: 74 75 72 61 6c 65 66 74 6f 75 74 65 72 69 67 68  turaleftouterigh
0f80: 74 66 75 6c 6c 69 6e 6e 65 72 63 72 6f 73 73 22  tfullinnercross"
0f90: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
0fa0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 75 38   struct {.    u8
0fb0: 20 69 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65   i;        /* Be
0fc0: 67 69 6e 6e 69 6e 67 20 6f 66 20 6b 65 79 77 6f  ginning of keywo
0fd0: 72 64 20 74 65 78 74 20 69 6e 20 7a 4b 65 79 54  rd text in zKeyT
0fe0: 65 78 74 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ext[] */.    u8 
0ff0: 6e 43 68 61 72 3b 20 20 20 20 2f 2a 20 4c 65 6e  nChar;    /* Len
1000: 67 74 68 20 6f 66 20 74 68 65 20 6b 65 79 77 6f  gth of the keywo
1010: 72 64 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  rd in characters
1020: 20 2a 2f 0a 20 20 20 20 75 38 20 63 6f 64 65 3b   */.    u8 code;
1030: 20 20 20 20 20 2f 2a 20 4a 6f 69 6e 20 74 79 70       /* Join typ
1040: 65 20 6d 61 73 6b 20 2a 2f 0a 20 20 7d 20 61 4b  e mask */.  } aK
1050: 65 79 77 6f 72 64 5b 5d 20 3d 20 7b 0a 20 20 20  eyword[] = {.   
1060: 20 2f 2a 20 6e 61 74 75 72 61 6c 20 2a 2f 20 7b   /* natural */ {
1070: 20 30 2c 20 20 37 2c 20 4a 54 5f 4e 41 54 55 52   0,  7, JT_NATUR
1080: 41 4c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AL              
1090: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 6c 65 66 74    },.    /* left
10a0: 20 20 20 20 2a 2f 20 7b 20 36 2c 20 20 34 2c 20      */ { 6,  4, 
10b0: 4a 54 5f 4c 45 46 54 7c 4a 54 5f 4f 55 54 45 52  JT_LEFT|JT_OUTER
10c0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
10d0: 20 2f 2a 20 6f 75 74 65 72 20 20 20 2a 2f 20 7b   /* outer   */ {
10e0: 20 31 30 2c 20 35 2c 20 4a 54 5f 4f 55 54 45 52   10, 5, JT_OUTER
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 7d 2c 0a 20 20 20 20 2f 2a 20 72 69 67 68    },.    /* righ
1110: 74 20 20 20 2a 2f 20 7b 20 31 34 2c 20 35 2c 20  t   */ { 14, 5, 
1120: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1130: 52 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  R         },.   
1140: 20 2f 2a 20 66 75 6c 6c 20 20 20 20 2a 2f 20 7b   /* full    */ {
1150: 20 31 39 2c 20 34 2c 20 4a 54 5f 4c 45 46 54 7c   19, 4, JT_LEFT|
1160: 4a 54 5f 52 49 47 48 54 7c 4a 54 5f 4f 55 54 45  JT_RIGHT|JT_OUTE
1170: 52 20 7d 2c 0a 20 20 20 20 2f 2a 20 69 6e 6e 65  R },.    /* inne
1180: 72 20 20 20 2a 2f 20 7b 20 32 33 2c 20 35 2c 20  r   */ { 23, 5, 
1190: 4a 54 5f 49 4e 4e 45 52 20 20 20 20 20 20 20 20  JT_INNER        
11a0: 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
11b0: 20 2f 2a 20 63 72 6f 73 73 20 20 20 2a 2f 20 7b   /* cross   */ {
11c0: 20 32 38 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52   28, 5, JT_INNER
11d0: 7c 4a 54 5f 43 52 4f 53 53 20 20 20 20 20 20 20  |JT_CROSS       
11e0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
11f0: 69 2c 20 6a 3b 0a 20 20 61 70 41 6c 6c 5b 30 5d  i, j;.  apAll[0]
1200: 20 3d 20 70 41 3b 0a 20 20 61 70 41 6c 6c 5b 31   = pA;.  apAll[1
1210: 5d 20 3d 20 70 42 3b 0a 20 20 61 70 41 6c 6c 5b  ] = pB;.  apAll[
1220: 32 5d 20 3d 20 70 43 3b 0a 20 20 66 6f 72 28 69  2] = pC;.  for(i
1230: 3d 30 3b 20 69 3c 33 20 26 26 20 61 70 41 6c 6c  =0; i<3 && apAll
1240: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  [i]; i++){.    p
1250: 20 3d 20 61 70 41 6c 6c 5b 69 5d 3b 0a 20 20 20   = apAll[i];.   
1260: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61   for(j=0; j<Arra
1270: 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64 29 3b  ySize(aKeyword);
1280: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
1290: 20 70 2d 3e 6e 3d 3d 61 4b 65 79 77 6f 72 64 5b   p->n==aKeyword[
12a0: 6a 5d 2e 6e 43 68 61 72 20 0a 20 20 20 20 20 20  j].nChar .      
12b0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
12c0: 72 4e 49 43 6d 70 28 28 63 68 61 72 2a 29 70 2d  rNICmp((char*)p-
12d0: 3e 7a 2c 20 26 7a 4b 65 79 54 65 78 74 5b 61 4b  >z, &zKeyText[aK
12e0: 65 79 77 6f 72 64 5b 6a 5d 2e 69 5d 2c 20 70 2d  eyword[j].i], p-
12f0: 3e 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >n)==0 ){.      
1300: 20 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 61 4b    jointype |= aK
1310: 65 79 77 6f 72 64 5b 6a 5d 2e 63 6f 64 65 3b 0a  eyword[j].code;.
1320: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1340: 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 30 20   testcase( j==0 
1350: 7c 7c 20 6a 3d 3d 31 20 7c 7c 20 6a 3d 3d 32 20  || j==1 || j==2 
1360: 7c 7c 20 6a 3d 3d 33 20 7c 7c 20 6a 3d 3d 34 20  || j==3 || j==4 
1370: 7c 7c 20 6a 3d 3d 35 20 7c 7c 20 6a 3d 3d 36 20  || j==5 || j==6 
1380: 29 3b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 41 72  );.    if( j>=Ar
1390: 72 61 79 53 69 7a 65 28 61 4b 65 79 77 6f 72 64  raySize(aKeyword
13a0: 29 20 29 7b 0a 20 20 20 20 20 20 6a 6f 69 6e 74  ) ){.      joint
13b0: 79 70 65 20 7c 3d 20 4a 54 5f 45 52 52 4f 52 3b  ype |= JT_ERROR;
13c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 0a 20 20    }.  }.  if(.  
13e0: 20 20 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28     (jointype & (
13f0: 4a 54 5f 49 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45  JT_INNER|JT_OUTE
1400: 52 29 29 3d 3d 28 4a 54 5f 49 4e 4e 45 52 7c 4a  R))==(JT_INNER|J
1410: 54 5f 4f 55 54 45 52 29 20 7c 7c 0a 20 20 20 20  T_OUTER) ||.    
1420: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f   (jointype & JT_
1430: 45 52 52 4f 52 29 21 3d 30 0a 20 20 29 7b 0a 20  ERROR)!=0.  ){. 
1440: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1450: 53 70 20 3d 20 22 20 22 3b 0a 20 20 20 20 61 73  Sp = " ";.    as
1460: 73 65 72 74 28 20 70 42 21 3d 30 20 29 3b 0a 20  sert( pB!=0 );. 
1470: 20 20 20 69 66 28 20 70 43 3d 3d 30 20 29 7b 20     if( pC==0 ){ 
1480: 7a 53 70 2b 2b 3b 20 7d 0a 20 20 20 20 73 71 6c  zSp++; }.    sql
1490: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14a0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 72  rse, "unknown or
14b0: 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a 6f 69   unsupported joi
14c0: 6e 20 74 79 70 65 3a 20 22 0a 20 20 20 20 20 20  n type: ".      
14d0: 20 22 25 54 20 25 54 25 73 25 54 22 2c 20 70 41   "%T %T%s%T", pA
14e0: 2c 20 70 42 2c 20 7a 53 70 2c 20 70 43 29 3b 0a  , pB, zSp, pC);.
14f0: 20 20 20 20 6a 6f 69 6e 74 79 70 65 20 3d 20 4a      jointype = J
1500: 54 5f 49 4e 4e 45 52 3b 0a 20 20 7d 65 6c 73 65  T_INNER;.  }else
1510: 20 69 66 28 20 28 6a 6f 69 6e 74 79 70 65 20 26   if( (jointype &
1520: 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30 20 0a 20   JT_OUTER)!=0 . 
1530: 20 20 20 20 20 20 20 20 26 26 20 28 6a 6f 69 6e          && (join
1540: 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c  type & (JT_LEFT|
1550: 4a 54 5f 52 49 47 48 54 29 29 21 3d 4a 54 5f 4c  JT_RIGHT))!=JT_L
1560: 45 46 54 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  EFT ){.    sqlit
1570: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1580: 65 2c 20 0a 20 20 20 20 20 20 22 52 49 47 48 54  e, .      "RIGHT
1590: 20 61 6e 64 20 46 55 4c 4c 20 4f 55 54 45 52 20   and FULL OUTER 
15a0: 4a 4f 49 4e 73 20 61 72 65 20 6e 6f 74 20 63 75  JOINs are not cu
15b0: 72 72 65 6e 74 6c 79 20 73 75 70 70 6f 72 74 65  rrently supporte
15c0: 64 22 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  d");.    jointyp
15d0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
15e0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6f 69 6e 74  }.  return joint
15f0: 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ype;.}../*.** Re
1600: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
1610: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
1620: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 2d  table.  Return -
1630: 31 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 0a  1 if the column.
1640: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  ** is not contai
1650: 6e 65 64 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ned in the table
1660: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1670: 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 54 61 62 6c  columnIndex(Tabl
1680: 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73 74 20 63  e *pTab, const c
1690: 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 6e  har *zCol){.  in
16a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
16b0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
16c0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
16d0: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
16e0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[i].zName, 
16f0: 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72  zCol)==0 ) retur
1700: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1710: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n -1;.}../*.** S
1720: 65 61 72 63 68 20 74 68 65 20 66 69 72 73 74 20  earch the first 
1730: 4e 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  N tables in pSrc
1740: 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72  , from left to r
1750: 69 67 68 74 2c 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ight, looking fo
1760: 72 20 61 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61  r a.** table tha
1770: 74 20 68 61 73 20 61 20 63 6f 6c 75 6d 6e 20 6e  t has a column n
1780: 61 6d 65 64 20 7a 43 6f 6c 2e 20 20 0a 2a 2a 0a  amed zCol.  .**.
1790: 2a 2a 20 57 68 65 6e 20 66 6f 75 6e 64 2c 20 73  ** When found, s
17a0: 65 74 20 2a 70 69 54 61 62 20 61 6e 64 20 2a 70  et *piTab and *p
17b0: 69 43 6f 6c 20 74 6f 20 74 68 65 20 74 61 62 6c  iCol to the tabl
17c0: 65 20 69 6e 64 65 78 20 61 6e 64 20 63 6f 6c 75  e index and colu
17d0: 6d 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 74  mn index.** of t
17e0: 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  he matching colu
17f0: 6d 6e 20 61 6e 64 20 72 65 74 75 72 6e 20 54 52  mn and return TR
1800: 55 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 74  UE..**.** If not
1810: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 46   found, return F
1820: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
1830: 69 6e 74 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75  int tableAndColu
1840: 6d 6e 49 6e 64 65 78 28 0a 20 20 53 72 63 4c 69  mnIndex(.  SrcLi
1850: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
1860: 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 62 6c  /* Array of tabl
1870: 65 73 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  es to search */.
1880: 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20 20    int N,        
1890: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18a0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 70 53   of tables in pS
18b0: 72 63 2d 3e 61 5b 5d 20 74 6f 20 73 65 61 72 63  rc->a[] to searc
18c0: 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  h */.  const cha
18d0: 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e  r *zCol,    /* N
18e0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
18f0: 6e 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  n we are looking
1900: 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   for */.  int *p
1910: 69 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 2f  iTab,          /
1920: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
1930: 20 70 53 72 63 2d 3e 61 5b 5d 20 68 65 72 65 20   pSrc->a[] here 
1940: 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43 6f 6c 20  */.  int *piCol 
1950: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1960: 74 65 20 69 6e 64 65 78 20 6f 66 20 70 53 72 63  te index of pSrc
1970: 2d 3e 61 5b 2a 70 69 54 61 62 5d 2e 70 54 61 62  ->a[*piTab].pTab
1980: 2d 3e 61 43 6f 6c 5b 5d 20 68 65 72 65 20 2a 2f  ->aCol[] here */
1990: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
19a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
19b0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
19c0: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 20 2a 2f  ables in pSrc */
19d0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
19e0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
19f0: 20 6f 66 20 63 6f 6c 75 6d 6e 20 6d 61 74 63 68   of column match
1a00: 69 6e 67 20 7a 43 6f 6c 20 2a 2f 0a 0a 20 20 61  ing zCol */..  a
1a10: 73 73 65 72 74 28 20 28 70 69 54 61 62 3d 3d 30  ssert( (piTab==0
1a20: 29 3d 3d 28 70 69 43 6f 6c 3d 3d 30 29 20 29 3b  )==(piCol==0) );
1a30: 20 20 2f 2a 20 42 6f 74 68 20 6f 72 20 6e 65 69    /* Both or nei
1a40: 74 68 65 72 20 61 72 65 20 4e 55 4c 4c 20 2a 2f  ther are NULL */
1a50: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b  .  for(i=0; i<N;
1a60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 43 6f 6c 20   i++){.    iCol 
1a70: 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  = columnIndex(pS
1a80: 72 63 2d 3e 61 5b 69 5d 2e 70 54 61 62 2c 20 7a  rc->a[i].pTab, z
1a90: 43 6f 6c 29 3b 0a 20 20 20 20 69 66 28 20 69 43  Col);.    if( iC
1aa0: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ol>=0 ){.      i
1ab0: 66 28 20 70 69 54 61 62 20 29 7b 0a 20 20 20 20  f( piTab ){.    
1ac0: 20 20 20 20 2a 70 69 54 61 62 20 3d 20 69 3b 0a      *piTab = i;.
1ad0: 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d          *piCol =
1ae0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iCol;.      }. 
1af0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1b00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1b10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
1b20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1b30: 73 65 64 20 74 6f 20 61 64 64 20 74 65 72 6d 73  sed to add terms
1b40: 20 69 6d 70 6c 69 65 64 20 62 79 20 4a 4f 49 4e   implied by JOIN
1b50: 20 73 79 6e 74 61 78 20 74 6f 20 74 68 65 0a 2a   syntax to the.*
1b60: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 65  * WHERE clause e
1b70: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 61 20 53  xpression of a S
1b80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
1b90: 20 54 68 65 20 6e 65 77 20 74 65 72 6d 2c 20 77   The new term, w
1ba0: 68 69 63 68 0a 2a 2a 20 69 73 20 41 4e 44 65 64  hich.** is ANDed
1bb0: 20 77 69 74 68 20 74 68 65 20 65 78 69 73 74 69   with the existi
1bc0: 6e 67 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  ng WHERE clause,
1bd0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   is of the form:
1be0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 74 61 62 31 2e  .**.**    (tab1.
1bf0: 63 6f 6c 31 20 3d 20 74 61 62 32 2e 63 6f 6c 32  col1 = tab2.col2
1c00: 29 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 74 61  ).**.** where ta
1c10: 62 31 20 69 73 20 74 68 65 20 69 53 72 63 27 74  b1 is the iSrc't
1c20: 68 20 74 61 62 6c 65 20 69 6e 20 53 72 63 4c 69  h table in SrcLi
1c30: 73 74 20 70 53 72 63 20 61 6e 64 20 74 61 62 32  st pSrc and tab2
1c40: 20 69 73 20 74 68 65 20 0a 2a 2a 20 28 69 53 72   is the .** (iSr
1c50: 63 2b 31 29 27 74 68 2e 20 43 6f 6c 75 6d 6e 20  c+1)'th. Column 
1c60: 63 6f 6c 31 20 69 73 20 63 6f 6c 75 6d 6e 20 69  col1 is column i
1c70: 43 6f 6c 4c 65 66 74 20 6f 66 20 74 61 62 31 2c  ColLeft of tab1,
1c80: 20 61 6e 64 20 63 6f 6c 32 20 69 73 0a 2a 2a 20   and col2 is.** 
1c90: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 52 69 67 68 74  column iColRight
1ca0: 20 6f 66 20 74 61 62 32 2e 0a 2a 2f 0a 73 74 61   of tab2..*/.sta
1cb0: 74 69 63 20 76 6f 69 64 20 61 64 64 57 68 65 72  tic void addWher
1cc0: 65 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a  eTerm(.  Parse *
1cd0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1cf0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1d00: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
1d30: 65 73 20 69 6e 20 46 52 4f 4d 20 63 6c 61 75 73  es in FROM claus
1d40: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 66 74  e */.  int iLeft
1d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d60: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1d70: 6f 66 20 66 69 72 73 74 20 74 61 62 6c 65 20 74  of first table t
1d80: 6f 20 6a 6f 69 6e 20 69 6e 20 70 53 72 63 20 2a  o join in pSrc *
1d90: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 4c 65 66 74  /.  int iColLeft
1da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1db0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1dc0: 63 6f 6c 75 6d 6e 20 69 6e 20 66 69 72 73 74 20  column in first 
1dd0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
1de0: 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
1df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1e00: 64 65 78 20 6f 66 20 73 65 63 6f 6e 64 20 74 61  dex of second ta
1e10: 62 6c 65 20 69 6e 20 70 53 72 63 20 2a 2f 0a 20  ble in pSrc */. 
1e20: 20 69 6e 74 20 69 43 6f 6c 52 69 67 68 74 2c 20   int iColRight, 
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
1e50: 75 6d 6e 20 69 6e 20 73 65 63 6f 6e 64 20 74 61  umn in second ta
1e60: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4f  ble */.  int isO
1e70: 75 74 65 72 4a 6f 69 6e 2c 20 20 20 20 20 20 20  uterJoin,       
1e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1e90: 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 4f   if this is an O
1ea0: 55 54 45 52 20 6a 6f 69 6e 20 2a 2f 0a 20 20 45  UTER join */.  E
1eb0: 78 70 72 20 2a 2a 70 70 57 68 65 72 65 20 20 20  xpr **ppWhere   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ed0: 2a 20 49 4e 2f 4f 55 54 3a 20 54 68 65 20 57 48  * IN/OUT: The WH
1ee0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 61 64  ERE clause to ad
1ef0: 64 20 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  d to */.){.  sql
1f00: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1f10: 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 20 2a 70  e->db;.  Expr *p
1f20: 45 31 3b 0a 20 20 45 78 70 72 20 2a 70 45 32 3b  E1;.  Expr *pE2;
1f30: 0a 20 20 45 78 70 72 20 2a 70 45 71 3b 0a 0a 20  .  Expr *pEq;.. 
1f40: 20 61 73 73 65 72 74 28 20 69 4c 65 66 74 3c 69   assert( iLeft<i
1f50: 52 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72  Right );.  asser
1f60: 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3e 69 52  t( pSrc->nSrc>iR
1f70: 69 67 68 74 20 29 3b 0a 20 20 61 73 73 65 72 74  ight );.  assert
1f80: 28 20 70 53 72 63 2d 3e 61 5b 69 4c 65 66 74 5d  ( pSrc->a[iLeft]
1f90: 2e 70 54 61 62 20 29 3b 0a 20 20 61 73 73 65 72  .pTab );.  asser
1fa0: 74 28 20 70 53 72 63 2d 3e 61 5b 69 52 69 67 68  t( pSrc->a[iRigh
1fb0: 74 5d 2e 70 54 61 62 20 29 3b 0a 0a 20 20 70 45  t].pTab );..  pE
1fc0: 31 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  1 = sqlite3Creat
1fd0: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c 20  eColumnExpr(db, 
1fe0: 70 53 72 63 2c 20 69 4c 65 66 74 2c 20 69 43 6f  pSrc, iLeft, iCo
1ff0: 6c 4c 65 66 74 29 3b 0a 20 20 70 45 32 20 3d 20  lLeft);.  pE2 = 
2000: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
2010: 75 6d 6e 45 78 70 72 28 64 62 2c 20 70 53 72 63  umnExpr(db, pSrc
2020: 2c 20 69 52 69 67 68 74 2c 20 69 43 6f 6c 52 69  , iRight, iColRi
2030: 67 68 74 29 3b 0a 0a 20 20 70 45 71 20 3d 20 73  ght);..  pEq = s
2040: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
2050: 73 65 2c 20 54 4b 5f 45 51 2c 20 70 45 31 2c 20  se, TK_EQ, pE1, 
2060: 70 45 32 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  pE2, 0);.  if( p
2070: 45 71 20 26 26 20 69 73 4f 75 74 65 72 4a 6f 69  Eq && isOuterJoi
2080: 6e 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  n ){.    ExprSet
2090: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20a0: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
20b0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
20c0: 50 72 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50  Property(pEq, EP
20d0: 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65  _TokenOnly|EP_Re
20e0: 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78  duced) );.    Ex
20f0: 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74 79  prSetVVAProperty
2100: 28 70 45 71 2c 20 45 50 5f 4e 6f 52 65 64 75 63  (pEq, EP_NoReduc
2110: 65 29 3b 0a 20 20 20 20 70 45 71 2d 3e 69 52 69  e);.    pEq->iRi
2120: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
2130: 69 31 36 29 70 45 32 2d 3e 69 54 61 62 6c 65 3b  i16)pE2->iTable;
2140: 0a 20 20 7d 0a 20 20 2a 70 70 57 68 65 72 65 20  .  }.  *ppWhere 
2150: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64  = sqlite3ExprAnd
2160: 28 64 62 2c 20 2a 70 70 57 68 65 72 65 2c 20 70  (db, *ppWhere, p
2170: 45 71 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  Eq);.}../*.** Se
2180: 74 20 74 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69  t the EP_FromJoi
2190: 6e 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 61 6c  n property on al
21a0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 67  l terms of the g
21b0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  iven expression.
21c0: 0a 2a 2a 20 41 6e 64 20 73 65 74 20 74 68 65 20  .** And set the 
21d0: 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54  Expr.iRightJoinT
21e0: 61 62 6c 65 20 74 6f 20 69 54 61 62 6c 65 20 66  able to iTable f
21f0: 6f 72 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  or every term in
2200: 20 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69   the.** expressi
2210: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 50  on..**.** The EP
2220: 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72  _FromJoin proper
2230: 74 79 20 69 73 20 75 73 65 64 20 6f 6e 20 74 65  ty is used on te
2240: 72 6d 73 20 6f 66 20 61 6e 20 65 78 70 72 65 73  rms of an expres
2250: 73 69 6f 6e 20 74 6f 20 74 65 6c 6c 0a 2a 2a 20  sion to tell.** 
2260: 74 68 65 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  the LEFT OUTER J
2270: 4f 49 4e 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  OIN processing l
2280: 6f 67 69 63 20 74 68 61 74 20 74 68 69 73 20 74  ogic that this t
2290: 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66 20 74  erm is part of t
22a0: 68 65 0a 2a 2a 20 6a 6f 69 6e 20 72 65 73 74 72  he.** join restr
22b0: 69 63 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64  iction specified
22c0: 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53   in the ON or US
22d0: 49 4e 47 20 63 6c 61 75 73 65 20 61 6e 64 20 6e  ING clause and n
22e0: 6f 74 20 61 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ot a part.** of 
22f0: 74 68 65 20 6d 6f 72 65 20 67 65 6e 65 72 61 6c  the more general
2300: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
2310: 54 68 65 73 65 20 74 65 72 6d 73 20 61 72 65 20  These terms are 
2320: 6d 6f 76 65 64 20 6f 76 65 72 20 74 6f 20 74 68  moved over to th
2330: 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  e.** WHERE claus
2340: 65 20 64 75 72 69 6e 67 20 6a 6f 69 6e 20 70 72  e during join pr
2350: 6f 63 65 73 73 69 6e 67 20 62 75 74 20 77 65 20  ocessing but we 
2360: 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
2370: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 6f 72   that they.** or
2380: 69 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20  iginated in the 
2390: 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75  ON or USING clau
23a0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  se..**.** The Ex
23b0: 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  pr.iRightJoinTab
23c0: 6c 65 20 74 65 6c 6c 73 20 74 68 65 20 57 48 45  le tells the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
23e0: 73 69 6e 67 20 74 68 61 74 20 74 68 65 0a 2a 2a  sing that the.**
23f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70 65   expression depe
2400: 6e 64 73 20 6f 6e 20 74 61 62 6c 65 20 69 52 69  nds on table iRi
2410: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 65 76 65  ghtJoinTable eve
2420: 6e 20 69 66 20 74 68 61 74 20 74 61 62 6c 65 20  n if that table 
2430: 69 73 20 6e 6f 74 0a 2a 2a 20 65 78 70 6c 69 63  is not.** explic
2440: 69 74 6c 79 20 6d 65 6e 74 69 6f 6e 65 64 20 69  itly mentioned i
2450: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
2460: 2e 20 20 54 68 61 74 20 69 6e 66 6f 72 6d 61 74  .  That informat
2470: 69 6f 6e 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a  ion is needed.**
2480: 20 66 6f 72 20 63 61 73 65 73 20 6c 69 6b 65 20   for cases like 
2490: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53  this:.**.**    S
24a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
24b0: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
24c0: 74 31 2e 61 3d 74 32 2e 62 20 41 4e 44 20 74 31  t1.a=t2.b AND t1
24d0: 2e 78 3d 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  .x=5.**.** The w
24e0: 68 65 72 65 20 63 6c 61 75 73 65 20 6e 65 65 64  here clause need
24f0: 73 20 74 6f 20 64 65 66 65 72 20 74 68 65 20 68  s to defer the h
2500: 61 6e 64 6c 69 6e 67 20 6f 66 20 74 68 65 20 74  andling of the t
2510: 31 2e 78 3d 35 0a 2a 2a 20 74 65 72 6d 20 75 6e  1.x=5.** term un
2520: 74 69 6c 20 61 66 74 65 72 20 74 68 65 20 74 32  til after the t2
2530: 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 6a 6f 69   loop of the joi
2540: 6e 2e 20 20 49 6e 20 74 68 61 74 20 77 61 79 2c  n.  In that way,
2550: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 74 32 20 72 6f   a.** NULL t2 ro
2560: 77 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  w will be insert
2570: 65 64 20 77 68 65 6e 65 76 65 72 20 74 31 2e 78  ed whenever t1.x
2580: 21 3d 35 2e 20 20 49 66 20 77 65 20 64 6f 20 6e  !=5.  If we do n
2590: 6f 74 0a 2a 2a 20 64 65 66 65 72 20 74 68 65 20  ot.** defer the 
25a0: 68 61 6e 64 6c 69 6e 67 20 6f 66 20 74 31 2e 78  handling of t1.x
25b0: 3d 35 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 70  =5, it will be p
25c0: 72 6f 63 65 73 73 65 64 20 69 6d 6d 65 64 69 61  rocessed immedia
25d0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 74 68  tely.** after th
25e0: 65 20 74 31 20 6c 6f 6f 70 20 61 6e 64 20 72 6f  e t1 loop and ro
25f0: 77 73 20 77 69 74 68 20 74 31 2e 78 21 3d 35 20  ws with t1.x!=5 
2600: 77 69 6c 6c 20 6e 65 76 65 72 20 61 70 70 65 61  will never appea
2610: 72 20 69 6e 0a 2a 2a 20 74 68 65 20 6f 75 74 70  r in.** the outp
2620: 75 74 2c 20 77 68 69 63 68 20 69 73 20 69 6e 63  ut, which is inc
2630: 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
2640: 63 20 76 6f 69 64 20 73 65 74 4a 6f 69 6e 45 78  c void setJoinEx
2650: 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  pr(Expr *p, int 
2660: 69 54 61 62 6c 65 29 7b 0a 20 20 77 68 69 6c 65  iTable){.  while
2670: 28 20 70 20 29 7b 0a 20 20 20 20 45 78 70 72 53  ( p ){.    ExprS
2680: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
2690: 5f 46 72 6f 6d 4a 6f 69 6e 29 3b 0a 20 20 20 20  _FromJoin);.    
26a0: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
26b0: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
26c0: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
26d0: 63 65 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72  ced) );.    Expr
26e0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
26f0: 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a  , EP_NoReduce);.
2700: 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f 69      p->iRightJoi
2710: 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69 54  nTable = (i16)iT
2720: 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f 69  able;.    setJoi
2730: 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c 20  nExpr(p->pLeft, 
2740: 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20 3d  iTable);.    p =
2750: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d 20   p->pRight;.  } 
2760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2770: 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65 73  outine processes
2780: 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72 6d   the join inform
2790: 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c 45  ation for a SELE
27a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CT statement..**
27b0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
27c0: 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65 72  auses are conver
27d0: 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20 74  ted into extra t
27e0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
27f0: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41 54  E clause..** NAT
2800: 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f 20  URAL joins also 
2810: 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48 45  create extra WHE
2820: 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 2e  RE clause terms.
2830: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 73  .**.** The terms
2840: 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   of a FROM claus
2850: 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  e are contained 
2860: 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70 53  in the Select.pS
2870: 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  rc structure..**
2880: 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20 74   The left most t
2890: 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72 73  able is the firs
28a0: 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65 63  t entry in Selec
28b0: 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69 67  t.pSrc.  The rig
28c0: 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c 65  ht-most.** table
28d0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e 74   is the last ent
28e0: 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f 70  ry.  The join op
28f0: 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20 69  erator is held i
2900: 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a 2a  n the entry to.*
2910: 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68 75  * the left.  Thu
2920: 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61 69  s entry 0 contai
2930: 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ns the join oper
2940: 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 69  ator for the joi
2950: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e 74  n between.** ent
2960: 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20 41  ries 0 and 1.  A
2970: 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  ny ON or USING c
2980: 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74 65  lauses associate
2990: 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e 20  d with the join 
29a0: 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74 61  are.** also atta
29b0: 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
29c0: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
29d0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
29e0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
29f0: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
2a00: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
2a10: 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73  nt sqliteProcess
2a20: 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61 72  Join(Parse *pPar
2a30: 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  se, Select *p){.
2a40: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73 20    /* All tables 
2a70: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a80: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  se */.  int i, j
2a90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2aa0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2ab0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73 74  counters */.  st
2ac0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ad0: 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f 2a  m *pLeft;     /*
2ae0: 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69 6e   Left table bein
2af0: 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73 74  g joined */.  st
2b00: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b10: 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a  m *pRight;    /*
2b20: 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65 69   Right table bei
2b30: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20 20  ng joined */..  
2b40: 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
2b50: 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63 2d    pLeft = &pSrc-
2b60: 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74 20  >a[0];.  pRight 
2b70: 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20 66  = &pLeft[1];.  f
2b80: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
2b90: 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52 69  nSrc-1; i++, pRi
2ba0: 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29 7b  ght++, pLeft++){
2bb0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65 66  .    Table *pLef
2bc0: 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70 54  tTab = pLeft->pT
2bd0: 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ab;.    Table *p
2be0: 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67 68  RightTab = pRigh
2bf0: 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e 74  t->pTab;.    int
2c00: 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20 69   isOuter;..    i
2c10: 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54 61  f( NEVER(pLeftTa
2c20: 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54 61  b==0 || pRightTa
2c30: 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65  b==0) ) continue
2c40: 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d 20  ;.    isOuter = 
2c50: 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70  (pRight->jointyp
2c60: 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d 30  e & JT_OUTER)!=0
2c70: 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 74  ;..    /* When t
2c80: 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  he NATURAL keywo
2c90: 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20 61  rd is present, a
2ca0: 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  dd WHERE clause 
2cb0: 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a 2a  terms for.    **
2cc0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74 68   every column th
2cd0: 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  at the two table
2ce0: 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f 6e  s have in common
2cf0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2d00: 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79 70   pRight->jointyp
2d10: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
2d20: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  {.      if( pRig
2d30: 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67 68  ht->pOn || pRigh
2d40: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
2d50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
2d70: 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61 79  NATURAL join may
2d80: 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20 20   not have ".    
2d90: 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f 72         "an ON or
2da0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c 20   USING clause", 
2db0: 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
2dc0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
2dd0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2de0: 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b 20  RightTab->nCol; 
2df0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
2e00: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
2e10: 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 69  Name of column i
2e20: 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  n the right tabl
2e30: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
2e40: 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20 4d   iLeft;     /* M
2e50: 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61 62  atching left tab
2e60: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
2e70: 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a 20  t iLeftCol;  /* 
2e80: 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  Matching column 
2e90: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
2ea0: 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e  e */..        zN
2eb0: 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62 2d  ame = pRightTab-
2ec0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
2ed0: 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62 6c          if( tabl
2ee0: 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28  eAndColumnIndex(
2ef0: 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65  pSrc, i+1, zName
2f00: 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74  , &iLeft, &iLeft
2f10: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
2f20: 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28 70    addWhereTerm(p
2f30: 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65  Parse, pSrc, iLe
2f40: 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b  ft, iLeftCol, i+
2f50: 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20 20  1, j,.          
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
2f70: 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72 65  uter, &p->pWhere
2f80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f90: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2fa0: 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74 68  /* Disallow both
2fb0: 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
2fc0: 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61 6d  auses in the sam
2fd0: 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20 20  e join.    */.  
2fe0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f    if( pRight->pO
2ff0: 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55 73  n && pRight->pUs
3000: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ing ){.      sql
3010: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3020: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61 76  rse, "cannot hav
3030: 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  e both ON and US
3040: 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22 63  ING ".        "c
3050: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
3060: 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20 20  me join");.     
3070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3080: 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
3090: 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74 68   ON clause to th
30a0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
30b0: 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e 65  RE clause, conne
30c0: 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 61  cted by.    ** a
30d0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
30e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
30f0: 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20 20  Right->pOn ){.  
3100: 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72 20      if( isOuter 
3110: 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 52  ) setJoinExpr(pR
3120: 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67 68  ight->pOn, pRigh
3130: 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  t->iCursor);.   
3140: 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73     p->pWhere = s
3150: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
3160: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57 68  arse->db, p->pWh
3170: 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f 6e  ere, pRight->pOn
3180: 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 2d  );.      pRight-
3190: 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  >pOn = 0;.    }.
31a0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 65  .    /* Create e
31b0: 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74 68  xtra terms on th
31c0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  e WHERE clause f
31d0: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6e  or each column n
31e0: 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 74  amed.    ** in t
31f0: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e  he USING clause.
3200: 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74 68    Example: If th
3210: 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f 20  e two tables to 
3220: 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a 20  be joined are . 
3230: 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61 6e     ** A and B an
3240: 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  d the USING clau
3250: 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20 61  se names X, Y, a
3260: 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20 74  nd Z, then add t
3270: 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  his.    ** to th
3280: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a 20  e WHERE clause: 
3290: 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20 41     A.X=B.X AND A
32a0: 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d 42  .Y=B.Y AND A.Z=B
32b0: 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72 74  .Z.    ** Report
32c0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
32d0: 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e 65   column mentione
32e0: 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  d in the USING c
32f0: 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a 20  lause is.    ** 
3300: 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  not contained in
3310: 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f 20   both tables to 
3320: 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20 2a  be joined..    *
3330: 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  /.    if( pRight
3340: 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20  ->pUsing ){.    
3350: 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 20    IdList *pList 
3360: 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67  = pRight->pUsing
3370: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3380: 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 6a   j<pList->nId; j
3390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
33a0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
33b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 72   Name of the ter
33c0: 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  m in the USING c
33d0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  lause */.       
33e0: 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20 20   int iLeft;     
33f0: 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74 68    /* Table on th
3400: 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74 63  e left with matc
3410: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
3420: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
3430: 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a 20  iLeftCol;    /* 
3440: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
3450: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
3460: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a   on the left */.
3470: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69 67          int iRig
3480: 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c 75  htCol;   /* Colu
3490: 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61 74  mn number of mat
34a0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e 20  ching column on 
34b0: 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20 20  the right */..  
34c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 4c        zName = pL
34d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
34e0: 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74 43  .        iRightC
34f0: 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65 78  ol = columnIndex
3500: 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61 6d  (pRightTab, zNam
3510: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3520: 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20 20  iRightCol<0.    
3530: 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41 6e       || !tableAn
3540: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53 72  dColumnIndex(pSr
3550: 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20 26  c, i+1, zName, &
3560: 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f 6c  iLeft, &iLeftCol
3570: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
3580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
3590: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
35a0: 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69 6e  cannot join usin
35b0: 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63 6f  g column %s - co
35c0: 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20 20  lumn ".         
35d0: 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74 20     "not present 
35e0: 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22 2c  in both tables",
35f0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
3600: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
3620: 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61 72  ddWhereTerm(pPar
3630: 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74 2c  se, pSrc, iLeft,
3640: 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c 20   iLeftCol, i+1, 
3650: 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20 20  iRightCol,.     
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68  isOuter, &p->pWh
3680: 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ere);.      }.  
3690: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
36a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73   0;.}../*.** Ins
36b0: 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22 76  ert code into "v
36c0: 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  " that will push
36d0: 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20 74   the record on t
36e0: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a 2a  he top of the.**
36f0: 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65 20   stack into the 
3700: 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  sorter..*/.stati
3710: 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f 53  c void pushOntoS
3720: 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20 2a  orter(.  Parse *
3730: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
3740: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
3750: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
3760: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f 2a  *pOrderBy,    /*
3770: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
3780: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
3790: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
37a0: 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53 45   /* The whole SE
37b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
37c0: 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61 20  /.  int regData 
37d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
37e0: 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 64  gister holding d
37f0: 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ata to be sorted
3800: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
3810: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
3820: 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20  ;.  int nExpr = 
3830: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
3840: 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20 3d  .  int regBase =
3850: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
3860: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45 78  ange(pParse, nEx
3870: 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65 67  pr+2);.  int reg
3880: 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
3890: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
38a0: 65 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20  e);.  int op;.  
38b0: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
38c0: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
38d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
38e0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
38f0: 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42 61   pOrderBy, regBa
3900: 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  se, 0);.  sqlite
3910: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3920: 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72 64  P_Sequence, pOrd
3930: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
3940: 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b 0a  regBase+nExpr);.
3950: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
3960: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
3970: 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b 6e  gData, regBase+n
3980: 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73 71  Expr+1, 1);.  sq
3990: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
39a0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
39b0: 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70 72  , regBase, nExpr
39c0: 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64 29   + 2, regRecord)
39d0: 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d  ;.  if( pSelect-
39e0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55  >selFlags & SF_U
39f0: 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20  seSorter ){.    
3a00: 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49 6e  op = OP_SorterIn
3a10: 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  sert;.  }else{. 
3a20: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49 6e     op = OP_IdxIn
3a30: 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  sert;.  }.  sqli
3a40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
3a50: 20 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69   op, pOrderBy->i
3a60: 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63 6f  ECursor, regReco
3a70: 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  rd);.  sqlite3Re
3a80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
3a90: 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
3aa0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
3ab0: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
3ac0: 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  e, regBase, nExp
3ad0: 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  r+2);.  if( pSel
3ae0: 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20  ect->iLimit ){. 
3af0: 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64     int addr1, ad
3b00: 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69  dr2;.    int iLi
3b10: 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53 65  mit;.    if( pSe
3b20: 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29 7b  lect->iOffset ){
3b30: 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  .      iLimit = 
3b40: 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74  pSelect->iOffset
3b50: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
3b60: 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70 53       iLimit = pS
3b70: 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a 20  elect->iLimit;. 
3b80: 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20 3d     }.    addr1 =
3b90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
3ba0: 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p1(v, OP_IfZero,
3bb0: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71   iLimit);.    sq
3bc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3bd0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69 4c  v, OP_AddImm, iL
3be0: 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20 61  imit, -1);.    a
3bf0: 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
3c00: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 47  beAddOp0(v, OP_G
3c10: 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oto);.    sqlite
3c20: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
3c30: 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71 6c   addr1);.    sql
3c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
3c50: 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64 65  , OP_Last, pOrde
3c60: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
3c70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3c80: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65  ddOp1(v, OP_Dele
3c90: 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45  te, pOrderBy->iE
3ca0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c  Cursor);.    sql
3cb0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
3cc0: 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d 0a  (v, addr2);.  }.
3cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64  }../*.** Add cod
3ce0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
3cf0: 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74 61  he OFFSET.*/.sta
3d00: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66 66  tic void codeOff
3d10: 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c 20  set(.  Vdbe *v, 
3d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
3d30: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
3d40: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c 65  his VM */.  Sele
3d50: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f 2a  ct *p,        /*
3d60: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
3d70: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
3d80: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e 74  d */.  int iCont
3d90: 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d 70  inue     /* Jump
3da0: 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68   here to skip th
3db0: 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72 64  e current record
3dc0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
3dd0: 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e 74  iOffset && iCont
3de0: 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20 69  inue!=0 ){.    i
3df0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71 6c  nt addr;.    sql
3e00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3e10: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d 3e  , OP_AddImm, p->
3e20: 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20 20  iOffset, -1);.  
3e30: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
3e40: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
3e50: 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66 73  _IfNeg, p->iOffs
3e60: 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  et);.    sqlite3
3e70: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
3e80: 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74 69  _Goto, 0, iConti
3e90: 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43 6f  nue);.    VdbeCo
3ea0: 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70 20  mment((v, "skip 
3eb0: 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22 29  OFFSET records")
3ec0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
3ed0: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
3ee0: 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  dr);.  }.}../*.*
3ef0: 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74 20  * Add code that 
3f00: 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d 61  will check to ma
3f10: 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72 65  ke sure the N re
3f20: 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67  gisters starting
3f30: 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72 6d   at iMem.** form
3f40: 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74 72   a distinct entr
3f50: 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73 6f  y.  iTab is a so
3f60: 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61 74  rting index that
3f70: 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73 6c   holds previousl
3f80: 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69 6e  y.** seen combin
3f90: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e 20  ations of the N 
3fa0: 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20 65  values.  A new e
3fb0: 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e 20  ntry is made in 
3fc0: 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20 63  iTab.** if the c
3fd0: 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73 20  urrent N values 
3fe0: 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20 41  are new..**.** A
3ff0: 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65 70   jump to addrRep
4000: 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64 20  eat is made and 
4010: 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20 61  the N+1 values a
4020: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
4030: 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20 74  he.** stack if t
4040: 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e 74  he top N element
4050: 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69 6e  s are not distin
4060: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
4070: 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74 28  id codeDistinct(
4080: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4090: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
40a0: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
40b0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
40c0: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
40d0: 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69 6e       /* A sortin
40e0: 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  g index used to 
40f0: 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e 63  test for distinc
4100: 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 61  tness */.  int a
4110: 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f 2a  ddrRepeat,    /*
4120: 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69 66   Jump to here if
4130: 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a 2f   not distinct */
4140: 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
4150: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4160: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  of elements */. 
4170: 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20 20   int iMem       
4180: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c 65      /* First ele
4190: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  ment */.){.  Vdb
41a0: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b 0a  e *v;.  int r1;.
41b0: 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  v = pParse->p
41c0: 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71 6c  Vdbe;.  r1 = sql
41d0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
41e0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
41f0: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
4200: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61 62  , OP_Found, iTab
4210: 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69 4d  , addrRepeat, iM
4220: 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74 65  em, N);.  sqlite
4230: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4240: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69 4d  P_MakeRecord, iM
4250: 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73 71  em, N, r1);.  sq
4260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
4270: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
4280: 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73 71   iTab, r1);.  sq
4290: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
42a0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
42b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
42c0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
42d0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
42e0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
42f0: 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20 69   when a SELECT i
4300: 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20  s used within a 
4310: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
4320: 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20 49   (example:  "a I
4330: 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
4340: 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69 74   table)") but it
4350: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 31   has more than 1
4360: 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75 6d   result.** colum
4370: 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20 69  n.  We do this i
4380: 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 62  n a subroutine b
4390: 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f 72  ecause the error
43a0: 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a 2a   used to occur.*
43b0: 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c  * in multiple pl
43c0: 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72 6f  aces.  (The erro
43d0: 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 6e  r only occurs in
43e0: 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c 20   one place now, 
43f0: 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69 6e  but we.** retain
4400: 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20   the subroutine 
4410: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64 65  to minimize code
4420: 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a 2f   disruption.).*/
4430: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
4440: 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e 53  kForMultiColumnS
4450: 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50 61  electError(.  Pa
4460: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4470: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
4480: 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ext. */.  Select
4490: 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 2f  Dest *pDest,   /
44a0: 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f 66  * Destination of
44b0: 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73 20   SELECT results 
44c0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 20  */.  int nExpr  
44d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
44e0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
44f0: 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
4500: 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a 20  y SELECT */.){. 
4510: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
4520: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66 28  st->eDest;.  if(
4530: 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44 65   nExpr>1 && (eDe
4540: 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20 65  st==SRT_Mem || e
4550: 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20 29  Dest==SRT_Set) )
4560: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
4570: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
4580: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65 73  nly a single res
4590: 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20  ult allowed for 
45a0: 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c 45  ".       "a SELE
45b0: 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74 20  CT that is part 
45c0: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
45d0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ");.    return 1
45e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
45f0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 23  eturn 0;.  }.}.#
4600: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  endif../*.** An 
4610: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
4620: 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63 74  following object
4630: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 63 6f   is used to reco
4640: 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  rd information a
4650: 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20 70  bout.** how to p
4660: 72 6f 63 65 73 73 20 74 68 65 20 44 49 53 54 49  rocess the DISTI
4670: 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f 20  NCT keyword, to 
4680: 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e 67  simplify passing
4690: 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f   that informatio
46a0: 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73 65  n.** into the se
46b0: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29 20  lectInnerLoop() 
46c0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65  routine..*/.type
46d0: 64 65 66 20 73 74 72 75 63 74 20 44 69 73 74 69  def struct Disti
46e0: 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63 74 43  nctCtx DistinctC
46f0: 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74 69  tx;.struct Disti
4700: 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69 73  nctCtx {.  u8 is
4710: 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54 72  Tnct;      /* Tr
4720: 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  ue if the DISTIN
4730: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72  CT keyword is pr
4740: 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65 54  esent */.  u8 eT
4750: 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f 6e  nctType;   /* On
4760: 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 44  e of the WHERE_D
4770: 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61 74  ISTINCT_* operat
4780: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62  ors */.  int tab
4790: 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68 65  Tnct;    /* Ephe
47a0: 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65 64  meral table used
47b0: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
47c0: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
47d0: 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f 2a  t addrTnct;   /*
47e0: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f   Address of OP_O
47f0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70 63  penEphemeral opc
4800: 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74 20  ode for tabTnct 
4810: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.};../*.** Thi
4820: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
4830: 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f 72  tes the code for
4840: 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20 74   the inside of t
4850: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
4860: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a 2a   of a SELECT..**
4870: 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61 6e  .** If srcTab an
4880: 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62 6f  d nColumn are bo
4890: 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  th zero, then th
48a0: 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73 73  e pEList express
48b0: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61 6c  ions.** are eval
48c0: 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  uated in order t
48d0: 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20 66  o get the data f
48e0: 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49 66  or this row.  If
48f0: 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74 68   nColumn>0.** th
4900: 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c 65  en data is pulle
4910: 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61 6e  d from srcTab an
4920: 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65 64  d pEList is used
4930: 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68 65   only to get the
4940: 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66 6f  .** datatypes fo
4950: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  r each column..*
4960: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
4970: 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a 20  lectInnerLoop(. 
4980: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4990: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
49a0: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
49b0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
49d0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c 65  he complete sele
49e0: 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  ct statement bei
49f0: 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45 78  ng coded */.  Ex
4a00: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
4a10: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
4a20: 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65 78   values being ex
4a30: 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e 74  tracted */.  int
4a40: 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20 20   srcTab,        
4a50: 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61 74       /* Pull dat
4a60: 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62 6c  a from this tabl
4a70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  e */.  int nColu
4a80: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  mn,            /
4a90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
4aa0: 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72 63  mns in the sourc
4ab0: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  e table */.  Exp
4ac0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
4ad0: 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e       /* If not N
4ae0: 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74  ULL, sort result
4af0: 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79  s using this key
4b00: 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74   */.  DistinctCt
4b10: 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a  x *pDistinct, /*
4b20: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e   If not NULL, in
4b30: 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f  fo on how to pro
4b40: 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  cess DISTINCT */
4b50: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
4b60: 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f  Dest,      /* Ho
4b70: 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20  w to dispose of 
4b80: 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20  the results */. 
4b90: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20   int iContinue, 
4ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
4bb0: 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75   here to continu
4bc0: 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20  e with next row 
4bd0: 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20  */.  int iBreak 
4be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4bf0: 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65  Jump here to bre
4c00: 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e  ak out of the in
4c10: 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20  ner loop */.){. 
4c20: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
4c30: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
4c40: 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74  i;.  int hasDist
4c50: 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  inct;        /* 
4c60: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
4c70: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
4c80: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
4c90: 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20   regResult;     
4ca0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72           /* Star
4cb0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64  t of memory hold
4cc0: 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a  ing result set *
4cd0: 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20  /.  int eDest = 
4ce0: 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20  pDest->eDest;   
4cf0: 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73  /* How to dispos
4d00: 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a  e of results */.
4d10: 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44    int iParm = pD
4d20: 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a  est->iSDParm; /*
4d30: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
4d40: 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68  to disposal meth
4d50: 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73  od */.  int nRes
4d60: 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  ultCol;         
4d70: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4d80: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
4d90: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  */..  assert( v 
4da0: 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 76  );.  if( NEVER(v
4db0: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ==0) ) return;. 
4dc0: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
4dd0: 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74 69  =0 );.  hasDisti
4de0: 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74 20  nct = pDistinct 
4df0: 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e  ? pDistinct->eTn
4e00: 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f 44  ctType : WHERE_D
4e10: 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20  ISTINCT_NOOP;.  
4e20: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
4e30: 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74 20  && !hasDistinct 
4e40: 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73 65  ){.    codeOffse
4e50: 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e 75  t(v, p, iContinu
4e60: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75  e);.  }..  /* Pu
4e70: 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ll the requested
4e80: 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20   columns..  */. 
4e90: 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20 29   if( nColumn>0 )
4ea0: 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f 6c  {.    nResultCol
4eb0: 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d 65   = nColumn;.  }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74  lse{.    nResult
4ed0: 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45  Col = pEList->nE
4ee0: 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  xpr;.  }.  if( p
4ef0: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
4f00: 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  {.    pDest->iSd
4f10: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
4f20: 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  m+1;.    pDest->
4f30: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
4f40: 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ol;.    pParse->
4f50: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
4f60: 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20  ol;.  }else{ .  
4f70: 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
4f80: 3e 6e 53 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43  >nSdst==nResultC
4f90: 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52  ol );.  }.  regR
4fa0: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
4fb0: 53 64 73 74 3b 0a 20 20 69 66 28 20 6e 43 6f 6c  Sdst;.  if( nCol
4fc0: 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f 72  umn>0 ){.    for
4fd0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e 3b  (i=0; i<nColumn;
4fe0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
4ff0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5000: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72 63  , OP_Column, src
5010: 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75 6c  Tab, i, regResul
5020: 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  t+i);.    }.  }e
5030: 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d 53  lse if( eDest!=S
5040: 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20 20  RT_Exists ){.   
5050: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
5060: 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58 49  nation is an EXI
5070: 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73 73  STS(...) express
5080: 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c 0a  ion, the actual.
5090: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72 65      ** values re
50a0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 45  turned by the SE
50b0: 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65 71  LECT are not req
50c0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
50d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
50e0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
50f0: 2c 20 70 45 4c 69 73 74 2c 20 72 65 67 52 65 73  , pEList, regRes
5100: 75 6c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ult,.           
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74   (eDest==SRT_Out
5130: 70 75 74 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c  put)?SQLITE_ECEL
5140: 5f 44 55 50 3a 30 29 3b 0a 20 20 7d 0a 20 20 6e  _DUP:0);.  }.  n
5150: 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 75 6c 74  Column = nResult
5160: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Col;..  /* If th
5170: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
5180: 72 64 20 77 61 73 20 70 72 65 73 65 6e 74 20 6f  rd was present o
5190: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
51a0: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20  tement.  ** and 
51b0: 74 68 69 73 20 72 6f 77 20 68 61 73 20 62 65 65  this row has bee
51c0: 6e 20 73 65 65 6e 20 62 65 66 6f 72 65 2c 20 74  n seen before, t
51d0: 68 65 6e 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20  hen do not make 
51e0: 74 68 69 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61  this row.  ** pa
51f0: 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  rt of the result
5200: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 68 61 73  ..  */.  if( has
5210: 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
5220: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
5230: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
5240: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
5250: 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 73  nColumn );.    s
5260: 77 69 74 63 68 28 20 70 44 69 73 74 69 6e 63 74  witch( pDistinct
5270: 2d 3e 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20  ->eTnctType ){. 
5280: 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f       case WHERE_
5290: 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
52a0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65  : {.        Vdbe
52b0: 4f 70 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20  Op *pOp;        
52c0: 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72      /* No longer
52d0: 20 72 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70   required OpenEp
52e0: 68 65 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a  hemeral instr. *
52f0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a  /.        int iJ
5300: 75 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  ump;            
5310: 20 20 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e    /* Jump destin
5320: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
5330: 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
5340: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
5350: 69 6f 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74  ious row content
5360: 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   */..        /* 
5370: 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
5380: 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  or the previous 
5390: 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  row */.        r
53a0: 65 67 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d  egPrev = pParse-
53b0: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20  >nMem+1;.       
53c0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
53d0: 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 20 20 20   nColumn;..     
53e0: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
53f0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
5400: 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72 20  l coded earlier 
5410: 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20 20  to an OP_Null.  
5420: 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68        ** sets th
5430: 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62 69  e MEM_Cleared bi
5440: 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 72  t on the first r
5450: 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a 20  egister of the. 
5460: 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
5470: 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  us value.  This 
5480: 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 4f  will cause the O
5490: 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61 6c  P_Ne below to al
54a0: 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ways.        ** 
54b0: 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72 73  fail on the firs
54c0: 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
54d0: 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66 20  he loop even if 
54e0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20 20  the first.      
54f0: 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c 20    ** row is all 
5500: 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20 2a  NULLs..        *
5510: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
5520: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
5530: 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e  p(v, pDistinct->
5540: 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20 20  addrTnct);.     
5550: 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
5560: 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44 69  VdbeGetOp(v, pDi
5570: 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74  stinct->addrTnct
5580: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  );.        pOp->
5590: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c 6c  opcode = OP_Null
55a0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70  ;.        pOp->p
55b0: 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  1 = 1;.        p
55c0: 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65 76  Op->p2 = regPrev
55d0: 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d 70  ;..        iJump
55e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
55f0: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 6e  rrentAddr(v) + n
5600: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
5610: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75  for(i=0; i<nColu
5620: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
5630: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
5640: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
5650: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
5660: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
5670: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  pr);.          i
5680: 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e 2d 31 20 29  f( i<nColumn-1 )
5690: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
56a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
56b0: 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52 65 73  v, OP_Ne, regRes
56c0: 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20 72 65  ult+i, iJump, re
56d0: 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20 20  gPrev+i);.      
56e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
56f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5700: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45  beAddOp3(v, OP_E
5710: 71 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20  q, regResult+i, 
5720: 69 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72  iContinue, regPr
5730: 65 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20  ev+i);.         
5740: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
5750: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
5760: 28 76 2c 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63  (v, -1, (const c
5770: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f  har *)pColl, P4_
5780: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
5790: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
57a0: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
57b0: 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
57c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
57d0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
57e0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3d 3d  CurrentAddr(v)==
57f0: 69 4a 75 6d 70 20 29 3b 0a 20 20 20 20 20 20 20  iJump );.       
5800: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5810: 70 33 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72  p3(v, OP_Copy, r
5820: 65 67 52 65 73 75 6c 74 2c 20 72 65 67 50 72 65  egResult, regPre
5830: 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31 29 3b 0a 20  v, nColumn-1);. 
5840: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5850: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
5860: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5870: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
5880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5890: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
58a0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
58b0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
58c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
58d0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
58e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
58f0: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
5900: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
5910: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
5920: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
5930: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
5940: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
5950: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 43 6f 6c 75  iContinue, nColu
5960: 6d 6e 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  mn, regResult);.
5970: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5980: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5990: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
59a0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
59b0: 66 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74  fset(v, p, iCont
59c0: 69 6e 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  inue);.    }.  }
59d0: 0a 0a 20 20 73 77 69 74 63 68 28 20 65 44 65 73  ..  switch( eDes
59e0: 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20 74  t ){.    /* In t
59f0: 68 69 73 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  his mode, write 
5a00: 65 61 63 68 20 71 75 65 72 79 20 72 65 73 75 6c  each query resul
5a10: 74 20 74 6f 20 74 68 65 20 6b 65 79 20 6f 66 20  t to the key of 
5a20: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
5a30: 20 20 2a 2a 20 74 61 62 6c 65 20 69 50 61 72 6d    ** table iParm
5a40: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
5a50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
5a60: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 20  POUND_SELECT.   
5a70: 20 63 61 73 65 20 53 52 54 5f 55 6e 69 6f 6e 3a   case SRT_Union:
5a80: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b   {.      int r1;
5a90: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
5aa0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
5ab0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
5ac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5ad0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
5ae0: 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c   regResult, nCol
5af0: 75 6d 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  umn, r1);.      
5b00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5b10: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
5b20: 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20  t, iParm, r1);. 
5b30: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5b40: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5b50: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5b60: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
5b70: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72  /* Construct a r
5b80: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71  ecord from the q
5b90: 75 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74  uery result, but
5ba0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20   instead of.    
5bb0: 2a 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72  ** saving that r
5bc0: 65 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73  ecord, use it as
5bd0: 20 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65   a key to delete
5be0: 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20   elements from. 
5bf0: 20 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72     ** the tempor
5c00: 61 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e  ary table iParm.
5c10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5c20: 20 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20   SRT_Except: {. 
5c30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5c40: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78  AddOp3(v, OP_Idx
5c50: 44 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72  Delete, iParm, r
5c60: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
5c70: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
5c80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
5c90: 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20     /* Store the 
5ca0: 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75  result as data u
5cb0: 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65  sing a unique ke
5cc0: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  y..    */.    ca
5cd0: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
5ce0: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
5cf0: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  Tab: {.      int
5d00: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
5d10: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
5d20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5d30: 20 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c   eDest==SRT_Tabl
5d40: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
5d50: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
5d60: 45 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20  EphemTab );.    
5d70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5d80: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
5d90: 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c  cord, regResult,
5da0: 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20   nColumn, r1);. 
5db0: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
5dc0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 73  y ){.        pus
5dd0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72  hOntoSorter(pPar
5de0: 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c  se, pOrderBy, p,
5df0: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
5e00: 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  e{.        int r
5e10: 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
5e20: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
5e30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5e40: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
5e50: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
5e60: 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r2);.        sql
5e70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5e80: 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 69 50 61  , OP_Insert, iPa
5e90: 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20 20  rm, r1, r2);.   
5ea0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5eb0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
5ec0: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
5ed0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5ee0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5ef0: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , r2);.      }. 
5f00: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
5f10: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
5f20: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
5f30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
5f40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5f50: 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
5f60: 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
5f70: 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
5f80: 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
5f90: 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
5fa0: 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
5fb0: 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
5fc0: 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
5fd0: 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
5fe0: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
5ff0: 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
6000: 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
6010: 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
6020: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
6030: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
6040: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
6050: 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
6060: 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  t =.            
6070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
6080: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 4c  pareAffinity(pEL
6090: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
60a0: 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 29   pDest->affSdst)
60b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64  ;.      if( pOrd
60c0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20  erBy ){.        
60d0: 2f 2a 20 41 74 20 66 69 72 73 74 20 67 6c 61 6e  /* At first glan
60e0: 63 65 20 79 6f 75 20 77 6f 75 6c 64 20 74 68 69  ce you would thi
60f0: 6e 6b 20 77 65 20 63 6f 75 6c 64 20 6f 70 74 69  nk we could opti
6100: 6d 69 7a 65 20 6f 75 74 20 74 68 65 0a 20 20 20  mize out the.   
6110: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
6120: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 73 69   in this case si
6130: 6e 63 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66  nce the order of
6140: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
6150: 73 65 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  set.        ** d
6160: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20  oes not matter. 
6170: 20 42 75 74 20 74 68 65 72 65 20 6d 69 67 68 74   But there might
6180: 20 62 65 20 61 20 4c 49 4d 49 54 20 63 6c 61 75   be a LIMIT clau
6190: 73 65 2c 20 69 6e 20 77 68 69 63 68 0a 20 20 20  se, in which.   
61a0: 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 65       ** case the
61b0: 20 6f 72 64 65 72 20 64 6f 65 73 20 6d 61 74 74   order does matt
61c0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75  er */.        pu
61d0: 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61  shOntoSorter(pPa
61e0: 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70  rse, pOrderBy, p
61f0: 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a 20 20  , regResult);.  
6200: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6210: 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
6220: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6230: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73  arse);.        s
6240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
6250: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
6260: 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 31 2c 72  d, regResult,1,r
6270: 31 2c 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64  1, &pDest->affSd
6280: 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
6290: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
62a0: 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
62b0: 50 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74  Parse, regResult
62c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 1);.        sq
62d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
62e0: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
62f0: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
6300: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
6310: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
6320: 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a  e, r1);.      }.
6330: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6340: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   }..    /* If an
6350: 79 20 72 6f 77 20 65 78 69 73 74 20 69 6e 20 74  y row exist in t
6360: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 72  he result set, r
6370: 65 63 6f 72 64 20 74 68 61 74 20 66 61 63 74 20  ecord that fact 
6380: 61 6e 64 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a  and abort..    *
6390: 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  /.    case SRT_E
63a0: 78 69 73 74 73 3a 20 7b 0a 20 20 20 20 20 20 73  xists: {.      s
63b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
63c0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
63d0: 31 2c 20 69 50 61 72 6d 29 3b 0a 20 20 20 20 20  1, iParm);.     
63e0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
63f0: 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
6400: 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
6410: 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
6420: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
6430: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 73  * If this is a s
6440: 63 61 6c 61 72 20 73 65 6c 65 63 74 20 74 68 61  calar select tha
6450: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 6e 20  t is part of an 
6460: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
6470: 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 20 74 68  .    ** store th
6480: 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 68 65  e results in the
6490: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 65 6d   appropriate mem
64a0: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 62 72 65  ory cell and bre
64b0: 61 6b 20 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66  ak out.    ** of
64c0: 20 74 68 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a   the scan loop..
64d0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
64e0: 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20  SRT_Mem: {.     
64f0: 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e   assert( nColumn
6500: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
6510: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
6520: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
6530: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
6540: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
6550: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
6560: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6570: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
6580: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
6590: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
65a0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
65b0: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
65c0: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
65d0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
65e0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
65f0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
6600: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
6610: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
6620: 0a 0a 20 20 20 20 2f 2a 20 53 65 6e 64 20 74 68  ..    /* Send th
6630: 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 63 61  e data to the ca
6640: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
6650: 6f 72 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69  or to a subrouti
6660: 6e 65 2e 20 20 49 6e 20 74 68 65 0a 20 20 20 20  ne.  In the.    
6670: 2a 2a 20 63 61 73 65 20 6f 66 20 61 20 73 75 62  ** case of a sub
6680: 72 6f 75 74 69 6e 65 2c 20 74 68 65 20 73 75 62  routine, the sub
6690: 72 6f 75 74 69 6e 65 20 69 74 73 65 6c 66 20 69  routine itself i
66a0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
66b0: 72 0a 20 20 20 20 2a 2a 20 70 6f 70 70 69 6e 67  r.    ** popping
66c0: 20 74 68 65 20 64 61 74 61 20 66 72 6f 6d 20 74   the data from t
66d0: 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 2a 2f  he stack..    */
66e0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43 6f  .    case SRT_Co
66f0: 72 6f 75 74 69 6e 65 3a 0a 20 20 20 20 63 61 73  routine:.    cas
6700: 65 20 53 52 54 5f 4f 75 74 70 75 74 3a 20 7b 0a  e SRT_Output: {.
6710: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6720: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6730: 74 69 6e 65 20 29 3b 0a 20 20 20 20 20 20 74 65  tine );.      te
6740: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
6750: 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20  RT_Output );.   
6760: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
6770: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6780: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
6790: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
67a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
67b0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
67c0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
67d0: 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72  sult, nColumn, r
67e0: 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 73 68  1);.        push
67f0: 4f 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73  OntoSorter(pPars
6800: 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20  e, pOrderBy, p, 
6810: 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r1);.        sql
6820: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
6830: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
6840: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6850: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
6860: 74 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tine ){.        
6870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6880: 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
6890: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
68a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
68b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
68c0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73  AddOp2(v, OP_Res
68d0: 75 6c 74 52 6f 77 2c 20 72 65 67 52 65 73 75 6c  ultRow, regResul
68e0: 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  t, nColumn);.   
68f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6900: 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61  CacheAffinityCha
6910: 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52  nge(pParse, regR
6920: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
6930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6940: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
6950: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6960: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
6970: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
6980: 65 20 72 65 73 75 6c 74 73 2e 20 20 54 68 69 73  e results.  This
6990: 20 69 73 20 75 73 65 64 20 66 6f 72 20 53 45 4c   is used for SEL
69a0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
69b0: 6e 73 69 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  nside.    ** the
69c0: 20 62 6f 64 79 20 6f 66 20 61 20 54 52 49 47 47   body of a TRIGG
69d0: 45 52 2e 20 20 54 68 65 20 70 75 72 70 6f 73 65  ER.  The purpose
69e0: 20 6f 66 20 73 75 63 68 20 73 65 6c 65 63 74 73   of such selects
69f0: 20 69 73 20 74 6f 20 63 61 6c 6c 0a 20 20 20 20   is to call.    
6a00: 2a 2a 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ** user-defined 
6a10: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 68  functions that h
6a20: 61 76 65 20 73 69 64 65 20 65 66 66 65 63 74 73  ave side effects
6a30: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 63 61 72  .  We do not car
6a40: 65 0a 20 20 20 20 2a 2a 20 61 62 6f 75 74 20 74  e.    ** about t
6a50: 68 65 20 61 63 74 75 61 6c 20 72 65 73 75 6c 74  he actual result
6a60: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e  s of the select.
6a70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66 61  .    */.    defa
6a80: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  ult: {.      ass
6a90: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
6aa0: 44 69 73 63 61 72 64 20 29 3b 0a 20 20 20 20 20  Discard );.     
6ab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
6ac0: 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a  ndif.  }..  /* J
6ad0: 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  ump to the end o
6ae0: 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74 68  f the loop if th
6af0: 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63 68  e LIMIT is reach
6b00: 65 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 0a  ed.  Except, if.
6b10: 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20    ** there is a 
6b20: 73 6f 72 74 65 72 2c 20 69 6e 20 77 68 69 63 68  sorter, in which
6b30: 20 63 61 73 65 20 74 68 65 20 73 6f 72 74 65 72   case the sorter
6b40: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6c 69 6d   has already lim
6b50: 69 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 6f 75  ited.  ** the ou
6b60: 74 70 75 74 20 66 6f 72 20 75 73 2e 0a 20 20 2a  tput for us..  *
6b70: 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
6b80: 3d 3d 30 20 26 26 20 70 2d 3e 69 4c 69 6d 69 74  ==0 && p->iLimit
6b90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
6ba0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6bb0: 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69  IfZero, p->iLimi
6bc0: 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b 0a  t, iBreak, -1);.
6bd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
6be0: 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20  ocate a KeyInfo 
6bf0: 6f 62 6a 65 63 74 20 73 75 66 66 69 63 69 65 6e  object sufficien
6c00: 74 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 6f  t for an index o
6c10: 66 20 4e 20 6b 65 79 20 63 6f 6c 75 6d 6e 73 20  f N key columns 
6c20: 61 6e 64 0a 2a 2a 20 58 20 65 78 74 72 61 20 63  and.** X extra c
6c30: 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 4b 65 79 49 6e  olumns..*/.KeyIn
6c40: 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
6c50: 66 6f 41 6c 6c 6f 63 28 73 71 6c 69 74 65 33 20  foAlloc(sqlite3 
6c60: 2a 64 62 2c 20 69 6e 74 20 4e 2c 20 69 6e 74 20  *db, int N, int 
6c70: 58 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  X){.  KeyInfo *p
6c80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
6c90: 6f 63 5a 65 72 6f 28 30 2c 20 0a 20 20 20 20 20  ocZero(0, .     
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
6cb0: 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20  zeof(KeyInfo) + 
6cc0: 28 4e 2b 58 29 2a 28 73 69 7a 65 6f 66 28 43 6f  (N+X)*(sizeof(Co
6cd0: 6c 6c 53 65 71 2a 29 2b 31 29 29 3b 0a 20 20 69  llSeq*)+1));.  i
6ce0: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 61  f( p ){.    p->a
6cf0: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
6d00: 29 26 70 2d 3e 61 43 6f 6c 6c 5b 4e 2b 58 5d 3b  )&p->aColl[N+X];
6d10: 0a 20 20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  .    p->nField =
6d20: 20 28 75 31 36 29 4e 3b 0a 20 20 20 20 70 2d 3e   (u16)N;.    p->
6d30: 6e 58 46 69 65 6c 64 20 3d 20 28 75 31 36 29 58  nXField = (u16)X
6d40: 3b 0a 20 20 20 20 70 2d 3e 65 6e 63 20 3d 20 45  ;.    p->enc = E
6d50: 4e 43 28 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  NC(db);.    p->d
6d60: 62 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 6e  b = db;.    p->n
6d70: 52 65 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Ref = 1;.  }else
6d80: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
6d90: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  Failed = 1;.  }.
6da0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6db0: 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20  *.** Deallocate 
6dc0: 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  a KeyInfo object
6dd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6de0: 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 4b 65 79  KeyInfoUnref(Key
6df0: 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 66 28 20  Info *p){.  if( 
6e00: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
6e10: 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20   p->nRef>0 );.  
6e20: 20 20 70 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20    p->nRef--;.   
6e30: 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20   if( p->nRef==0 
6e40: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
6e50: 30 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  0, p);.  }.}../*
6e60: 0a 2a 2a 20 4d 61 6b 65 20 61 20 6e 65 77 20 70  .** Make a new p
6e70: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4b 65 79 49  ointer to a KeyI
6e80: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 4b 65  nfo object.*/.Ke
6e90: 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
6ea0: 79 49 6e 66 6f 52 65 66 28 4b 65 79 49 6e 66 6f  yInfoRef(KeyInfo
6eb0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b   *p){.  if( p ){
6ec0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
6ed0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d  nRef>0 );.    p-
6ee0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 72  >nRef++;.  }.  r
6ef0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 23 69 66 64  eturn p;.}..#ifd
6f00: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
6f10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
6f20: 45 20 69 66 20 61 20 4b 65 79 49 6e 66 6f 20 6f  E if a KeyInfo o
6f30: 62 6a 65 63 74 20 63 61 6e 20 62 65 20 63 68 61  bject can be cha
6f40: 6e 67 65 2e 20 20 54 68 65 20 4b 65 79 49 6e 66  nge.  The KeyInf
6f50: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 61 6e 20  o object.** can 
6f60: 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20  only be changed 
6f70: 69 66 20 74 68 69 73 20 69 73 20 6a 75 73 74 20  if this is just 
6f80: 61 20 73 69 6e 67 6c 65 20 72 65 66 65 72 65 6e  a single referen
6f90: 63 65 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74  ce to the object
6fa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6fb0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
6fc0: 79 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65  y inside of asse
6fd0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
6fe0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4b  .*/.int sqlite3K
6ff0: 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c  eyInfoIsWriteabl
7000: 65 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 20 72  e(KeyInfo *p){ r
7010: 65 74 75 72 6e 20 70 2d 3e 6e 52 65 66 3d 3d 31  eturn p->nRef==1
7020: 3b 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ; }.#endif /* SQ
7030: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  LITE_DEBUG */../
7040: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 6e 20 65 78  *.** Given an ex
7050: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 67  pression list, g
7060: 65 6e 65 72 61 74 65 20 61 20 4b 65 79 49 6e 66  enerate a KeyInf
7070: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
7080: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20   records.** the 
7090: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
70a0: 63 65 20 66 6f 72 20 65 61 63 68 20 65 78 70 72  ce for each expr
70b0: 65 73 73 69 6f 6e 20 69 6e 20 74 68 61 74 20 65  ession in that e
70c0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
70d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 45 78 70  **.** If the Exp
70e0: 72 4c 69 73 74 20 69 73 20 61 6e 20 4f 52 44 45  rList is an ORDE
70f0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
7100: 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74 68 65   clause then the
7110: 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65   resulting.** Ke
7120: 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
7130: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
7140: 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  or initializing 
7150: 61 20 76 69 72 74 75 61 6c 20 69 6e 64 65 78 20  a virtual index 
7160: 74 6f 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  to.** implement 
7170: 74 68 61 74 20 63 6c 61 75 73 65 2e 20 20 49 66  that clause.  If
7180: 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73   the ExprList is
7190: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
71a0: 6f 66 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 74  of a SELECT.** t
71b0: 68 65 6e 20 74 68 65 20 4b 65 79 49 6e 66 6f 20  hen the KeyInfo 
71c0: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70  structure is app
71d0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69  ropriate for ini
71e0: 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74  tializing a virt
71f0: 75 61 6c 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20  ual.** index to 
7200: 69 6d 70 6c 65 6d 65 6e 74 20 61 20 44 49 53 54  implement a DIST
7210: 49 4e 43 54 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  INCT test..**.**
7220: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
7230: 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
7240: 74 75 72 65 20 69 73 20 6f 62 74 61 69 6e 20 66  ture is obtain f
7250: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 54 68 65  rom malloc.  The
7260: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
7270: 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69  tion is responsi
7280: 62 6c 65 20 66 6f 72 20 73 65 65 69 6e 67 20 74  ble for seeing t
7290: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
72a0: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
72b0: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
72c0: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6b 65  atic KeyInfo *ke
72d0: 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73  yInfoFromExprLis
72e0: 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  t(Parse *pParse,
72f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
7300: 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a  ){.  int nExpr;.
7310: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49 6e 66 6f    KeyInfo *pInfo
7320: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
7330: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
7340: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
7350: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
7360: 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70 72 20 3d  nt i;..  nExpr =
7370: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
7380: 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33   pInfo = sqlite3
7390: 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c  KeyInfoAlloc(db,
73a0: 20 6e 45 78 70 72 2c 20 31 29 3b 0a 20 20 69 66   nExpr, 1);.  if
73b0: 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 61  ( pInfo ){.    a
73c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65  ssert( sqlite3Ke
73d0: 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65  yInfoIsWriteable
73e0: 28 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 66  (pInfo) );.    f
73f0: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
7400: 69 73 74 2d 3e 61 3b 20 69 3c 6e 45 78 70 72 3b  ist->a; i<nExpr;
7410: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
7420: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
7430: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 43 6f 6c  Coll;.      pCol
7440: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
7450: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
7460: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
7470: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
7480: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
7490: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49  ltColl;.      pI
74a0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  nfo->aColl[i] = 
74b0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e  pColl;.      pIn
74c0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
74d0: 5d 20 3d 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f  ] = pItem->sortO
74e0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rder;.    }.  }.
74f0: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
7500: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7510: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7520: 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d  SELECT./*.** Nam
7530: 65 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74  e of the connect
7540: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2c 20 75 73  ion operator, us
7550: 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ed for error mes
7560: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
7570: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 6c   const char *sel
7580: 65 63 74 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64  ectOpName(int id
7590: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
75a0: 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20  switch( id ){.  
75b0: 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20    case TK_ALL:  
75c0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20       z = "UNION 
75d0: 41 4c 4c 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  ALL";   break;. 
75e0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 52     case TK_INTER
75f0: 53 45 43 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52  SECT: z = "INTER
7600: 53 45 43 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SECT";   break;.
7610: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45      case TK_EXCE
7620: 50 54 3a 20 20 20 20 7a 20 3d 20 22 45 58 43 45  PT:    z = "EXCE
7630: 50 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  PT";      break;
7640: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20  .    default:   
7650: 20 20 20 20 20 20 20 20 7a 20 3d 20 22 55 4e 49          z = "UNI
7660: 4f 4e 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  ON";       break
7670: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
7680: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
7690: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
76a0: 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69  ND_SELECT */..#i
76b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
76c0: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
76d0: 55 6e 6c 65 73 73 20 61 6e 20 22 45 58 50 4c 41  Unless an "EXPLA
76e0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 22 20 63  IN QUERY PLAN" c
76f0: 6f 6d 6d 61 6e 64 20 69 73 20 62 65 69 6e 67 20  ommand is being 
7700: 70 72 6f 63 65 73 73 65 64 2c 20 74 68 69 73 20  processed, this 
7710: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61  function.** is a
7720: 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73   no-op. Otherwis
7730: 65 2c 20 69 74 20 61 64 64 73 20 61 20 73 69 6e  e, it adds a sin
7740: 67 6c 65 20 72 6f 77 20 6f 66 20 6f 75 74 70 75  gle row of outpu
7750: 74 20 74 6f 20 74 68 65 20 45 51 50 20 72 65 73  t to the EQP res
7760: 75 6c 74 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68  ult,.** where th
7770: 65 20 63 61 70 74 69 6f 6e 20 69 73 20 6f 66 20  e caption is of 
7780: 74 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20  the form:.**.** 
7790: 20 20 22 55 53 45 20 54 45 4d 50 20 42 2d 54 52    "USE TEMP B-TR
77a0: 45 45 20 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a  EE FOR xxx".**.*
77b0: 2a 20 77 68 65 72 65 20 78 78 78 20 69 73 20 6f  * where xxx is o
77c0: 6e 65 20 6f 66 20 22 44 49 53 54 49 4e 43 54 22  ne of "DISTINCT"
77d0: 2c 20 22 4f 52 44 45 52 20 42 59 22 20 6f 72 20  , "ORDER BY" or 
77e0: 22 47 52 4f 55 50 20 42 59 22 2e 20 45 78 61 63  "GROUP BY". Exac
77f0: 74 6c 79 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  tly which.** is 
7800: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7810: 65 20 7a 55 73 61 67 65 20 61 72 67 75 6d 65 6e  e zUsage argumen
7820: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
7830: 64 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62  d explainTempTab
7840: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
7850: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55  , const char *zU
7860: 73 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61  sage){.  if( pPa
7870: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
7880: 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
7890: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
78a0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d      char *zMsg =
78b0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
78c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 55 53 45  pParse->db, "USE
78d0: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
78e0: 20 25 73 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20   %s", zUsage);. 
78f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7900: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
7910: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
7920: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
7930: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
7940: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73    }.}../*.** Ass
7950: 69 67 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62  ign expression b
7960: 20 74 6f 20 6c 76 61 6c 75 65 20 61 2e 20 41 20   to lvalue a. A 
7970: 73 65 63 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76  second, no-op, v
7980: 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d  ersion of this m
7990: 61 63 72 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69  acro.** is provi
79a0: 64 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  ded when SQLITE_
79b0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
79c0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 61 6c  defined. This al
79d0: 6c 6f 77 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a  lows the code.**
79e0: 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65 63   in sqlite3Selec
79f0: 74 28 29 20 74 6f 20 61 73 73 69 67 6e 20 76 61  t() to assign va
7a00: 6c 75 65 73 20 74 6f 20 73 74 72 75 63 74 75 72  lues to structur
7a10: 65 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  e member variabl
7a20: 65 73 20 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20  es that.** only 
7a30: 65 78 69 73 74 20 69 66 20 53 51 4c 49 54 45 5f  exist if SQLITE_
7a40: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 69 73 20  OMIT_EXPLAIN is 
7a50: 6e 6f 74 20 64 65 66 69 6e 65 64 20 77 69 74 68  not defined with
7a60: 6f 75 74 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68  out polluting th
7a70: 65 0a 2a 2a 20 63 6f 64 65 20 77 69 74 68 20 23  e.** code with #
7a80: 69 66 6e 64 65 66 20 64 69 72 65 63 74 69 76 65  ifndef directive
7a90: 73 2e 0a 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65  s..*/.# define e
7aa0: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
7ab0: 28 61 2c 20 62 29 20 61 20 3d 20 62 0a 0a 23 65  (a, b) a = b..#e
7ac0: 6c 73 65 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72  lse./* No-op ver
7ad0: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 65 78 70  sions of the exp
7ae0: 6c 61 69 6e 58 58 58 28 29 20 66 75 6e 63 74 69  lainXXX() functi
7af0: 6f 6e 73 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20  ons and macros. 
7b00: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
7b10: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a  ainTempTable(y,z
7b20: 29 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  ).# define expla
7b30: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 79 2c 7a  inSetInteger(y,z
7b40: 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ).#endif..#if !d
7b50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7b60: 49 54 5f 45 58 50 4c 41 49 4e 29 20 26 26 20 21  IT_EXPLAIN) && !
7b70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7b80: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
7b90: 45 43 54 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73  ECT)./*.** Unles
7ba0: 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55  s an "EXPLAIN QU
7bb0: 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e  ERY PLAN" comman
7bc0: 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65  d is being proce
7bd0: 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  ssed, this funct
7be0: 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f  ion.** is a no-o
7bf0: 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  p. Otherwise, it
7c00: 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72   adds a single r
7c10: 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20  ow of output to 
7c20: 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a  the EQP result,.
7c30: 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70  ** where the cap
7c40: 74 69 6f 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f  tion is of one o
7c50: 66 20 74 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a  f the two forms:
7c60: 0a 2a 2a 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53  .**.**   "COMPOS
7c70: 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20 69  ITE SUBQUERIES i
7c80: 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 28  Sub1 and iSub2 (
7c90: 6f 70 29 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f  op)".**   "COMPO
7ca0: 53 49 54 45 20 53 55 42 51 55 45 52 49 45 53 20  SITE SUBQUERIES 
7cb0: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
7cc0: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
7cd0: 45 20 28 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68  E (op)".**.** wh
7ce0: 65 72 65 20 69 53 75 62 31 20 61 6e 64 20 69 53  ere iSub1 and iS
7cf0: 75 62 32 20 61 72 65 20 74 68 65 20 69 6e 74 65  ub2 are the inte
7d00: 67 65 72 73 20 70 61 73 73 65 64 20 61 73 20 74  gers passed as t
7d10: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7d20: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 61 72  .** function par
7d30: 61 6d 65 74 65 72 73 2c 20 61 6e 64 20 6f 70 20  ameters, and op 
7d40: 69 73 20 74 68 65 20 74 65 78 74 20 72 65 70 72  is the text repr
7d50: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
7d60: 65 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  e parameter.** o
7d70: 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  f the same name.
7d80: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
7d90: 6f 70 22 20 6d 75 73 74 20 62 65 20 6f 6e 65 20  op" must be one 
7da0: 6f 66 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f  of TK_UNION, TK_
7db0: 45 58 43 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e  EXCEPT,.** TK_IN
7dc0: 54 45 52 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c  TERSECT or TK_AL
7dd0: 4c 2e 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  L. The first for
7de0: 6d 20 69 73 20 75 73 65 64 20 69 66 20 61 72 67  m is used if arg
7df0: 75 6d 65 6e 74 20 62 55 73 65 54 6d 70 20 69 73  ument bUseTmp is
7e00: 20 0a 2a 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74   .** false, or t
7e10: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69  he second form i
7e20: 66 20 69 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f  f it is true..*/
7e30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
7e40: 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20  lainComposite(. 
7e50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e70: 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78   /* Parse contex
7e80: 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20  t */.  int op,  
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ea0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
7eb0: 20 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58   TK_UNION, TK_EX
7ec0: 43 45 50 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69  CEPT etc. */.  i
7ed0: 6e 74 20 69 53 75 62 31 2c 20 20 20 20 20 20 20  nt iSub1,       
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ef0: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 31 20  * Subquery id 1 
7f00: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 2c 20  */.  int iSub2, 
7f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f20: 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65 72 79       /* Subquery
7f30: 20 69 64 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62   id 2 */.  int b
7f40: 55 73 65 54 6d 70 20 20 20 20 20 20 20 20 20 20  UseTmp          
7f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7f60: 75 65 20 69 66 20 61 20 74 65 6d 70 20 74 61 62  ue if a temp tab
7f70: 6c 65 20 77 61 73 20 75 73 65 64 20 2a 2f 0a 29  le was used */.)
7f80: 7b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d  {.  assert( op==
7f90: 54 4b 5f 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d  TK_UNION || op==
7fa0: 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d  TK_EXCEPT || op=
7fb0: 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c  =TK_INTERSECT ||
7fc0: 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20   op==TK_ALL );. 
7fd0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
7fe0: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56  lain==2 ){.    V
7ff0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
8000: 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68 61 72  >pVdbe;.    char
8010: 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33   *zMsg = sqlite3
8020: 4d 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  MPrintf(.       
8030: 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f   pParse->db, "CO
8040: 4d 50 4f 55 4e 44 20 53 55 42 51 55 45 52 49 45  MPOUND SUBQUERIE
8050: 53 20 25 64 20 41 4e 44 20 25 64 20 25 73 28 25  S %d AND %d %s(%
8060: 73 29 22 2c 20 69 53 75 62 31 2c 20 69 53 75 62  s)", iSub1, iSub
8070: 32 2c 0a 20 20 20 20 20 20 20 20 62 55 73 65 54  2,.        bUseT
8080: 6d 70 3f 22 55 53 49 4e 47 20 54 45 4d 50 20 42  mp?"USING TEMP B
8090: 2d 54 52 45 45 20 22 3a 22 22 2c 20 73 65 6c 65  -TREE ":"", sele
80a0: 63 74 4f 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20  ctOpName(op).   
80b0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
80c0: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
80d0: 45 78 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d  Explain, pParse-
80e0: 3e 69 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30  >iSelectId, 0, 0
80f0: 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
8100: 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  IC);.  }.}.#else
8110: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
8120: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
8130: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
8140: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
8150: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
8160: 43 6f 6d 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c  Composite(v,w,x,
8170: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
8180: 2a 2a 20 49 66 20 74 68 65 20 69 6e 6e 65 72 20  ** If the inner 
8190: 6c 6f 6f 70 20 77 61 73 20 67 65 6e 65 72 61 74  loop was generat
81a0: 65 64 20 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e  ed using a non-n
81b0: 75 6c 6c 20 70 4f 72 64 65 72 42 79 20 61 72 67  ull pOrderBy arg
81c0: 75 6d 65 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74  ument,.** then t
81d0: 68 65 20 72 65 73 75 6c 74 73 20 77 65 72 65 20  he results were 
81e0: 70 6c 61 63 65 64 20 69 6e 20 61 20 73 6f 72 74  placed in a sort
81f0: 65 72 2e 20 20 41 66 74 65 72 20 74 68 65 20 6c  er.  After the l
8200: 6f 6f 70 20 69 73 20 74 65 72 6d 69 6e 61 74 65  oop is terminate
8210: 64 0a 2a 2a 20 77 65 20 6e 65 65 64 20 74 6f 20  d.** we need to 
8220: 72 75 6e 20 74 68 65 20 73 6f 72 74 65 72 20 61  run the sorter a
8230: 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72 65  nd output the re
8240: 73 75 6c 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c  sults.  The foll
8250: 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65  owing.** routine
8260: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
8270: 6f 64 65 20 6e 65 65 64 65 64 20 74 6f 20 64 6f  ode needed to do
8280: 20 74 68 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   that..*/.static
8290: 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65 53 6f   void generateSo
82a0: 72 74 54 61 69 6c 28 0a 20 20 50 61 72 73 65 20  rtTail(.  Parse 
82b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
82c0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
82d0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
82e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
82f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
8300: 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20  .  Vdbe *v,     
8310: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
8320: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
8330: 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  VDBE */.  int nC
8340: 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e  olumn,      /* N
8350: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
8360: 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 53 65   of data */.  Se
8370: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
8380: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 6f 72  /* Write the sor
8390: 74 65 64 20 72 65 73 75 6c 74 73 20 68 65 72 65  ted results here
83a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
83b0: 72 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  rBreak = sqlite3
83c0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
83d0: 3b 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65  ;     /* Jump he
83e0: 72 65 20 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20  re to exit loop 
83f0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
8400: 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
8410: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
8420: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 66    /* Jump here f
8430: 6f 72 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  or next cycle */
8440: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 69  .  int addr;.  i
8450: 6e 74 20 69 54 61 62 3b 0a 20 20 69 6e 74 20 70  nt iTab;.  int p
8460: 73 65 75 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20  seudoTab = 0;.  
8470: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
8480: 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
8490: 3b 0a 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  ;..  int eDest =
84a0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20   pDest->eDest;. 
84b0: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
84c0: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 0a 0a 20 20  st->iSDParm;..  
84d0: 69 6e 74 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e  int regRow;.  in
84e0: 74 20 72 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69  t regRowid;..  i
84f0: 54 61 62 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Tab = pOrderBy->
8500: 69 45 43 75 72 73 6f 72 3b 0a 20 20 72 65 67 52  iECursor;.  regR
8510: 6f 77 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ow = sqlite3GetT
8520: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
8530: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
8540: 5f 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74  _Output || eDest
8550: 3d 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20  ==SRT_Coroutine 
8560: 29 7b 0a 20 20 20 20 70 73 65 75 64 6f 54 61 62  ){.    pseudoTab
8570: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
8580: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
8590: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f  beAddOp3(v, OP_O
85a0: 70 65 6e 50 73 65 75 64 6f 2c 20 70 73 65 75 64  penPseudo, pseud
85b0: 6f 54 61 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43  oTab, regRow, nC
85c0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52  olumn);.    regR
85d0: 6f 77 69 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  owid = 0;.  }els
85e0: 65 7b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  e{.    regRowid 
85f0: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
8600: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  Reg(pParse);.  }
8610: 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61  .  if( p->selFla
8620: 67 73 20 26 20 53 46 5f 55 73 65 53 6f 72 74 65  gs & SF_UseSorte
8630: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65 67  r ){.    int reg
8640: 53 6f 72 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72  SortOut = ++pPar
8650: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e  se->nMem;.    in
8660: 74 20 70 74 61 62 32 20 3d 20 70 50 61 72 73 65  t ptab2 = pParse
8670: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71  ->nTab++;.    sq
8680: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
8690: 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
86a0: 2c 20 70 74 61 62 32 2c 20 72 65 67 53 6f 72 74  , ptab2, regSort
86b0: 4f 75 74 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  Out, pOrderBy->n
86c0: 45 78 70 72 2b 32 29 3b 0a 20 20 20 20 61 64 64  Expr+2);.    add
86d0: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
86e0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
86f0: 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 54 61 62  SorterSort, iTab
8700: 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20  , addrBreak);.  
8710: 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
8720: 70 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29  p, addrContinue)
8730: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8740: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
8750: 72 74 65 72 44 61 74 61 2c 20 69 54 61 62 2c 20  rterData, iTab, 
8760: 72 65 67 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20  regSortOut);.   
8770: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8780: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
8790: 20 70 74 61 62 32 2c 20 70 4f 72 64 65 72 42 79   ptab2, pOrderBy
87a0: 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f  ->nExpr+1, regRo
87b0: 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  w);.    sqlite3V
87c0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
87d0: 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45  PFLAG_CLEARCACHE
87e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
87f0: 61 64 64 72 20 3d 20 31 20 2b 20 73 71 6c 69 74  addr = 1 + sqlit
8800: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8810: 4f 50 5f 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  OP_Sort, iTab, a
8820: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63  ddrBreak);.    c
8830: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
8840: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
8850: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8860: 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
8870: 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42  n, iTab, pOrderB
8880: 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 52  y->nExpr+1, regR
8890: 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  ow);.  }.  switc
88a0: 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20  h( eDest ){.    
88b0: 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
88c0: 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
88d0: 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74  emTab: {.      t
88e0: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
88f0: 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
8900: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
8910: 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
8920: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
8930: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
8940: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72  P_NewRowid, iPar
8950: 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  m, regRowid);.  
8960: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8970: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
8980: 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f  rt, iParm, regRo
8990: 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20  w, regRowid);.  
89a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
89b0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
89c0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
89d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
89e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
89f0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
8a00: 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20  ase SRT_Set: {. 
8a10: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
8a20: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
8a30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8a40: 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p4(v, OP_MakeRec
8a50: 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20  ord, regRow, 1, 
8a60: 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20  regRowid,.      
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73    &pDest->affSds
8a90: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
8aa0: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
8ab0: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
8ac0: 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a  se, regRow, 1);.
8ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8ae0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
8af0: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20  xInsert, iParm, 
8b00: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8b10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8b20: 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
8b30: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
8b40: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
8b50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
8b60: 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
8b70: 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31  regRow, iParm, 1
8b80: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
8b90: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
8ba0: 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  l terminate the 
8bb0: 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
8bc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8bd0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  }.#endif.    def
8be0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ault: {.      in
8bf0: 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t i;.      asser
8c00: 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  t( eDest==SRT_Ou
8c10: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
8c20: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20  RT_Coroutine ); 
8c30: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
8c40: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
8c50: 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ut );.      test
8c60: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
8c70: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20  _Coroutine );.  
8c80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
8c90: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
8ca0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 65        assert( re
8cb0: 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69 53 64  gRow!=pDest->iSd
8cc0: 73 74 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20  st+i );.        
8cd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8ce0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
8cf0: 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44  pseudoTab, i, pD
8d00: 65 73 74 2d 3e 69 53 64 73 74 2b 69 29 3b 0a 20  est->iSdst+i);. 
8d10: 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20         if( i==0 
8d20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
8d30: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
8d40: 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
8d50: 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20  CACHE);.        
8d60: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8d70: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f  if( eDest==SRT_O
8d80: 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20  utput ){.       
8d90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8da0: 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
8db0: 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74  ow, pDest->iSdst
8dc0: 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  , nColumn);.    
8dd0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
8de0: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
8df0: 67 65 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  ge(pParse, pDest
8e00: 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e  ->iSdst, nColumn
8e10: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8e20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8e30: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
8e40: 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53  Yield, pDest->iS
8e50: 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a  DParm);.      }.
8e60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e70: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
8e80: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
8e90: 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a  Parse, regRow);.
8ea0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
8eb0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
8ec0: 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a  regRowid);..  /*
8ed0: 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   The bottom of t
8ee0: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  he loop.  */.  s
8ef0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
8f00: 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f  eLabel(v, addrCo
8f10: 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70  ntinue);.  if( p
8f20: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
8f30: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
8f40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8f50: 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
8f60: 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29  ext, iTab, addr)
8f70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8f90: 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
8fa0: 62 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20  b, addr);.  }.  
8fb0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
8fc0: 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42  veLabel(v, addrB
8fd0: 72 65 61 6b 29 3b 0a 20 20 69 66 28 20 65 44 65  reak);.  if( eDe
8fe0: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c  st==SRT_Output |
8ff0: 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72  | eDest==SRT_Cor
9000: 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71  outine ){.    sq
9010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9020: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65  v, OP_Close, pse
9030: 75 64 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a  udoTab, 0);.  }.
9040: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9050: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
9060: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
9070: 20 74 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f   the 'declaratio
9080: 6e 20 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a  n type' of the.*
9090: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  * expression pEx
90a0: 70 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d  pr. The string m
90b0: 61 79 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ay be treated as
90c0: 20 73 74 61 74 69 63 20 62 79 20 74 68 65 20 63   static by the c
90d0: 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73  aller..**.** Als
90e0: 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
90f0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
9100: 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
9110: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74   and return that
9120: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70  .** result in *p
9130: 45 73 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20  EstWidth..**.** 
9140: 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  The declaration 
9150: 74 79 70 65 20 69 73 20 74 68 65 20 65 78 61 63  type is the exac
9160: 74 20 64 61 74 61 74 79 70 65 20 64 65 66 69 6e  t datatype defin
9170: 69 74 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20  ition extracted 
9180: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67  from the.** orig
9190: 69 6e 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c  inal CREATE TABL
91a0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74  E statement if t
91b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
91c0: 20 61 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a   a column. The.*
91d0: 2a 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  * declaration ty
91e0: 70 65 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66  pe for a ROWID f
91f0: 69 65 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e  ield is INTEGER.
9200: 20 45 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e   Exactly when an
9210: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
9220: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  s considered a c
9230: 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d  olumn can be com
9240: 70 6c 65 78 20 69 6e 20 74 68 65 20 70 72 65 73  plex in the pres
9250: 65 6e 63 65 20 6f 66 20 73 75 62 71 75 65 72 69  ence of subqueri
9260: 65 73 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c  es. The.** resul
9270: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
9280: 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   in all of the f
9290: 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20  ollowing SELECT 
92a0: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a  statements is .*
92b0: 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63  * considered a c
92c0: 6f 6c 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75  olumn by this fu
92d0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  nction..**.**   
92e0: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
92f0: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
9300: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
9310: 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45  M tbl;.**   SELE
9320: 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46  CT (SELECT col F
9330: 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53  ROM tbl);.**   S
9340: 45 4c 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28  ELECT abc FROM (
9350: 53 45 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62  SELECT col AS ab
9360: 63 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20  c FROM tbl);.** 
9370: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
9380: 69 6f 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79  ion type for any
9390: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65   expression othe
93a0: 72 20 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20  r than a column 
93b0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  is NULL..**.** T
93c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
93d0: 65 69 74 68 65 72 20 33 20 6f 72 20 36 20 70 61  either 3 or 6 pa
93e0: 72 61 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69  rameters dependi
93f0: 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
9400: 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49   not.** the SQLI
9410: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
9420: 5f 4d 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c  _METADATA compil
9430: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
9440: 20 75 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66   used..*/.#ifdef
9450: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
9460: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23  OLUMN_METADATA.#
9470: 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79   define columnTy
9480: 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20  pe(A,B,C,D,E,F) 
9490: 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41  columnTypeImpl(A
94a0: 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a 73 74 61 74  ,B,C,D,E,F).stat
94b0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63  ic const char *c
94c0: 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20  olumnTypeImpl(. 
94d0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
94e0: 43 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  C, .  Expr *pExp
94f0: 72 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r,.  const char 
9500: 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f  **pzOrigDb,.  co
9510: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69  nst char **pzOri
9520: 67 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  gTab,.  const ch
9530: 61 72 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a  ar **pzOrigCol,.
9540: 20 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a    u8 *pEstWidth.
9550: 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ){.  char const 
9560: 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20  *zOrigDb = 0;.  
9570: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
9580: 67 54 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72  gTab = 0;.  char
9590: 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c   const *zOrigCol
95a0: 20 3d 20 30 3b 0a 23 65 6c 73 65 20 2f 2a 20 69   = 0;.#else /* i
95b0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
95c0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
95d0: 4d 45 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64  METADATA) */.# d
95e0: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
95f0: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
9600: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
9610: 2c 46 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  ,F).static const
9620: 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70   char *columnTyp
9630: 65 49 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e  eImpl(.  NameCon
9640: 74 65 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78  text *pNC, .  Ex
9650: 70 72 20 2a 70 45 78 70 72 2c 0a 20 20 75 38 20  pr *pExpr,.  u8 
9660: 2a 70 45 73 74 57 69 64 74 68 0a 29 7b 0a 23 65  *pEstWidth.){.#e
9670: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
9680: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
9690: 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20  OLUMN_METADATA) 
96a0: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  */.  char const 
96b0: 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e  *zType = 0;.  in
96c0: 74 20 6a 3b 0a 20 20 75 38 20 65 73 74 57 69 64  t j;.  u8 estWid
96d0: 74 68 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 4e  th = 1;..  if( N
96e0: 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c  EVER(pExpr==0) |
96f0: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
9700: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
9710: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
9720: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
9730: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  K_AGG_COLUMN:.  
9740: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
9750: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
9760: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
9770: 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20   column. Locate 
9780: 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f  the table the co
9790: 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20  lumn is being.  
97a0: 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
97b0: 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e   from in NameCon
97c0: 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54  text.pSrcList. T
97d0: 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65  his table may be
97e0: 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64   real.      ** d
97f0: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72  atabase table or
9800: 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20   a subquery..   
9810: 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c     */.      Tabl
9820: 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
9830: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
9840: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d   structure colum
9850: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
9860: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c  rom */.      Sel
9870: 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20  ect *pS = 0;    
9880: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
9890: 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73  ct the column is
98a0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
98b0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  */.      int iCo
98c0: 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  l = pExpr->iColu
98d0: 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66  mn;  /* Index of
98e0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20   column in pTab 
98f0: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
9900: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
9910: 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20  _AGG_COLUMN );. 
9920: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
9930: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
9940: 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69  UMN );.      whi
9950: 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61 62  le( pNC && !pTab
9960: 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c   ){.        SrcL
9970: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
9980: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
9990: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a         for(j=0;j
99a0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
99b0: 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a  && pTabList->a[j
99c0: 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72  ].iCursor!=pExpr
99d0: 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20  ->iTable;j++);. 
99e0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61         if( j<pTa
99f0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20  bList->nSrc ){. 
9a00: 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20           pTab = 
9a10: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  pTabList->a[j].p
9a20: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
9a30: 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  S = pTabList->a[
9a40: 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  j].pSelect;.    
9a50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9a60: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
9a70: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
9a80: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
9a90: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
9aa0: 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65         /* At one
9ab0: 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68   time, code such
9ac0: 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e   as "SELECT new.
9ad0: 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  x" within a trig
9ae0: 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20  ger would.      
9af0: 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20    ** cause this 
9b00: 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e  condition to run
9b10: 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77  .  Since then, w
9b20: 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74 75  e have restructu
9b30: 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20  red how.        
9b40: 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65 20  ** trigger code 
9b50: 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64  is generated and
9b60: 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69   so this conditi
9b70: 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  on is no longer 
9b80: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73  .        ** poss
9b90: 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69  ible. However, i
9ba0: 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74  t can still be t
9bb0: 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e  rue for statemen
9bc0: 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ts like.        
9bd0: 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
9be0: 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
9bf0: 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45       **   CREATE
9c00: 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e   TABLE t1(col IN
9c10: 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20  TEGER);.        
9c20: 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c  **   SELECT (SEL
9c30: 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d  ECT t1.col) FROM
9c40: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
9c50: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
9c60: 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28  when columnType(
9c70: 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
9c80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74  he expression "t
9c90: 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20  1.col" in the . 
9ca0: 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65         ** sub-se
9cb0: 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61  lect. In this ca
9cc0: 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  se, set the colu
9cd0: 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c  mn type to NULL,
9ce0: 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   even.        **
9cf0: 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c   though it shoul
9d00: 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54  d really be "INT
9d10: 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a  EGER"..        *
9d20: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69  *.        ** Thi
9d30: 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c  s is not a probl
9d40: 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  em, as the colum
9d50: 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f  n type of "t1.co
9d60: 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20  l" is never.    
9d70: 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65      ** used. Whe
9d80: 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69  n columnType() i
9d90: 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  s called on the 
9da0: 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20  expression .    
9db0: 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20      ** "(SELECT 
9dc0: 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f  t1.col)", the co
9dd0: 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72 65  rrect type is re
9de0: 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65 20  turned (see the 
9df0: 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20  TK_SELECT.      
9e00: 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f    ** branch belo
9e10: 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  w.  */.        b
9e20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
9e30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
9e40: 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62  b && pExpr->pTab
9e50: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20  ==pTab );.      
9e60: 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20  if( pS ){.      
9e70: 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22    /* The "table"
9e80: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73   is actually a s
9e90: 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76  ub-select or a v
9ea0: 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  iew in the FROM 
9eb0: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
9ec0: 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  * of the SELECT 
9ed0: 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72  statement. Retur
9ee0: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
9ef0: 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69  n type and origi
9f00: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  n.        ** dat
9f10: 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  a for the result
9f20: 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  -set column of t
9f30: 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20  he sub-select.. 
9f40: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
9f50: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
9f60: 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d   ALWAYS(iCol<pS-
9f70: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  >pEList->nExpr) 
9f80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
9f90: 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20  If iCol is less 
9fa0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
9fb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72  the expression r
9fc0: 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20 20  equests the.    
9fd0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f        ** rowid o
9fe0: 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74  f the sub-select
9ff0: 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20 65   or view. This e
a000: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67  xpression is leg
a010: 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20 20  al (see .       
a020: 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20     ** test case 
a030: 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20  misc2.2.2) - it 
a040: 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65 73  always evaluates
a050: 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20   to NULL..      
a060: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
a070: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
a080: 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  ;.          Expr
a090: 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74   *p = pS->pEList
a0a0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b  ->a[iCol].pExpr;
a0b0: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70  .          sNC.p
a0c0: 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53  SrcList = pS->pS
a0d0: 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e  rc;.          sN
a0e0: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
a0f0: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61           sNC.pPa
a100: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
a110: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79  e;.          zTy
a120: 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28  pe = columnType(
a130: 26 73 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62  &sNC, p,&zOrigDb
a140: 2c 26 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69  ,&zOrigTab,&zOri
a150: 67 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29  gCol, &estWidth)
a160: 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ; .        }.   
a170: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
a180: 41 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d  AYS(pTab->pSchem
a190: 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  a) ){.        /*
a1a0: 20 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f   A real table */
a1b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a1c0: 20 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20   !pS );.        
a1d0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f  if( iCol<0 ) iCo
a1e0: 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  l = pTab->iPKey;
a1f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a200: 20 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43   iCol==-1 || (iC
a210: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54  ol>=0 && iCol<pT
a220: 61 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 23 69 66  ab->nCol) );.#if
a230: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
a240: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
a250: 41 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  A.        if( iC
a260: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
a270: 20 20 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47    zType = "INTEG
a280: 45 52 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ER";.          z
a290: 4f 72 69 67 43 6f 6c 20 3d 20 22 72 6f 77 69 64  OrigCol = "rowid
a2a0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
a2b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
a2c0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
a2d0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
a2e0: 20 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d        zOrigCol =
a2f0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a300: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
a310: 20 20 20 65 73 74 57 69 64 74 68 20 3d 20 70 54     estWidth = pT
a320: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73  ab->aCol[iCol].s
a330: 7a 45 73 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  zEst;.        }.
a340: 20 20 20 20 20 20 20 20 7a 4f 72 69 67 54 61 62          zOrigTab
a350: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
a360: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d          if( pNC-
a370: 3e 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 20  >pParse ){.     
a380: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
a390: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
a3a0: 64 65 78 28 70 4e 43 2d 3e 70 50 61 72 73 65 2d  dex(pNC->pParse-
a3b0: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
a3c0: 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ma);.          z
a3d0: 4f 72 69 67 44 62 20 3d 20 70 4e 43 2d 3e 70 50  OrigDb = pNC->pP
a3e0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
a3f0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b].zName;.      
a400: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
a410: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
a420: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
a430: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
a440: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a450: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
a460: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a470: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
a480: 65 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d  estWidth = pTab-
a490: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73  >aCol[iCol].szEs
a4a0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  t;.        }.#en
a4b0: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
a4c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
a4d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a4e0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
a4f0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
a500: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
a510: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
a520: 75 62 2d 73 65 6c 65 63 74 2e 20 52 65 74 75 72  ub-select. Retur
a530: 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  n the declaratio
a540: 6e 20 74 79 70 65 20 61 6e 64 0a 20 20 20 20 20  n type and.     
a550: 20 2a 2a 20 6f 72 69 67 69 6e 20 69 6e 66 6f 20   ** origin info 
a560: 66 6f 72 20 74 68 65 20 73 69 6e 67 6c 65 20 63  for the single c
a570: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
a580: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
a590: 45 4c 45 43 54 0a 20 20 20 20 20 20 2a 2a 20 73  ELECT.      ** s
a5a0: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
a5b0: 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  */.      NameCon
a5c0: 74 65 78 74 20 73 4e 43 3b 0a 20 20 20 20 20 20  text sNC;.      
a5d0: 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70 45 78  Select *pS = pEx
a5e0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
a5f0: 20 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 70       Expr *p = p
a600: 53 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  S->pEList->a[0].
a610: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
a620: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
a630: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
a640: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
a650: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
a660: 3d 20 70 53 2d 3e 70 53 72 63 3b 0a 20 20 20 20  = pS->pSrc;.    
a670: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
a680: 43 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 50 61  C;.      sNC.pPa
a690: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
a6a0: 65 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  e;.      zType =
a6b0: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
a6c0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
a6d0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
a6e0: 43 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b  Col, &estWidth);
a6f0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
a700: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a710: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
a720: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
a730: 41 44 41 54 41 20 20 0a 20 20 69 66 28 20 70 7a  ADATA  .  if( pz
a740: 4f 72 69 67 44 62 20 29 7b 0a 20 20 20 20 61 73  OrigDb ){.    as
a750: 73 65 72 74 28 20 70 7a 4f 72 69 67 54 61 62 20  sert( pzOrigTab 
a760: 26 26 20 70 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a  && pzOrigCol );.
a770: 20 20 20 20 2a 70 7a 4f 72 69 67 44 62 20 3d 20      *pzOrigDb = 
a780: 7a 4f 72 69 67 44 62 3b 0a 20 20 20 20 2a 70 7a  zOrigDb;.    *pz
a790: 4f 72 69 67 54 61 62 20 3d 20 7a 4f 72 69 67 54  OrigTab = zOrigT
a7a0: 61 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67 43  ab;.    *pzOrigC
a7b0: 6f 6c 20 3d 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20  ol = zOrigCol;. 
a7c0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
a7d0: 70 45 73 74 57 69 64 74 68 20 29 20 2a 70 45 73  pEstWidth ) *pEs
a7e0: 74 57 69 64 74 68 20 3d 20 65 73 74 57 69 64 74  tWidth = estWidt
a7f0: 68 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 79 70  h;.  return zTyp
a800: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  e;.}../*.** Gene
a810: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
a820: 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44 42  ill tell the VDB
a830: 45 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f  E the declaratio
a840: 6e 20 74 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d  n types of colum
a850: 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  ns.** in the res
a860: 75 6c 74 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  ult set..*/.stat
a870: 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74 65  ic void generate
a880: 43 6f 6c 75 6d 6e 54 79 70 65 73 28 0a 20 20 50  ColumnTypes(.  P
a890: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
a8a0: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
a8b0: 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
a8c0: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a  t *pTabList,  /*
a8d0: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
a8e0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
a8f0: 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70 72  EList    /* Expr
a900: 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67  essions defining
a910: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
a920: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
a930: 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
a940: 50 45 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  PE.  Vdbe *v = p
a950: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
a960: 69 6e 74 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e  int i;.  NameCon
a970: 74 65 78 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e  text sNC;.  sNC.
a980: 70 53 72 63 4c 69 73 74 20 3d 20 70 54 61 62 4c  pSrcList = pTabL
a990: 69 73 74 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  ist;.  sNC.pPars
a9a0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 66 6f  e = pParse;.  fo
a9b0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
a9c0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
a9d0: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 45 4c 69    Expr *p = pELi
a9e0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
a9f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
aa00: 7a 54 79 70 65 3b 0a 23 69 66 64 65 66 20 53 51  zType;.#ifdef SQ
aa10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
aa20: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
aa30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72 69  const char *zOri
aa40: 67 44 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  gDb = 0;.    con
aa50: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 54 61  st char *zOrigTa
aa60: 62 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  b = 0;.    const
aa70: 20 63 68 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20   char *zOrigCol 
aa80: 3d 20 30 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d  = 0;.    zType =
aa90: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
aaa0: 2c 20 70 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26  , p, &zOrigDb, &
aab0: 7a 4f 72 69 67 54 61 62 2c 20 26 7a 4f 72 69 67  zOrigTab, &zOrig
aac0: 43 6f 6c 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  Col, 0);..    /*
aad0: 20 54 68 65 20 76 64 62 65 20 6d 75 73 74 20 6d   The vdbe must m
aae0: 61 6b 65 20 69 74 73 20 6f 77 6e 20 63 6f 70 79  ake its own copy
aaf0: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 74   of the column-t
ab00: 79 70 65 20 61 6e 64 20 6f 74 68 65 72 20 0a 20  ype and other . 
ab10: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 73 70 65     ** column spe
ab20: 63 69 66 69 63 20 73 74 72 69 6e 67 73 2c 20 69  cific strings, i
ab30: 6e 20 63 61 73 65 20 74 68 65 20 73 63 68 65 6d  n case the schem
ab40: 61 20 69 73 20 72 65 73 65 74 20 62 65 66 6f 72  a is reset befor
ab50: 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 76 69  e this.    ** vi
ab60: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 69 73  rtual machine is
ab70: 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
ab80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ab90: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
aba0: 20 43 4f 4c 4e 41 4d 45 5f 44 41 54 41 42 41 53   COLNAME_DATABAS
abb0: 45 2c 20 7a 4f 72 69 67 44 62 2c 20 53 51 4c 49  E, zOrigDb, SQLI
abc0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
abd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
abe0: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
abf0: 4f 4c 4e 41 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f  OLNAME_TABLE, zO
ac00: 72 69 67 54 61 62 2c 20 53 51 4c 49 54 45 5f 54  rigTab, SQLITE_T
ac10: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
ac20: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ac30: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ac40: 4d 45 5f 43 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67  ME_COLUMN, zOrig
ac50: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
ac60: 53 49 45 4e 54 29 3b 0a 23 65 6c 73 65 0a 20 20  SIENT);.#else.  
ac70: 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e    zType = column
ac80: 54 79 70 65 28 26 73 4e 43 2c 20 70 2c 20 30 2c  Type(&sNC, p, 0,
ac90: 20 30 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69   0, 0, 0);.#endi
aca0: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  f.    sqlite3Vdb
acb0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
acc0: 2c 20 43 4f 4c 4e 41 4d 45 5f 44 45 43 4c 54 59  , COLNAME_DECLTY
acd0: 50 45 2c 20 7a 54 79 70 65 2c 20 53 51 4c 49 54  PE, zType, SQLIT
ace0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
acf0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
ad00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ad10: 5f 44 45 43 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a  _DECLTYPE) */.}.
ad20: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
ad30: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 74  code that will t
ad40: 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68 65  ell the VDBE the
ad50: 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e   names of column
ad60: 73 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75  s.** in the resu
ad70: 6c 74 20 73 65 74 2e 20 20 54 68 69 73 20 69 6e  lt set.  This in
ad80: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65  formation is use
ad90: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
ada0: 0a 2a 2a 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75  .** azCol[] valu
adb0: 65 73 20 69 6e 20 74 68 65 20 63 61 6c 6c 62 61  es in the callba
adc0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
add0: 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d  id generateColum
ade0: 6e 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  nNames(.  Parse 
adf0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
ae00: 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   Parser context 
ae10: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
ae20: 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  abList,  /* List
ae30: 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   of tables */.  
ae40: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
ae50: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
ae60: 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65 20  ns defining the 
ae70: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b  result set */.){
ae80: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
ae90: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
aea0: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
aeb0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
aec0: 64 62 3b 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61  db;.  int fullNa
aed0: 6d 65 73 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b  mes, shortNames;
aee0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
aef0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
af00: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
af10: 20 45 58 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74   EXPLAIN, skip t
af20: 68 69 73 20 73 74 65 70 20 2a 2f 0a 20 20 69 66  his step */.  if
af30: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
af40: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
af50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
af60: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  f( pParse->colNa
af70: 6d 65 73 53 65 74 20 7c 7c 20 4e 45 56 45 52 28  mesSet || NEVER(
af80: 76 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  v==0) || db->mal
af90: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
afa0: 72 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f  rn;.  pParse->co
afb0: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20  lNamesSet = 1;. 
afc0: 20 66 75 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62   fullNames = (db
afd0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
afe0: 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d  _FullColNames)!=
aff0: 30 3b 0a 20 20 73 68 6f 72 74 4e 61 6d 65 73 20  0;.  shortNames 
b000: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
b010: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
b020: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  mes)!=0;.  sqlit
b030: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
b040: 28 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  (v, pEList->nExp
b050: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
b060: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
b070: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
b080: 70 3b 0a 20 20 20 20 70 20 3d 20 70 45 4c 69 73  p;.    p = pELis
b090: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
b0a0: 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d     if( NEVER(p==
b0b0: 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  0) ) continue;. 
b0c0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
b0d0: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  [i].zName ){.   
b0e0: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
b0f0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
b100: 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ame;.      sqlit
b110: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
b120: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e  (v, i, COLNAME_N
b130: 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49  AME, zName, SQLI
b140: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
b150: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
b160: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op==TK_COLUMN |
b170: 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  | p->op==TK_AGG_
b180: 43 4f 4c 55 4d 4e 29 20 26 26 20 70 54 61 62 4c  COLUMN) && pTabL
b190: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 54 61 62  ist ){.      Tab
b1a0: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20  le *pTab;.      
b1b0: 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20  char *zCol;.    
b1c0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
b1d0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66  iColumn;.      f
b1e0: 6f 72 28 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a  or(j=0; ALWAYS(j
b1f0: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29  <pTabList->nSrc)
b200: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
b210: 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  if( pTabList->a[
b220: 6a 5d 2e 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69  j].iCursor==p->i
b230: 54 61 62 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20  Table ) break;. 
b240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
b250: 65 72 74 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d  ert( j<pTabList-
b260: 3e 6e 53 72 63 20 29 3b 0a 20 20 20 20 20 20 70  >nSrc );.      p
b270: 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Tab = pTabList->
b280: 61 5b 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[j].pTab;.     
b290: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43   if( iCol<0 ) iC
b2a0: 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  ol = pTab->iPKey
b2b0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b2c0: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
b2d0: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
b2e0: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
b2f0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
b300: 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
b310: 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 7d 65  rowid";.      }e
b320: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
b330: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  l = pTab->aCol[i
b340: 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Col].zName;.    
b350: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73    }.      if( !s
b360: 68 6f 72 74 4e 61 6d 65 73 20 26 26 20 21 66 75  hortNames && !fu
b370: 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20  llNames ){.     
b380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
b390: 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43  tColName(v, i, C
b3a0: 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20  OLNAME_NAME, .  
b3b0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b3c0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
b3d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
b3e0: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
b3f0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  C);.      }else 
b400: 69 66 28 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  if( fullNames ){
b410: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
b420: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Name = 0;.      
b430: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
b440: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
b450: 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
b460: 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e, zCol);.      
b470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
b480: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
b490: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d  LNAME_NAME, zNam
b4a0: 65 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  e, SQLITE_DYNAMI
b4b0: 43 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  C);.      }else{
b4c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b4d0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
b4e0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
b4f0: 45 2c 20 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f  E, zCol, SQLITE_
b500: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
b510: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
b520: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b530: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
b540: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a   COLNAME_NAME, .
b550: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b560: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
b570: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
b580: 29 2c 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  ), SQLITE_DYNAMI
b590: 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  C);.    }.  }.  
b5a0: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79  generateColumnTy
b5b0: 70 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  pes(pParse, pTab
b5c0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d  List, pEList);.}
b5d0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
b5e0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
b5f0: 73 74 20 28 77 68 69 63 68 20 69 73 20 72 65 61  st (which is rea
b600: 6c 6c 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20  lly the list of 
b610: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74  expressions.** t
b620: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73  hat form the res
b630: 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c  ult set of a SEL
b640: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63  ECT statement) c
b650: 6f 6d 70 75 74 65 20 61 70 70 72 6f 70 72 69 61  ompute appropria
b660: 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d  te.** column nam
b670: 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74  es for a table t
b680: 68 61 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  hat would hold t
b690: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
b6a0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  st..**.** All co
b6b0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20  lumn names will 
b6c0: 62 65 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a  be unique..**.**
b6d0: 20 4f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   Only the column
b6e0: 20 6e 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75   names are compu
b6f0: 74 65 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79  ted.  Column.zTy
b700: 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c  pe, Column.zColl
b710: 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66  ,.** and other f
b720: 69 65 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20  ields of Column 
b730: 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
b740: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
b750: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b760: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
b770: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
b780: 75 72 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55  urs,.** store NU
b790: 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64  LL in *paCol and
b7a0: 20 30 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64   0 in *pnCol and
b7b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b7c0: 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  OMEM..*/.static 
b7d0: 69 6e 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e  int selectColumn
b7e0: 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20  sFromExprList(. 
b7f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
b800: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
b810: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
b820: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b830: 74 2c 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72  t,       /* Expr
b840: 20 6c 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68   list from which
b850: 20 74 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d   to derive colum
b860: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36  n names */.  i16
b870: 20 2a 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20   *pnCol,        
b880: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
b890: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
b8a0: 6d 6e 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f  mns here */.  Co
b8b0: 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20  lumn **paCol    
b8c0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
b8d0: 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69  he new column li
b8e0: 73 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  st here */.){.  
b8f0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b900: 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44  arse->db;   /* D
b910: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
b920: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  on */.  int i, j
b930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b940: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
b950: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
b960: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
b970: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61        /* Index a
b980: 64 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  dded to make the
b990: 20 6e 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a   name unique */.
b9a0: 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20    Column *aCol, 
b9b0: 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a  *pCol;        /*
b9c0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
b9d0: 72 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  r result columns
b9e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20   */.  int nCol; 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
ba10: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
ba20: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78  sult set */.  Ex
ba30: 70 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  pr *p;          
ba40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
ba50: 72 65 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69  ression for a si
ba60: 6e 67 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75  ngle result colu
ba70: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  mn */.  char *zN
ba80: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
ba90: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
baa0: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  me */.  int nNam
bab0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bac0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e      /* Size of n
bad0: 61 6d 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a  ame in zName[] *
bae0: 2f 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20  /..  if( pEList 
baf0: 29 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45  ){.    nCol = pE
bb00: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
bb10: 20 61 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   aCol = sqlite3D
bb20: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
bb30: 73 69 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a  sizeof(aCol[0])*
bb40: 6e 43 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63  nCol);.    testc
bb50: 61 73 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ase( aCol==0 );.
bb60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
bb70: 6c 20 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20  l = 0;.    aCol 
bb80: 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f  = 0;.  }.  *pnCo
bb90: 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43  l = nCol;.  *paC
bba0: 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f  ol = aCol;..  fo
bbb0: 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c  r(i=0, pCol=aCol
bbc0: 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  ; i<nCol; i++, p
bbd0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47  Col++){.    /* G
bbe0: 65 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  et an appropriat
bbf0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63  e name for the c
bc00: 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  olumn.    */.   
bc10: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
bc20: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69  SkipCollate(pELi
bc30: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
bc40: 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20  .    if( (zName 
bc50: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
bc60: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
bc70: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
bc80: 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22  mn contains an "
bc90: 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73  AS <name>" phras
bca0: 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73  e, use <name> as
bcb0: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   the name */.   
bcc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
bcd0: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a  e3DbStrDup(db, z
bce0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
bcf0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43  {.      Expr *pC
bd00: 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20  olExpr = p;  /* 
bd10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
bd20: 68 61 74 20 69 73 20 74 68 65 20 72 65 73 75 6c  hat is the resul
bd30: 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  t column name */
bd40: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
bd50: 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ab;         /* T
bd60: 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  able associated 
bd70: 77 69 74 68 20 74 68 69 73 20 65 78 70 72 65 73  with this expres
bd80: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68  sion */.      wh
bd90: 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f  ile( pColExpr->o
bda0: 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20  p==TK_DOT ){.   
bdb0: 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20       pColExpr = 
bdc0: 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74  pColExpr->pRight
bdd0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
bde0: 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b  ( pColExpr!=0 );
bdf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
be00: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
be10: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c  =TK_COLUMN && AL
be20: 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70  WAYS(pColExpr->p
be30: 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Tab!=0) ){.     
be40: 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e     /* For column
be50: 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  s use the column
be60: 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   name name */.  
be70: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
be80: 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75   pColExpr->iColu
be90: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  mn;.        pTab
bea0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61   = pColExpr->pTa
beb0: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  b;.        if( i
bec0: 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70  Col<0 ) iCol = p
bed0: 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
bee0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
bef0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
bf00: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
bf10: 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20        iCol>=0 ? 
bf20: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
bf30: 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22  .zName : "rowid"
bf40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
bf50: 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  f( pColExpr->op=
bf60: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
bf70: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
bf80: 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45  asProperty(pColE
bf90: 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
bfa0: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  ) );.        zNa
bfb0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
bfc0: 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43  ntf(db, "%s", pC
bfd0: 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  olExpr->u.zToken
bfe0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
bff0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74          /* Use t
c000: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74  he original text
c010: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65   of the column e
c020: 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73  xpression as its
c030: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   name */.       
c040: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
c050: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
c060: 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  , pEList->a[i].z
c070: 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Span);.      }. 
c080: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d     }.    if( db-
c090: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
c0a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
c0b0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
c0c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c0d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
c0e0: 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e   sure the column
c0f0: 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e   name is unique.
c100: 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73    If the name is
c110: 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20   not unique,.   
c120: 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74   ** append a int
c130: 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65  eger to the name
c140: 20 73 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f   so that it beco
c150: 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20  mes unique..    
c160: 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73  */.    nName = s
c170: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
c180: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Name);.    for(j
c190: 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b  =cnt=0; j<i; j++
c1a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
c1b0: 69 74 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c  ite3StrICmp(aCol
c1c0: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [j].zName, zName
c1d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
c1e0: 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a  char *zNewName;.
c1f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
c200: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 6e 4e 61         for(k=nNa
c210: 6d 65 2d 31 3b 20 6b 3e 31 20 26 26 20 73 71 6c  me-1; k>1 && sql
c220: 69 74 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d  ite3Isdigit(zNam
c230: 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20  e[k]); k--){}.  
c240: 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b        if( zName[
c250: 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20  k]==':' ) nName 
c260: 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61  = k;.        zNa
c270: 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20  me[nName] = 0;. 
c280: 20 20 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20         zNewName 
c290: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
c2a0: 28 64 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e  (db, "%s:%d", zN
c2b0: 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20  ame, ++cnt);.   
c2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
c2d0: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
c2e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a         zName = z
c2f0: 4e 65 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  NewName;.       
c300: 20 6a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   j = -1;.       
c310: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
c320: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
c330: 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a     }.    pCol->z
c340: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
c350: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  }.  if( db->mall
c360: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
c370: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b  for(j=0; j<i; j+
c380: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
c390: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
c3a0: 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [j].zName);.    
c3b0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
c3c0: 72 65 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20  ree(db, aCol);. 
c3d0: 20 20 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20     *paCol = 0;. 
c3e0: 20 20 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20     *pnCol = 0;. 
c3f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c400: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
c410: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c420: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70  }../*.** Add typ
c430: 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
c440: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
c450: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73   column list bas
c460: 65 64 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43  ed on.** a SELEC
c470: 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
c480: 0a 2a 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c  .** The column l
c490: 69 73 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63  ist presumably c
c4a0: 61 6d 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43  ame from selectC
c4b0: 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78  olumnNamesFromEx
c4c0: 70 72 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65  prList()..** The
c4d0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73   column list has
c4e0: 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74   only names, not
c4f0: 20 74 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74   types or collat
c500: 69 6f 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72  ions.  This.** r
c510: 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f  outine goes thro
c520: 75 67 68 20 61 6e 64 20 61 64 64 73 20 74 68 65  ugh and adds the
c530: 20 74 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61   types and colla
c540: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
c550: 73 20 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72  s routine requir
c560: 65 73 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e  es that all iden
c570: 74 69 66 69 65 72 73 20 69 6e 20 74 68 65 20 53  tifiers in the S
c580: 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
c590: 6e 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  nt be resolved..
c5a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
c5b0: 65 6c 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79  electAddColumnTy
c5c0: 70 65 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a  peAndCollation(.
c5d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c5e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c5f0: 6e 67 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  ng contexts */. 
c600: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
c610: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f         /* Add co
c620: 6c 75 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d  lumn type inform
c630: 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61  ation to this ta
c640: 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
c650: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
c660: 2a 20 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f  * SELECT used to
c670: 20 64 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73   determine types
c680: 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20   and collations 
c690: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
c6a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c6b0: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
c6c0: 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  sNC;.  Column *p
c6d0: 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  Col;.  CollSeq *
c6e0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pColl;.  int i;.
c6f0: 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72    Expr *p;.  str
c700: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
c710: 6d 20 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c  m *a;.  u64 szAl
c720: 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  l = 0;..  assert
c730: 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a  ( pSelect!=0 );.
c740: 20 20 61 73 73 65 72 74 28 20 28 70 53 65 6c 65    assert( (pSele
c750: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
c760: 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29  F_Resolved)!=0 )
c770: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
c780: 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d  ->nCol==pSelect-
c790: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c  >pEList->nExpr |
c7a0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
c7b0: 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ed );.  if( db->
c7c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
c7d0: 65 74 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28  eturn;.  memset(
c7e0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
c7f0: 73 4e 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72  sNC));.  sNC.pSr
c800: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
c810: 3e 70 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65  >pSrc;.  a = pSe
c820: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b  lect->pEList->a;
c830: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c  .  for(i=0, pCol
c840: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70  =pTab->aCol; i<p
c850: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  Tab->nCol; i++, 
c860: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
c870: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
c880: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
c890: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c8a0: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
c8b0: 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43  NC, p,0,0,0, &pC
c8c0: 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20  ol->szEst));.   
c8d0: 20 73 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e   szAll += pCol->
c8e0: 73 7a 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d  szEst;.    pCol-
c8f0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
c900: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
c910: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  p);.    if( pCol
c920: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20  ->affinity==0 ) 
c930: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
c940: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
c950: 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  ;.    pColl = sq
c960: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
c970: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
c980: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
c990: 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20      pCol->zColl 
c9a0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
c9b0: 70 28 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  p(db, pColl->zNa
c9c0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  me);.    }.  }. 
c9d0: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20   pTab->szTabRow 
c9e0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
c9f0: 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  szAll*4);.}../*.
ca00: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
ca10: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
ca20: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
ca30: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
ca40: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
ca50: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
ca60: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
ca70: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
ca80: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
ca90: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
caa0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
cab0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
cac0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
cad0: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
cae0: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
caf0: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
cb00: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
cb10: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
cb20: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
cb30: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
cb40: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
cb50: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
cb60: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
cb70: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
cb80: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
cb90: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
cba0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
cbb0: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
cbc0: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
cbd0: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
cbe0: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
cbf0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
cc00: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
cc10: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
cc20: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
cc30: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
cc40: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
cc50: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
cc60: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
cc70: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
cc80: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
cc90: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
cca0: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
ccb0: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
ccc0: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
ccd0: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
cce0: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
ccf0: 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37  nRowEst = 104857
cd00: 36 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  6;.  selectColum
cd10: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
cd20: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
cd30: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
cd40: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
cd50: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
cd60: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
cd70: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
cd80: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70  b, pSelect);.  p
cd90: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b  Tab->iPKey = -1;
cda0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
cdb0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
cdc0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
cdd0: 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20  e(db, pTab);.   
cde0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cdf0: 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a   return pTab;.}.
ce00: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42  ./*.** Get a VDB
ce10: 45 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  E for the given 
ce20: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  parser context. 
ce30: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
ce40: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  e if necessary..
ce50: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
ce60: 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55  ccurs, return NU
ce70: 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d  LL and leave a m
ce80: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
ce90: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
cea0: 65 33 47 65 74 56 64 62 65 28 50 61 72 73 65 20  e3GetVdbe(Parse 
ceb0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
cec0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
ced0: 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dbe;.  if( v==0 
cee0: 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73  ){.    v = pPars
cef0: 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74  e->pVdbe = sqlit
cf00: 65 33 56 64 62 65 43 72 65 61 74 65 28 70 50 61  e3VdbeCreate(pPa
cf10: 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
cf20: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
cf30: 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20      if( v ){.   
cf40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cf50: 64 4f 70 30 28 76 2c 20 4f 50 5f 54 72 61 63 65  dOp0(v, OP_Trace
cf60: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
cf70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a    }.  return v;.
cf80: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  }.../*.** Comput
cf90: 65 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64  e the iLimit and
cfa0: 20 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20   iOffset fields 
cfb0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61  of the SELECT ba
cfc0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c  sed on the.** pL
cfd0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
cfe0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70   expressions.  p
cff0: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
d000: 74 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65  t hold the expre
d010: 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61  ssions.** that a
d020: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69  ppear in the ori
d030: 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  ginal SQL statem
d040: 65 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49  ent after the LI
d050: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a  MIT and OFFSET.*
d060: 2a 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  * keywords.  Or 
d070: 4e 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65  NULL if those ke
d080: 79 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74  ywords are omitt
d090: 65 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69  ed. iLimit and i
d0a0: 4f 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74  Offset .** are t
d0b0: 68 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72  he integer memor
d0c0: 79 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65  y register numbe
d0d0: 72 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20  rs for counters 
d0e0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
d0f0: 0a 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e  .** the limit an
d100: 64 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68  d offset.  If th
d110: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
d120: 61 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74  and/or offset, t
d130: 68 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61  hen .** iLimit a
d140: 6e 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e  nd iOffset are n
d150: 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  egative..**.** T
d160: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e  his routine chan
d170: 67 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ges the values o
d180: 66 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66  f iLimit and iOf
d190: 66 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20  fset only if.** 
d1a0: 61 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65  a limit or offse
d1b0: 74 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20  t is defined by 
d1c0: 70 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73  pLimit and pOffs
d1d0: 65 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a  et.  iLimit and.
d1e0: 2a 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c  ** iOffset shoul
d1f0: 64 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73  d have been pres
d200: 65 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74  et to appropriat
d210: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73  e default values
d220: 0a 2a 2a 20 28 75 73 75 61 6c 6c 79 20 62 75 74  .** (usually but
d230: 20 6e 6f 74 20 61 6c 77 61 79 73 20 2d 31 29 20   not always -1) 
d240: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
d250: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
d260: 2a 20 4f 6e 6c 79 20 69 66 20 70 4c 69 6d 69 74  * Only if pLimit
d270: 21 3d 30 20 6f 72 20 70 4f 66 66 73 65 74 21 3d  !=0 or pOffset!=
d280: 30 20 64 6f 20 74 68 65 20 6c 69 6d 69 74 20 72  0 do the limit r
d290: 65 67 69 73 74 65 72 73 20 67 65 74 0a 2a 2a 20  egisters get.** 
d2a0: 72 65 64 65 66 69 6e 65 64 2e 20 20 54 68 65 20  redefined.  The 
d2b0: 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
d2c0: 6f 72 20 75 73 65 73 20 74 68 69 73 20 70 72 6f  or uses this pro
d2d0: 70 65 72 74 79 20 74 6f 20 66 6f 72 63 65 0a 2a  perty to force.*
d2e0: 2a 20 74 68 65 20 72 65 75 73 65 20 6f 66 20 74  * the reuse of t
d2f0: 68 65 20 73 61 6d 65 20 6c 69 6d 69 74 20 61 6e  he same limit an
d300: 64 20 6f 66 66 73 65 74 20 72 65 67 69 73 74 65  d offset registe
d310: 72 73 20 61 63 72 6f 73 73 20 6d 75 6c 74 69 70  rs across multip
d320: 6c 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  le.** SELECT sta
d330: 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
d340: 69 63 20 76 6f 69 64 20 63 6f 6d 70 75 74 65 4c  ic void computeL
d350: 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 50 61  imitRegisters(Pa
d360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
d370: 65 63 74 20 2a 70 2c 20 69 6e 74 20 69 42 72 65  ect *p, int iBre
d380: 61 6b 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ak){.  Vdbe *v =
d390: 20 30 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74   0;.  int iLimit
d3a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66 66   = 0;.  int iOff
d3b0: 73 65 74 3b 0a 20 20 69 6e 74 20 61 64 64 72 31  set;.  int addr1
d3c0: 2c 20 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c  , n;.  if( p->iL
d3d0: 69 6d 69 74 20 29 20 72 65 74 75 72 6e 3b 0a 0a  imit ) return;..
d3e0: 20 20 2f 2a 20 0a 20 20 2a 2a 20 22 4c 49 4d 49    /* .  ** "LIMI
d3f0: 54 20 2d 31 22 20 61 6c 77 61 79 73 20 73 68 6f  T -1" always sho
d400: 77 73 20 61 6c 6c 20 72 6f 77 73 2e 20 20 54 68  ws all rows.  Th
d410: 65 72 65 20 69 73 20 73 6f 6d 65 0a 20 20 2a 2a  ere is some.  **
d420: 20 63 6f 6e 74 72 6f 76 65 72 73 79 20 61 62 6f   controversy abo
d430: 75 74 20 77 68 61 74 20 74 68 65 20 63 6f 72 72  ut what the corr
d440: 65 63 74 20 62 65 68 61 76 69 6f 72 20 73 68 6f  ect behavior sho
d450: 75 6c 64 20 62 65 2e 0a 20 20 2a 2a 20 54 68 65  uld be..  ** The
d460: 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
d470: 6e 74 61 74 69 6f 6e 20 69 6e 74 65 72 70 72 65  ntation interpre
d480: 74 73 20 22 4c 49 4d 49 54 20 30 22 20 74 6f 20  ts "LIMIT 0" to 
d490: 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f 20 72 6f 77  mean.  ** no row
d4a0: 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
d4b0: 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
d4c0: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
d4d0: 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30  t( p->pOffset==0
d4e0: 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69 74 21 3d 30   || p->pLimit!=0
d4f0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69   );.  if( p->pLi
d500: 6d 69 74 20 29 7b 0a 20 20 20 20 70 2d 3e 69 4c  mit ){.    p->iL
d510: 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74 20 3d 20  imit = iLimit = 
d520: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
d530: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
d540: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
d550: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
d560: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  =0) ) return;  /
d570: 2a 20 56 44 42 45 20 73 68 6f 75 6c 64 20 68 61  * VDBE should ha
d580: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
d590: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20  allocated */.   
d5a0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
d5b0: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 69  IsInteger(p->pLi
d5c0: 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20 20  mit, &n) ){.    
d5d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d5e0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
d5f0: 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a 20  r, n, iLimit);. 
d600: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
d610: 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e  ((v, "LIMIT coun
d620: 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69 66  ter"));.      if
d630: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
d640: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d650: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
d660: 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20  0, iBreak);.    
d670: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d 30    }else if( n>=0
d680: 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
d690: 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20 20  w>(u64)n ){.    
d6a0: 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
d6b0: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  w = n;.      }. 
d6c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d6d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
d6e0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d 69  pParse, p->pLimi
d6f0: 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20  t, iLimit);.    
d700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d710: 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65  Op1(v, OP_MustBe
d720: 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20  Int, iLimit);.  
d730: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
d740: 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75 6e 74  (v, "LIMIT count
d750: 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  er"));.      sql
d760: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
d770: 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69 4c 69  , OP_IfZero, iLi
d780: 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  mit, iBreak);.  
d790: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 70    }.    if( p->p
d7a0: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
d7b0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 69 4f 66  p->iOffset = iOf
d7c0: 66 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  fset = ++pParse-
d7d0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 70 50 61  >nMem;.      pPa
d7e0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20 20 20 2f  rse->nMem++;   /
d7f0: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 20 65 78  * Allocate an ex
d800: 74 72 61 20 72 65 67 69 73 74 65 72 20 66 6f 72  tra register for
d810: 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74 20 2a 2f   limit+offset */
d820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
d830: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
d840: 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  ->pOffset, iOffs
d850: 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  et);.      sqlit
d860: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d870: 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 4f  OP_MustBeInt, iO
d880: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64  ffset);.      Vd
d890: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  beComment((v, "O
d8a0: 46 46 53 45 54 20 63 6f 75 6e 74 65 72 22 29 29  FFSET counter"))
d8b0: 3b 0a 20 20 20 20 20 20 61 64 64 72 31 20 3d 20  ;.      addr1 = 
d8c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d8d0: 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69  1(v, OP_IfPos, i
d8e0: 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73  Offset);.      s
d8f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
d900: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
d910: 30 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  0, iOffset);.   
d920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d930: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
d940: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d950: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
d960: 41 64 64 2c 20 69 4c 69 6d 69 74 2c 20 69 4f 66  Add, iLimit, iOf
d970: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 2b 31 29  fset, iOffset+1)
d980: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
d990: 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49 54 2b 4f  ent((v, "LIMIT+O
d9a0: 46 46 53 45 54 22 29 29 3b 0a 20 20 20 20 20 20  FFSET"));.      
d9b0: 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
d9c0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
d9d0: 49 66 50 6f 73 2c 20 69 4c 69 6d 69 74 29 3b 0a  IfPos, iLimit);.
d9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d9f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
da00: 74 65 67 65 72 2c 20 2d 31 2c 20 69 4f 66 66 73  teger, -1, iOffs
da10: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  et+1);.      sql
da20: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
da30: 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20  (v, addr1);.    
da40: 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  }.  }.}..#ifndef
da50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
da60: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 2f 2a 0a  POUND_SELECT./*.
da70: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 70  ** Return the ap
da80: 70 72 6f 70 72 69 61 74 65 20 63 6f 6c 6c 61 74  propriate collat
da90: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72  ing sequence for
daa0: 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   the iCol-th col
dab0: 75 6d 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 72 65  umn of.** the re
dac0: 73 75 6c 74 20 73 65 74 20 66 6f 72 20 74 68 65  sult set for the
dad0: 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74   compound-select
dae0: 20 73 74 61 74 65 6d 65 6e 74 20 22 70 22 2e 20   statement "p". 
daf0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 0a   Return NULL if.
db00: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68 61  ** the column ha
db10: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
db20: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
db30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
db40: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f  ting sequence fo
db50: 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73  r the compound s
db60: 65 6c 65 63 74 20 69 73 20 74 61 6b 65 6e 20 66  elect is taken f
db70: 72 6f 6d 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d  rom the.** left-
db80: 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  most term of the
db90: 20 73 65 6c 65 63 74 20 74 68 61 74 20 68 61 73   select that has
dba0: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
dbb0: 75 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  uence..*/.static
dbc0: 20 43 6f 6c 6c 53 65 71 20 2a 6d 75 6c 74 69 53   CollSeq *multiS
dbd0: 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 50 61 72  electCollSeq(Par
dbe0: 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
dbf0: 63 74 20 2a 70 2c 20 69 6e 74 20 69 43 6f 6c 29  ct *p, int iCol)
dc00: 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65  {.  CollSeq *pRe
dc10: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  t;.  if( p->pPri
dc20: 6f 72 20 29 7b 0a 20 20 20 20 70 52 65 74 20 3d  or ){.    pRet =
dc30: 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
dc40: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  Seq(pParse, p->p
dc50: 50 72 69 6f 72 2c 20 69 43 6f 6c 29 3b 0a 20 20  Prior, iCol);.  
dc60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 65 74 20  }else{.    pRet 
dc70: 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
dc80: 74 28 20 69 43 6f 6c 3e 3d 30 20 29 3b 0a 20 20  t( iCol>=0 );.  
dc90: 69 66 28 20 70 52 65 74 3d 3d 30 20 26 26 20 69  if( pRet==0 && i
dca0: 43 6f 6c 3c 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  Col<p->pEList->n
dcb0: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 52 65 74  Expr ){.    pRet
dcc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
dcd0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d  llSeq(pParse, p-
dce0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d  >pEList->a[iCol]
dcf0: 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  .pExpr);.  }.  r
dd00: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 23 65  eturn pRet;.}.#e
dd10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
dd20: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
dd30: 45 43 54 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61  ECT */../* Forwa
dd40: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
dd50: 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69  static int multi
dd60: 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20  SelectOrderBy(. 
dd70: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
dd80: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
dd90: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
dda0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
ddb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
ddc0: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
ddd0: 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
dde0: 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
ddf0: 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
de00: 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
de10: 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a  y results */.);.
de20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
de30: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
de40: 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ELECT./*.** This
de50: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
de60: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20  ed to process a 
de70: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66  compound query f
de80: 6f 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20  orm from.** two 
de90: 6f 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65  or more separate
dea0: 20 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55   queries using U
deb0: 4e 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c  NION, UNION ALL,
dec0: 20 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49   EXCEPT, or.** I
ded0: 4e 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22  NTERSECT.**.** "
dee0: 70 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  p" points to the
def0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74   right-most of t
df00: 68 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20  he two queries. 
df10: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
df20: 65 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e  e.** left is p->
df30: 70 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66  pPrior.  The lef
df40: 74 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c  t query could al
df50: 73 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64  so be a compound
df60: 20 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69   query.** in whi
df70: 63 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75  ch case this rou
df80: 74 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c  tine will be cal
df90: 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  led recursively.
dfa0: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75   .**.** The resu
dfb0: 6c 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c  lts of the total
dfc0: 20 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65   query are to be
dfd0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20   written into a 
dfe0: 64 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  destination.** o
dff0: 66 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74  f type eDest wit
e000: 68 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72  h parameter iPar
e010: 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65  m..**.** Example
e020: 20 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20   1:  Consider a 
e030: 74 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75  three-way compou
e040: 6e 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  nd SQL statement
e050: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  ..**.**     SELE
e060: 43 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49  CT a FROM t1 UNI
e070: 4f 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d  ON SELECT b FROM
e080: 20 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54   t2 UNION SELECT
e090: 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a   c FROM t3.**.**
e0a0: 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   This statement 
e0b0: 69 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20  is parsed up as 
e0c0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
e0d0: 20 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d     SELECT c FROM
e0e0: 20 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a   t3.**      |.**
e0f0: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53        `----->  S
e100: 45 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a  ELECT b FROM t2.
e110: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e120: 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    |.**          
e130: 20 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20        `------>  
e140: 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31  SELECT a FROM t1
e150: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77  .**.** The arrow
e160: 73 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d  s in the diagram
e170: 20 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74   above represent
e180: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69   the Select.pPri
e190: 6f 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53  or pointer..** S
e1a0: 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  o if this routin
e1b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68  e is called with
e1c0: 20 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20   p equal to the 
e1d0: 74 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  t3 query, then.*
e1e0: 2a 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65  * pPrior will be
e1f0: 20 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20   the t2 query.  
e200: 70 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b  p->op will be TK
e210: 5f 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63  _UNION in this c
e220: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63  ase..**.** Notic
e230: 65 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f  e that because o
e240: 66 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65  f the way SQLite
e250: 20 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64   parses compound
e260: 20 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a   SELECTs, the.**
e270: 20 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65   individual sele
e280: 63 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70  cts always group
e290: 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
e2a0: 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ght..*/.static i
e2b0: 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a  nt multiSelect(.
e2c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e2d0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
e2e0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
e2f0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
e300: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67        /* The rig
e310: 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43  ht-most of SELEC
e320: 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a  Ts to be coded *
e330: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
e340: 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61  pDest     /* Wha
e350: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65  t to do with que
e360: 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b  ry results */.){
e370: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
e380: 54 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63  TE_OK;   /* Succ
e390: 65 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20  ess code from a 
e3a0: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
e3b0: 53 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20  Select *pPrior; 
e3c0: 20 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72        /* Another
e3d0: 20 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74   SELECT immediat
e3e0: 65 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20  ely to our left 
e3f0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
e400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65             /* Ge
e410: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74  nerate code to t
e420: 68 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65  his VDBE */.  Se
e430: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20  lectDest dest;  
e440: 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
e450: 76 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74  ve data destinat
e460: 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
e470: 2a 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f  *pDelete = 0;  /
e480: 2a 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c  * Chain of simpl
e490: 65 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c  e selects to del
e4a0: 65 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ete */.  sqlite3
e4b0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f   *db;          /
e4c0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
e4d0: 63 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66  ction */.#ifndef
e4e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
e4f0: 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
e500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e510: 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
e520: 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
e530: 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
e540: 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
e550: 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
e560: 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
e570: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
e580: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
e590: 59 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73  Y or LIMIT claus
e5a0: 65 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43  e on prior SELEC
e5b0: 54 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74  Ts.  Only.  ** t
e5c0: 68 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d  he last (right-m
e5d0: 6f 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74  ost) SELECT in t
e5e0: 68 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61  he series may ha
e5f0: 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  ve an ORDER BY o
e600: 72 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20  r LIMIT..  */.  
e610: 61 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e  assert( p && p->
e620: 70 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61  pPrior );  /* Ca
e630: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67  lling function g
e640: 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d  uarantees this m
e650: 75 63 68 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  uch */.  db = pP
e660: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69  arse->db;.  pPri
e670: 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
e680: 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72    assert( pPrior
e690: 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d 70 50  ->pRightmost!=pP
e6a0: 72 69 6f 72 20 29 3b 0a 20 20 61 73 73 65 72 74  rior );.  assert
e6b0: 28 20 70 50 72 69 6f 72 2d 3e 70 52 69 67 68 74  ( pPrior->pRight
e6c0: 6d 6f 73 74 3d 3d 70 2d 3e 70 52 69 67 68 74 6d  most==p->pRightm
e6d0: 6f 73 74 20 29 3b 0a 20 20 64 65 73 74 20 3d 20  ost );.  dest = 
e6e0: 2a 70 44 65 73 74 3b 0a 20 20 69 66 28 20 70 50  *pDest;.  if( pP
e6f0: 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
e700: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
e710: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4f 52  orMsg(pParse,"OR
e720: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73 68  DER BY clause sh
e730: 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74 65 72 20  ould come after 
e740: 25 73 20 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a  %s not before",.
e750: 20 20 20 20 20 20 73 65 6c 65 63 74 4f 70 4e 61        selectOpNa
e760: 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
e770: 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
e780: 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
e790: 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  d;.  }.  if( pPr
e7a0: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  ior->pLimit ){. 
e7b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e7c0: 73 67 28 70 50 61 72 73 65 2c 22 4c 49 4d 49 54  sg(pParse,"LIMIT
e7d0: 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63   clause should c
e7e0: 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74  ome after %s not
e7f0: 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20   before",.      
e800: 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
e810: 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31  op));.    rc = 1
e820: 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69  ;.    goto multi
e830: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d  _select_end;.  }
e840: 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
e850: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e860: 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
e870: 3b 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 61  ;  /* The VDBE a
e880: 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 20 62  lready created b
e890: 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  y calling functi
e8a0: 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43 72 65 61  on */..  /* Crea
e8b0: 74 65 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  te the destinati
e8c0: 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  on temporary tab
e8d0: 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 0a  le if necessary.
e8e0: 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73 74 2e    */.  if( dest.
e8f0: 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
e900: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
e910: 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
e920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e930: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
e940: 45 70 68 65 6d 65 72 61 6c 2c 20 64 65 73 74 2e  Ephemeral, dest.
e950: 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70 45 4c 69  iSDParm, p->pELi
e960: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
e970: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
e980: 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
e990: 52 44 45 52 45 44 29 3b 0a 20 20 20 20 64 65 73  RDERED);.    des
e9a0: 74 2e 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61  t.eDest = SRT_Ta
e9b0: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ble;.  }..  /* M
e9c0: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 53 45 4c  ake sure all SEL
e9d0: 45 43 54 73 20 69 6e 20 74 68 65 20 73 74 61 74  ECTs in the stat
e9e0: 65 6d 65 6e 74 20 68 61 76 65 20 74 68 65 20 73  ement have the s
e9f0: 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  ame number of el
ea00: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69 6e 20 74  ements.  ** in t
ea10: 68 65 69 72 20 72 65 73 75 6c 74 20 73 65 74 73  heir result sets
ea20: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
ea30: 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20 70 50   p->pEList && pP
ea40: 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  rior->pEList );.
ea50: 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73 74 2d    if( p->pEList-
ea60: 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f 72 2d 3e  >nExpr!=pPrior->
ea70: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
ea80: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  .    if( p->selF
ea90: 6c 61 67 73 20 26 20 53 46 5f 56 61 6c 75 65 73  lags & SF_Values
eaa0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
eab0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
eac0: 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53 20 6d 75  , "all VALUES mu
ead0: 73 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  st have the same
eae0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
eaf0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
eb00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
eb10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 53 45  rMsg(pParse, "SE
eb20: 4c 45 43 54 73 20 74 6f 20 74 68 65 20 6c 65 66  LECTs to the lef
eb30: 74 20 61 6e 64 20 72 69 67 68 74 20 6f 66 20 25  t and right of %
eb40: 73 22 0a 20 20 20 20 20 20 20 20 22 20 64 6f 20  s".        " do 
eb50: 6e 6f 74 20 68 61 76 65 20 74 68 65 20 73 61 6d  not have the sam
eb60: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
eb70: 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20 73 65 6c  lt columns", sel
eb80: 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29  ectOpName(p->op)
eb90: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
eba0: 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
ebb0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
ebc0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f 75    }..  /* Compou
ebd0: 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74 20  nd SELECTs that 
ebe0: 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42 59  have an ORDER BY
ebf0: 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e 64   clause are hand
ec00: 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  led separately..
ec10: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4f    */.  if( p->pO
ec20: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72 65  rderBy ){.    re
ec30: 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63 74  turn multiSelect
ec40: 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
ec50: 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  p, pDest);.  }..
ec60: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
ec70: 64 65 20 66 6f 72 20 74 68 65 20 6c 65 66 74 20  de for the left 
ec80: 61 6e 64 20 72 69 67 68 74 20 53 45 4c 45 43 54  and right SELECT
ec90: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
eca0: 2f 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  /.  switch( p->o
ecb0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
ecc0: 5f 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  _ALL: {.      in
ecd0: 74 20 61 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  t addr = 0;.    
ece0: 20 20 69 6e 74 20 6e 4c 69 6d 69 74 3b 0a 20 20    int nLimit;.  
ecf0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
ed00: 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29 3b 0a 20  ior->pLimit );. 
ed10: 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69       pPrior->iLi
ed20: 6d 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b  mit = p->iLimit;
ed30: 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 69  .      pPrior->i
ed40: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66  Offset = p->iOff
ed50: 73 65 74 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  set;.      pPrio
ed60: 72 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70  r->pLimit = p->p
ed70: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72  Limit;.      pPr
ed80: 69 6f 72 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70  ior->pOffset = p
ed90: 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->pOffset;.     
eda0: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
edb0: 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65  er(iSub1, pParse
edc0: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
edd0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
ede0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
edf0: 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
ee00: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  );.      p->pLim
ee10: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  it = 0;.      p-
ee20: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
ee30: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
ee40: 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69        goto multi
ee50: 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20  _select_end;.   
ee60: 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 70 50     }.      p->pP
ee70: 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
ee80: 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 50 72 69  p->iLimit = pPri
ee90: 6f 72 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20  or->iLimit;.    
eea0: 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70    p->iOffset = p
eeb0: 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65 74 3b 0a  Prior->iOffset;.
eec0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 4c 69        if( p->iLi
eed0: 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  mit ){.        a
eee0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
eef0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66  eAddOp1(v, OP_If
ef00: 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d 69 74 29  Zero, p->iLimit)
ef10: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
ef20: 6d 6d 65 6e 74 28 28 76 2c 20 22 4a 75 6d 70 20  mment((v, "Jump 
ef30: 61 68 65 61 64 20 69 66 20 4c 49 4d 49 54 20 72  ahead if LIMIT r
ef40: 65 61 63 68 65 64 22 29 29 3b 0a 20 20 20 20 20  eached"));.     
ef50: 20 7d 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e   }.      explain
ef60: 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32  SetInteger(iSub2
ef70: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
ef80: 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20  electId);.      
ef90: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
efa0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
efb0: 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73 74  est);.      test
efc0: 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54 45  case( rc!=SQLITE
efd0: 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 44 65  _OK );.      pDe
efe0: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
eff0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
f000: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
f010: 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
f020: 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65  += pPrior->nSele
f030: 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28  ctRow;.      if(
f040: 20 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 0a   pPrior->pLimit.
f050: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
f060: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
f070: 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 2c 20 26  Prior->pLimit, &
f080: 6e 4c 69 6d 69 74 29 0a 20 20 20 20 20 20 20 26  nLimit).       &
f090: 26 20 6e 4c 69 6d 69 74 3e 30 20 26 26 20 70 2d  & nLimit>0 && p-
f0a0: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 28 75  >nSelectRow > (u
f0b0: 36 34 29 6e 4c 69 6d 69 74 20 0a 20 20 20 20 20  64)nLimit .     
f0c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   ){.        p->n
f0d0: 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e 4c 69 6d  SelectRow = nLim
f0e0: 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
f0f0: 20 20 69 66 28 20 61 64 64 72 20 29 7b 0a 20 20    if( addr ){.  
f100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f110: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
f120: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
f130: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f140: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50     case TK_EXCEP
f150: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  T:.    case TK_U
f160: 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NION: {.      in
f170: 74 20 75 6e 69 6f 6e 54 61 62 3b 20 20 20 20 2f  t unionTab;    /
f180: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
f190: 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  of the temporary
f1a0: 20 74 61 62 6c 65 20 68 6f 6c 64 69 6e 67 20 72   table holding r
f1b0: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 20 20 75  esult */.      u
f1c0: 38 20 6f 70 20 3d 20 30 3b 20 20 20 20 20 20 20  8 op = 0;       
f1d0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 53 52  /* One of the SR
f1e0: 54 5f 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  T_ operations to
f1f0: 20 61 70 70 6c 79 20 74 6f 20 73 65 6c 66 20 2a   apply to self *
f200: 2f 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f  /.      int prio
f210: 72 4f 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rOp;     /* The 
f220: 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e 20 74  SRT_ operation t
f230: 6f 20 61 70 70 6c 79 20 74 6f 20 70 72 69 6f 72  o apply to prior
f240: 20 73 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20   selects */.    
f250: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20    Expr *pLimit, 
f260: 2a 70 4f 66 66 73 65 74 3b 20 2f 2a 20 53 61 76  *pOffset; /* Sav
f270: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 70 2d 3e  ed values of p->
f280: 6e 4c 69 6d 69 74 20 61 6e 64 20 70 2d 3e 6e 4f  nLimit and p->nO
f290: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 69  ffset */.      i
f2a0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53  nt addr;.      S
f2b0: 65 6c 65 63 74 44 65 73 74 20 75 6e 69 6f 6e 64  electDest uniond
f2c0: 65 73 74 3b 0a 0a 20 20 20 20 20 20 74 65 73 74  est;..      test
f2d0: 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  case( p->op==TK_
f2e0: 45 58 43 45 50 54 20 29 3b 0a 20 20 20 20 20 20  EXCEPT );.      
f2f0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
f300: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
f310: 20 20 20 70 72 69 6f 72 4f 70 20 3d 20 53 52 54     priorOp = SRT
f320: 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66  _Union;.      if
f330: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 70 72  ( dest.eDest==pr
f340: 69 6f 72 4f 70 20 26 26 20 41 4c 57 41 59 53 28  iorOp && ALWAYS(
f350: 21 70 2d 3e 70 4c 69 6d 69 74 20 26 26 21 70 2d  !p->pLimit &&!p-
f360: 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  >pOffset) ){.   
f370: 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e 20 72       /* We can r
f380: 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61 72 79  euse a temporary
f390: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
f3a0: 20 62 79 20 61 20 53 45 4c 45 43 54 20 74 6f 20   by a SELECT to 
f3b0: 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  our.        ** r
f3c0: 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ight..        */
f3d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f3e0: 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 21 3d   p->pRightmost!=
f3f0: 70 20 29 3b 20 20 2f 2a 20 43 61 6e 20 6f 6e 6c  p );  /* Can onl
f400: 79 20 68 61 70 70 65 6e 20 66 6f 72 20 6c 65 66  y happen for lef
f410: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 0a 20  tward elements. 
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 20 20 2a 2a 20 6f 66 20 61 20 33 2d 77 61      ** of a 3-wa
f450: 79 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 70 6f 75  y or more compou
f460: 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  nd */.        as
f470: 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d  sert( p->pLimit=
f480: 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f  =0 );      /* No
f490: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
f4a0: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
f4b0: 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
f4c0: 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20  ( p->pOffset==0 
f4d0: 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c  );     /* Not al
f4e0: 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61 72  lowed on leftwar
f4f0: 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20  d elements */.  
f500: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
f510: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20   dest.iSDParm;. 
f520: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f530: 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e      /* We will n
f540: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 6f 75  eed to create ou
f550: 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72 79 20  r own temporary 
f560: 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68  table to hold th
f570: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  e.        ** int
f580: 65 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74  ermediate result
f590: 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
f5a0: 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d        unionTab =
f5b0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
f5c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f5d0: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20   p->pOrderBy==0 
f5e0: 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20  );.        addr 
f5f0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
f600: 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
f610: 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61  hemeral, unionTa
f620: 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  b, 0);.        a
f630: 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
f640: 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20  enEphm[0] == -1 
f650: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 64  );.        p->ad
f660: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
f670: 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20 70 2d  addr;.        p-
f680: 3e 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c  >pRightmost->sel
f690: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
f6a0: 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
f6b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
f6c0: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
f6d0: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
f6e0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
f6f0: 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
f700: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
f710: 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
f720: 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
f730: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
f740: 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
f750: 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
f760: 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65  ionTab);.      e
f770: 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
f780: 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
f790: 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
f7a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f7b0: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
f7c0: 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64   pPrior, &uniond
f7d0: 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
f7e0: 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
f7f0: 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
f800: 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
f810: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
f820: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
f830: 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
f840: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  /.      if( p->o
f850: 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a  p==TK_EXCEPT ){.
f860: 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
f870: 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d  _Except;.      }
f880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
f890: 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
f8a0: 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
f8b0: 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
f8c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
f8d0: 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
f8e0: 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
f8f0: 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
f900: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
f910: 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
f920: 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
f930: 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
f940: 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65       uniondest.e
f950: 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20  Dest = op;.     
f960: 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
f970: 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
f980: 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
f990: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
f9a0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
f9b0: 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74  e, p, &uniondest
f9c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
f9d0: 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
f9e0: 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65   );.      /* Que
f9f0: 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
fa00: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
fa10: 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
fa20: 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
fa30: 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
fa40: 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
fa50: 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
fa60: 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
fa70: 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
fa80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
fa90: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
faa0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65  erBy);.      pDe
fab0: 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
fac0: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
fad0: 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
fae0: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
faf0: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
fb00: 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70  op==TK_UNION ) p
fb10: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
fb20: 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
fb30: 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
fb40: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
fb50: 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
fb60: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
fb70: 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
fb80: 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
fb90: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
fba0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
fbb0: 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  iOffset = 0;..  
fbc0: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
fbd0: 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
fbe0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
fbf0: 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
fc00: 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
fc10: 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
fc20: 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
fc30: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
fc40: 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69  unionTab==dest.i
fc50: 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65  SDParm || dest.e
fc60: 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b  Dest!=priorOp );
fc70: 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
fc80: 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
fc90: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
fca0: 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
fcb0: 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
fcc0: 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
fcd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
fce0: 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  st.eDest==SRT_Ou
fcf0: 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
fd00: 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
fd10: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
fd20: 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
fd30: 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
fd40: 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
fd50: 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
fd60: 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
fd70: 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
fd80: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
fd90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
fda0: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
fdb0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
fdc0: 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
fdd0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
fde0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
fdf0: 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
fe00: 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
fe10: 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
fe20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
fe30: 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
fe40: 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
fe50: 61 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 53 74  ak);.        iSt
fe60: 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
fe70: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
fe80: 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74 49  .        selectI
fe90: 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c  nnerLoop(pParse,
fea0: 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 75   p, p->pEList, u
feb0: 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e 70 45 4c 69  nionTab, p->pELi
fec0: 73 74 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20  st->nExpr,.     
fed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fee0: 20 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20     0, 0, &dest, 
fef0: 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a  iCont, iBreak);.
ff00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ff10: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
ff20: 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20  v, iCont);.     
ff30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ff40: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
ff50: 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72   unionTab, iStar
ff60: 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
ff70: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ff80: 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
ff90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ffa0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ffb0: 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
ffc0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ffd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ffe0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
fff0: 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
10000 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
10010 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
10020 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
10030 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
10040 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
10050 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
10060 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
10070 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
10080 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
10090 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
100a0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
100b0 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
100c0 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
100d0 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
100e0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
100f0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
10100 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
10110 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
10120 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
10130 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
10140 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
10150 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
10160 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
10170 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
10180 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
10190 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
101a0 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
101b0 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
101c0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
101d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
101e0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
101f0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
10200 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
10210 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
10220 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
10230 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
10240 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 69 67  r;.      p->pRig
10250 68 74 6d 6f 73 74 2d 3e 73 65 6c 46 6c 61 67 73  htmost->selFlags
10260 20 7c 3d 20 53 46 5f 55 73 65 73 45 70 68 65 6d   |= SF_UsesEphem
10270 65 72 61 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  eral;.      asse
10280 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b  rt( p->pEList );
10290 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
102a0 74 68 65 20 53 45 4c 45 43 54 73 20 74 6f 20 6f  the SELECTs to o
102b0 75 72 20 6c 65 66 74 20 69 6e 74 6f 20 74 65 6d  ur left into tem
102c0 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74 61  porary table "ta
102d0 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  b1"..      */.  
102e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
102f0 74 44 65 73 74 49 6e 69 74 28 26 69 6e 74 65 72  tDestInit(&inter
10300 73 65 63 74 64 65 73 74 2c 20 53 52 54 5f 55 6e  sectdest, SRT_Un
10310 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20 20 20 20  ion, tab1);.    
10320 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
10330 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72 73  ger(iSub1, pPars
10340 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64  e->iNextSelectId
10350 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
10360 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
10370 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 69 6e 74  se, pPrior, &int
10380 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
10390 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
103a0 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f       goto multi_
103b0 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
103c0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
103d0 64 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 53  de the current S
103e0 45 4c 45 43 54 20 69 6e 74 6f 20 74 65 6d 70 6f  ELECT into tempo
103f0 72 61 72 79 20 74 61 62 6c 65 20 22 74 61 62 32  rary table "tab2
10400 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ".      */.     
10410 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
10420 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10430 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74  OpenEphemeral, t
10440 61 62 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 61  ab2, 0);.      a
10450 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70  ssert( p->addrOp
10460 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20 2d 31 20  enEphm[1] == -1 
10470 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72  );.      p->addr
10480 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 20 61 64  OpenEphm[1] = ad
10490 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72  dr;.      p->pPr
104a0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ior = 0;.      p
104b0 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69  Limit = p->pLimi
104c0 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d  t;.      p->pLim
104d0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f  it = 0;.      pO
104e0 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73  ffset = p->pOffs
104f0 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66  et;.      p->pOf
10500 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
10510 69 6e 74 65 72 73 65 63 74 64 65 73 74 2e 69 53  intersectdest.iS
10520 44 50 61 72 6d 20 3d 20 74 61 62 32 3b 0a 20 20  DParm = tab2;.  
10530 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
10540 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
10550 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
10560 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
10570 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
10580 61 72 73 65 2c 20 70 2c 20 26 69 6e 74 65 72 73  arse, p, &inters
10590 65 63 74 64 65 73 74 29 3b 0a 20 20 20 20 20 20  ectdest);.      
105a0 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
105b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
105c0 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
105d0 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
105e0 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
105f0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
10600 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f 72 2d 3e  lectRow>pPrior->
10610 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
10620 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
10630 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
10640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
10650 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
10660 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70  pLimit);.      p
10670 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69  ->pLimit = pLimi
10680 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  t;.      p->pOff
10690 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 0a  set = pOffset;..
106a0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
106b0 65 20 63 6f 64 65 20 74 6f 20 74 61 6b 65 20 74  e code to take t
106c0 68 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 20  he intersection 
106d0 6f 66 20 74 68 65 20 74 77 6f 20 74 65 6d 70 6f  of the two tempo
106e0 72 61 72 79 0a 20 20 20 20 20 20 2a 2a 20 74 61  rary.      ** ta
106f0 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bles..      */. 
10700 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
10710 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20  pEList );.      
10720 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
10730 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20  SRT_Output ){.  
10740 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
10750 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
10760 20 20 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d    while( pFirst-
10770 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72 73 74  >pPrior ) pFirst
10780 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f   = pFirst->pPrio
10790 72 3b 0a 20 20 20 20 20 20 20 20 67 65 6e 65 72  r;.        gener
107a0 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
107b0 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
107c0 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
107d0 20 7d 0a 20 20 20 20 20 20 69 42 72 65 61 6b 20   }.      iBreak 
107e0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
107f0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
10800 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33   iCont = sqlite3
10810 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
10820 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75 74 65 4c  ;.      computeL
10830 69 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50  imitRegisters(pP
10840 61 72 73 65 2c 20 70 2c 20 69 42 72 65 61 6b 29  arse, p, iBreak)
10850 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
10860 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10870 52 65 77 69 6e 64 2c 20 74 61 62 31 2c 20 69 42  Rewind, tab1, iB
10880 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 72 31 20  reak);.      r1 
10890 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
108a0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
108b0 20 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69     iStart = sqli
108c0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
108d0 20 4f 50 5f 52 6f 77 4b 65 79 2c 20 74 61 62 31   OP_RowKey, tab1
108e0 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r1);.      sql
108f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
10900 74 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64  t(v, OP_NotFound
10910 2c 20 74 61 62 32 2c 20 69 43 6f 6e 74 2c 20 72  , tab2, iCont, r
10920 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
10930 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
10940 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
10950 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65        selectInne
10960 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c  rLoop(pParse, p,
10970 20 70 2d 3e 70 45 4c 69 73 74 2c 20 74 61 62 31   p->pEList, tab1
10980 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
10990 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
109a0 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
109b0 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42  &dest, iCont, iB
109c0 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  reak);.      sql
109d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
109e0 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a  abel(v, iCont);.
109f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10a00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
10a10 78 74 2c 20 74 61 62 31 2c 20 69 53 74 61 72 74  xt, tab1, iStart
10a20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10a30 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
10a40 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  (v, iBreak);.   
10a50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10a60 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp2(v, OP_Close
10a70 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
10a80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10a90 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
10aa0 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
10ab0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
10ac0 7d 0a 0a 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70  }..  explainComp
10ad0 6f 73 69 74 65 28 70 50 61 72 73 65 2c 20 70 2d  osite(pParse, p-
10ae0 3e 6f 70 2c 20 69 53 75 62 31 2c 20 69 53 75 62  >op, iSub1, iSub
10af0 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  2, p->op!=TK_ALL
10b00 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  );..  /* Compute
10b10 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
10b20 6e 63 65 73 20 75 73 65 64 20 62 79 20 0a 20 20  nces used by .  
10b30 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ** temporary tab
10b40 6c 65 73 20 6e 65 65 64 65 64 20 74 6f 20 69 6d  les needed to im
10b50 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 6d 70  plement the comp
10b60 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
10b70 2a 20 41 74 74 61 63 68 20 74 68 65 20 4b 65 79  * Attach the Key
10b80 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
10b90 6f 20 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20  o all temporary 
10ba0 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a  tables..  **.  *
10bb0 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 69  * This section i
10bc0 73 20 72 75 6e 20 62 79 20 74 68 65 20 72 69 67  s run by the rig
10bd0 68 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 73  ht-most SELECT s
10be0 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 2e 0a 20  tatement only.. 
10bf0 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   ** SELECT state
10c00 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 6c 65 66  ments to the lef
10c10 74 20 61 6c 77 61 79 73 20 73 6b 69 70 20 74 68  t always skip th
10c20 69 73 20 70 61 72 74 2e 20 20 54 68 65 20 72 69  is part.  The ri
10c30 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 53 45  ght-most.  ** SE
10c40 4c 45 43 54 20 6d 69 67 68 74 20 61 6c 73 6f 20  LECT might also 
10c50 73 6b 69 70 20 74 68 69 73 20 70 61 72 74 20 69  skip this part i
10c60 66 20 69 74 20 68 61 73 20 6e 6f 20 4f 52 44 45  f it has no ORDE
10c70 52 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 0a  R BY clause and.
10c80 20 20 2a 2a 20 6e 6f 20 74 65 6d 70 20 74 61 62    ** no temp tab
10c90 6c 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  les are required
10ca0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
10cb0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
10cc0 65 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a 20  esEphemeral ){. 
10cd0 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
10d00 20 2a 2f 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   */.    KeyInfo 
10d10 2a 70 4b 65 79 49 6e 66 6f 3b 20 20 20 20 20 20  *pKeyInfo;      
10d20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
10d30 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
10d40 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
10d50 2f 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c  /.    Select *pL
10d60 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  oop;            
10d70 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
10d80 6e 67 20 74 68 72 6f 75 67 68 20 53 45 4c 45 43  ng through SELEC
10d90 54 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  T statements */.
10da0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 2a 61 70      CollSeq **ap
10db0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
10dc0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
10dd0 20 74 68 72 6f 75 67 68 20 70 4b 65 79 49 6e 66   through pKeyInf
10de0 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a 2f 0a 20 20  o->aColl[] */.  
10df0 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20    int nCol;     
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
10e20 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74 20 73  umns in result s
10e30 65 74 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  et */..    asser
10e40 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  t( p->pRightmost
10e50 3d 3d 70 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20  ==p );.    nCol 
10e60 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
10e70 70 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f  pr;.    pKeyInfo
10e80 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
10e90 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c  oAlloc(db, nCol,
10ea0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b   1);.    if( !pK
10eb0 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  eyInfo ){.      
10ec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
10ed0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  M;.      goto mu
10ee0 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
10ef0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
10f00 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e  0, apColl=pKeyIn
10f10 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f  fo->aColl; i<nCo
10f20 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b  l; i++, apColl++
10f30 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c  ){.      *apColl
10f40 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f   = multiSelectCo
10f50 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c  llSeq(pParse, p,
10f60 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30   i);.      if( 0
10f70 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  ==*apColl ){.   
10f80 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64       *apColl = d
10f90 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
10fa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10fb0 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c   for(pLoop=p; pL
10fc0 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70  oop; pLoop=pLoop
10fd0 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
10fe0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
10ff0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
11000 20 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61   addr = pLoop->a
11010 64 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a  ddrOpenEphm[i];.
11020 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72          if( addr
11030 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
11040 2f 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75  /* If [0] is unu
11050 73 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20  sed then [1] is 
11060 61 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f  also unused.  So
11070 20 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20   we can.        
11080 20 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65    ** always safe
11090 6c 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e  ly abort as soon
110a0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e   as the first un
110b0 75 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75  used slot is fou
110c0 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  nd */.          
110d0 61 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61  assert( pLoop->a
110e0 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30  ddrOpenEphm[1]<0
110f0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   );.          br
11100 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11120 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
11130 64 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20  dr, nCol);.     
11140 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11150 61 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20  angeP4(v, addr, 
11160 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
11170 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66  yInfoRef(pKeyInf
11180 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o),.            
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
111b0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72       pLoop->addr
111c0 4f 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31  OpenEphm[i] = -1
111d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
111e0 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
111f0 66 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f  foUnref(pKeyInfo
11200 29 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65  );.  }..multi_se
11210 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73  lect_end:.  pDes
11220 74 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  t->iSdst = dest.
11230 69 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  iSdst;.  pDest->
11240 6e 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64  nSdst = dest.nSd
11250 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  st;.  sqlite3Sel
11260 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44  ectDelete(db, pD
11270 65 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e  elete);.  return
11280 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
11290 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
112a0 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a  POUND_SELECT */.
112b0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f  ./*.** Code an o
112c0 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65  utput subroutine
112d0 20 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65   for a coroutine
112e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
112f0 6f 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73  of a.** SELECT s
11300 74 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  tatment..**.** T
11310 68 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75  he data to be ou
11320 74 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65  tput is containe
11330 64 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e  d in pIn->iSdst.
11340 20 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70    There are.** p
11350 49 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e  In->nSdst column
11360 73 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20  s to be output. 
11370 20 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20   pDest is where 
11380 74 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c  the output shoul
11390 64 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a  d.** be sent..**
113a0 0a 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73  .** regReturn is
113b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
113c0 68 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64  he register hold
113d0 69 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69  ing the subrouti
113e0 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64  ne.** return add
113f0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72  ress..**.** If r
11400 65 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74  egPrev>0 then it
11410 20 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65   is the first re
11420 67 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74  gister in a vect
11430 6f 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72  or that.** recor
11440 64 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ds the previous 
11450 6f 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67  output.  mem[reg
11460 50 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20  Prev] is a flag 
11470 74 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a  that is false.**
11480 20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65   if there has be
11490 65 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f  en no previous o
114a0 75 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72  utput.  If regPr
114b0 65 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69  ev>0 then code i
114c0 73 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74  s.** generated t
114d0 6f 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69  o suppress dupli
114e0 63 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f  cates.  pKeyInfo
114f0 20 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d   is used for com
11500 70 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a  paring.** keys..
11510 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d  **.** If the LIM
11520 49 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69  IT found in p->i
11530 4c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64  Limit is reached
11540 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
11550 6c 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e  ly to.** iBreak.
11560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
11570 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62  enerateOutputSub
11580 72 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65  routine(.  Parse
11590 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
115a0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
115b0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
115c0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
115d0 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
115e0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
115f0 53 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c  SelectDest *pIn,
11600 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75          /* Corou
11610 74 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64  tine supplying d
11620 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ata */.  SelectD
11630 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20  est *pDest,     
11640 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e   /* Where to sen
11650 64 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  d the data */.  
11660 69 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20  int regReturn,  
11670 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
11680 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
11690 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
116a0 72 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20  regPrev,        
116b0 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
116c0 72 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e  result register.
116d0 20 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20    No uniqueness 
116e0 69 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  if 0 */.  KeyInf
116f0 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
11700 20 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69    /* For compari
11710 6e 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73  ng with previous
11720 20 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20   entry */.  int 
11730 69 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20  iBreak          
11740 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
11750 20 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c   if we hit the L
11760 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62  IMIT */.){.  Vdb
11770 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
11780 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e  Vdbe;.  int iCon
11790 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64  tinue;.  int add
117a0 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c  r;..  addr = sql
117b0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
117c0 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69  ddr(v);.  iConti
117d0 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nue = sqlite3Vdb
117e0 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
117f0 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75    /* Suppress du
11800 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49  plicates for UNI
11810 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20  ON, EXCEPT, and 
11820 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a  INTERSECT .  */.
11830 20 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b    if( regPrev ){
11840 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b  .    int j1, j2;
11850 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
11860 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
11870 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76  P_IfNot, regPrev
11880 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  );.    j2 = sqli
11890 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
118a0 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
118b0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
118c0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
118f0 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
11900 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
11910 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
11920 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11930 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
11940 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65   j2+2, iContinue
11950 2c 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c  , j2+2);.    sql
11960 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
11970 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c  (v, j1);.    sql
11980 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11990 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e  , OP_Copy, pIn->
119a0 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31  iSdst, regPrev+1
119b0 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b  , pIn->nSdst-1);
119c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
119d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
119e0 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76  eger, 1, regPrev
119f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
11a00 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
11a10 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
11a20 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73  ;..  /* Suppress
11a30 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45   the first OFFSE
11a40 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65  T entries if the
11a50 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20  re is an OFFSET 
11a60 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f  clause.  */.  co
11a70 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
11a80 43 6f 6e 74 69 6e 75 65 29 3b 0a 0a 20 20 73 77  Continue);..  sw
11a90 69 74 63 68 28 20 70 44 65 73 74 2d 3e 65 44 65  itch( pDest->eDe
11aa0 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 53 74 6f  st ){.    /* Sto
11ab0 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  re the result as
11ac0 20 64 61 74 61 20 75 73 69 6e 67 20 61 20 75 6e   data using a un
11ad0 69 71 75 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f  ique key..    */
11ae0 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 54 61  .    case SRT_Ta
11af0 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52  ble:.    case SR
11b00 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20  T_EphemTab: {.  
11b10 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c      int r1 = sql
11b20 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
11b30 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 6e  Parse);.      in
11b40 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65  t r2 = sqlite3Ge
11b50 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
11b60 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
11b70 28 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  ( pDest->eDest==
11b80 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20  SRT_Table );.   
11b90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
11ba0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 45  st->eDest==SRT_E
11bb0 70 68 65 6d 54 61 62 20 29 3b 0a 20 20 20 20 20  phemTab );.     
11bc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11bd0 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
11be0 6f 72 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  ord, pIn->iSdst,
11bf0 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 20 72 31 29   pIn->nSdst, r1)
11c00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11c10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11c20 4e 65 77 52 6f 77 69 64 2c 20 70 44 65 73 74 2d  NewRowid, pDest-
11c30 3e 69 53 44 50 61 72 6d 2c 20 72 32 29 3b 0a 20  >iSDParm, r2);. 
11c40 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11c50 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73  AddOp3(v, OP_Ins
11c60 65 72 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  ert, pDest->iSDP
11c70 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b 0a 20 20  arm, r1, r2);.  
11c80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
11c90 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
11ca0 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20  G_APPEND);.     
11cb0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
11cc0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
11cd0 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
11ce0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
11cf0 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
11d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
11d10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11d20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
11d30 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63    /* If we are c
11d40 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f  reating a set fo
11d50 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53  r an "expr IN (S
11d60 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73  ELECT ...)" cons
11d70 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68  truct,.    ** th
11d80 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20  en there should 
11d90 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d  be a single item
11da0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
11db0 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a  Write this.    *
11dc0 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20  * item into the 
11dd0 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62  set table with b
11de0 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a  ogus data..    *
11df0 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53  /.    case SRT_S
11e00 65 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  et: {.      int 
11e10 72 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r1;.      assert
11e20 28 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20  ( pIn->nSdst==1 
11e30 29 3b 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e  );.      pDest->
11e40 61 66 66 53 64 73 74 20 3d 20 0a 20 20 20 20 20  affSdst = .     
11e50 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61      sqlite3Compa
11e60 72 65 41 66 66 69 6e 69 74 79 28 70 2d 3e 70 45  reAffinity(p->pE
11e70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
11e80 2c 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74  , pDest->affSdst
11e90 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
11ea0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
11eb0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
11ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
11ed0 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
11ee0 64 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31  d, pIn->iSdst, 1
11ef0 2c 20 72 31 2c 20 26 70 44 65 73 74 2d 3e 61 66  , r1, &pDest->af
11f00 66 53 64 73 74 2c 31 29 3b 0a 20 20 20 20 20 20  fSdst,1);.      
11f10 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11f20 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
11f30 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
11f40 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 1);.      sql
11f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11f60 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20  , OP_IdxInsert, 
11f70 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
11f80 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  r1);.      sqlit
11f90 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
11fa0 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
11fb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11fc0 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 65 76 65  ..#if 0  /* Neve
11fd0 72 20 6f 63 63 75 72 73 20 6f 6e 20 61 6e 20 4f  r occurs on an O
11fe0 52 44 45 52 20 42 59 20 71 75 65 72 79 20 2a 2f  RDER BY query */
11ff0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
12000 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
12010 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
12020 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
12030 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
12040 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
12050 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
12060 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12070 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
12080 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
12090 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
120a0 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
120b0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
120c0 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
120d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
120e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
120f0 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
12100 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
12110 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
12120 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
12130 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
12140 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
12150 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
12160 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
12170 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
12180 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
12190 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
121a0 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
121b0 73 65 72 74 28 20 70 49 6e 2d 3e 6e 53 64 73 74  sert( pIn->nSdst
121c0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==1 );.      sql
121d0 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65  ite3ExprCodeMove
121e0 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53  (pParse, pIn->iS
121f0 64 73 74 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  dst, pDest->iSDP
12200 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 2f  arm, 1);.      /
12210 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
12220 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75 74  se will jump out
12230 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72   of the loop for
12240 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
12250 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
12260 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
12270 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
12280 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
12290 72 65 73 75 6c 74 73 20 61 72 65 20 73 74 6f 72  results are stor
122a0 65 64 20 69 6e 20 61 20 73 65 71 75 65 6e 63 65  ed in a sequence
122b0 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
122c0 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
122d0 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2e 20 20   pDest->iSdst.  
122e0 54 68 65 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74  Then the co-rout
122f0 69 6e 65 20 79 69 65 6c 64 73 2e 0a 20 20 20 20  ine yields..    
12300 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
12310 43 6f 72 6f 75 74 69 6e 65 3a 20 7b 0a 20 20 20  Coroutine: {.   
12320 20 20 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53     if( pDest->iS
12330 64 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dst==0 ){.      
12340 20 20 70 44 65 73 74 2d 3e 69 53 64 73 74 20 3d    pDest->iSdst =
12350 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
12360 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  ange(pParse, pIn
12370 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
12380 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
12390 20 70 49 6e 2d 3e 6e 53 64 73 74 3b 0a 20 20 20   pIn->nSdst;.   
123a0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
123b0 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
123c0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73  Parse, pIn->iSds
123d0 74 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c  t, pDest->iSdst,
123e0 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 29 3b 0a   pDest->nSdst);.
123f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12400 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
12410 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
12420 61 72 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  arm);.      brea
12430 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
12440 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
12450 61 62 6f 76 65 2c 20 74 68 65 6e 20 74 68 65 20  above, then the 
12460 72 65 73 75 6c 74 20 64 65 73 74 69 6e 61 74 69  result destinati
12470 6f 6e 20 6d 75 73 74 20 62 65 0a 20 20 20 20 2a  on must be.    *
12480 2a 20 53 52 54 5f 4f 75 74 70 75 74 2e 20 20 54  * SRT_Output.  T
12490 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
124a0 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
124b0 20 61 6e 79 20 6f 74 68 65 72 0a 20 20 20 20 2a   any other.    *
124c0 2a 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6f 74  * destination ot
124d0 68 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  her than the one
124e0 73 20 68 61 6e 64 6c 65 64 20 61 62 6f 76 65 20  s handled above 
124f0 6f 72 20 53 52 54 5f 4f 75 74 70 75 74 2e 0a 20  or SRT_Output.. 
12500 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 72     **.    ** For
12510 20 53 52 54 5f 4f 75 74 70 75 74 2c 20 72 65 73   SRT_Output, res
12520 75 6c 74 73 20 61 72 65 20 73 74 6f 72 65 64 20  ults are stored 
12530 69 6e 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66  in a sequence of
12540 20 72 65 67 69 73 74 65 72 73 2e 20 20 0a 20 20   registers.  .  
12550 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 4f 50    ** Then the OP
12560 5f 52 65 73 75 6c 74 52 6f 77 20 6f 70 63 6f 64  _ResultRow opcod
12570 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 61 75  e is used to cau
12580 73 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  se sqlite3_step(
12590 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 74 75  ) to.    ** retu
125a0 72 6e 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20  rn the next row 
125b0 6f 66 20 72 65 73 75 6c 74 2e 0a 20 20 20 20 2a  of result..    *
125c0 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
125d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
125e0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
125f0 5f 4f 75 74 70 75 74 20 29 3b 0a 20 20 20 20 20  _Output );.     
12600 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12610 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52  p2(v, OP_ResultR
12620 6f 77 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  ow, pIn->iSdst, 
12630 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
12640 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
12650 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
12660 65 28 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 69  e(pParse, pIn->i
12670 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  Sdst, pIn->nSdst
12680 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12690 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
126a0 4a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  Jump to the end 
126b0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 66 20 74  of the loop if t
126c0 68 65 20 4c 49 4d 49 54 20 69 73 20 72 65 61 63  he LIMIT is reac
126d0 68 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hed..  */.  if( 
126e0 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
126f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12700 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p3(v, OP_IfZero,
12710 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
12720 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 0a 20 20  ak, -1);.  }..  
12730 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
12740 73 75 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72  subroutine retur
12750 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
12760 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
12770 28 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  (v, iContinue);.
12780 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12790 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
127a0 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20  , regReturn);.. 
127b0 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
127c0 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 69  ./*.** Alternati
127d0 76 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65  ve compound sele
127e0 63 74 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  ct code generato
127f0 72 20 66 6f 72 20 63 61 73 65 73 20 77 68 65 6e  r for cases when
12800 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 6e 20   there.** is an 
12810 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
12820 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d 65  .**.** We assume
12830 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
12840 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 3a 0a  following form:.
12850 2a 2a 0a 2a 2a 20 20 20 20 20 20 3c 73 65 6c 65  **.**      <sele
12860 63 74 41 3e 20 20 3c 6f 70 65 72 61 74 6f 72 3e  ctA>  <operator>
12870 20 20 3c 73 65 6c 65 63 74 42 3e 20 20 4f 52 44    <selectB>  ORD
12880 45 52 20 42 59 20 3c 6f 72 64 65 72 62 79 6c 69  ER BY <orderbyli
12890 73 74 3e 0a 2a 2a 0a 2a 2a 20 3c 6f 70 65 72 61  st>.**.** <opera
128a0 74 6f 72 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55  tor> is one of U
128b0 4e 49 4f 4e 20 41 4c 4c 2c 20 55 4e 49 4f 4e 2c  NION ALL, UNION,
128c0 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
128d0 52 53 45 43 54 2e 20 20 54 68 65 20 69 64 65 61  RSECT.  The idea
128e0 0a 2a 2a 20 69 73 20 74 6f 20 63 6f 64 65 20 62  .** is to code b
128f0 6f 74 68 20 3c 73 65 6c 65 63 74 41 3e 20 61 6e  oth <selectA> an
12900 64 20 3c 73 65 6c 65 63 74 42 3e 20 77 69 74 68  d <selectB> with
12910 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
12920 61 75 73 65 20 61 73 0a 2a 2a 20 63 6f 2d 72 6f  ause as.** co-ro
12930 75 74 69 6e 65 73 2e 20 20 54 68 65 6e 20 72 75  utines.  Then ru
12940 6e 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65  n the co-routine
12950 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 61 6e  s in parallel an
12960 64 20 6d 65 72 67 65 20 74 68 65 20 72 65 73 75  d merge the resu
12970 6c 74 73 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  lts.** into the 
12980 6f 75 74 70 75 74 2e 20 20 49 6e 20 61 64 64 69  output.  In addi
12990 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 77 6f 20  tion to the two 
129a0 63 6f 72 6f 75 74 69 6e 65 73 20 28 63 61 6c 6c  coroutines (call
129b0 65 64 20 73 65 6c 65 63 74 41 20 61 6e 64 0a 2a  ed selectA and.*
129c0 2a 20 73 65 6c 65 63 74 42 29 20 74 68 65 72 65  * selectB) there
129d0 20 61 72 65 20 37 20 73 75 62 72 6f 75 74 69 6e   are 7 subroutin
129e0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74  es:.**.**    out
129f0 41 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20 6f  A:    Move the o
12a00 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65 6c  utput of the sel
12a10 65 63 74 41 20 63 6f 72 6f 75 74 69 6e 65 20 69  ectA coroutine i
12a20 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  nto the output.*
12a30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  *             of
12a40 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71 75   the compound qu
12a50 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 75  ery..**.**    ou
12a60 74 42 3a 20 20 20 20 4d 6f 76 65 20 74 68 65 20  tB:    Move the 
12a70 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 73 65  output of the se
12a80 6c 65 63 74 42 20 63 6f 72 6f 75 74 69 6e 65 20  lectB coroutine 
12a90 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  into the output.
12aa0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  **             o
12ab0 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  f the compound q
12ac0 75 65 72 79 2e 20 20 28 4f 6e 6c 79 20 67 65 6e  uery.  (Only gen
12ad0 65 72 61 74 65 64 20 66 6f 72 20 55 4e 49 4f 4e  erated for UNION
12ae0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
12af0 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20      UNION ALL.  
12b00 45 58 43 45 50 54 20 61 6e 64 20 49 4e 53 45 52  EXCEPT and INSER
12b10 54 53 45 43 54 20 6e 65 76 65 72 20 6f 75 74 70  TSECT never outp
12b20 75 74 20 61 20 72 6f 77 20 74 68 61 74 0a 2a 2a  ut a row that.**
12b30 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
12b40 65 61 72 73 20 6f 6e 6c 79 20 69 6e 20 42 2e 29  ears only in B.)
12b50 0a 2a 2a 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20  .**.**    AltB: 
12b60 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
12b70 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
12b80 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
12b90 73 20 61 6e 64 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a  s and A<B..**.**
12ba0 20 20 20 20 41 65 71 42 3a 20 20 20 20 43 61 6c      AeqB:    Cal
12bb0 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 69  led when there i
12bc0 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68  s data from both
12bd0 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20   coroutines and 
12be0 41 3d 3d 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41  A==B..**.**    A
12bf0 67 74 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  gtB:    Called w
12c00 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
12c10 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
12c20 75 74 69 6e 65 73 20 61 6e 64 20 41 3e 42 2e 0a  utines and A>B..
12c30 2a 2a 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 20  **.**    EofA:  
12c40 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61    Called when da
12c50 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
12c60 66 72 6f 6d 20 73 65 6c 65 63 74 41 2e 0a 2a 2a  from selectA..**
12c70 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 20 20 20  .**    EofB:    
12c80 43 61 6c 6c 65 64 20 77 68 65 6e 20 64 61 74 61  Called when data
12c90 20 69 73 20 65 78 68 61 75 73 74 65 64 20 66 72   is exhausted fr
12ca0 6f 6d 20 73 65 6c 65 63 74 42 2e 0a 2a 2a 0a 2a  om selectB..**.*
12cb0 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
12cc0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 61 74 74  tion of the latt
12cd0 65 72 20 66 69 76 65 20 73 75 62 72 6f 75 74 69  er five subrouti
12ce0 6e 65 73 20 64 65 70 65 6e 64 20 6f 6e 20 77 68  nes depend on wh
12cf0 69 63 68 20 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f  ich .** <operato
12d00 72 3e 20 69 73 20 75 73 65 64 3a 0a 2a 2a 0a 2a  r> is used:.**.*
12d10 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  *.**            
12d20 20 55 4e 49 4f 4e 20 41 4c 4c 20 20 20 20 20 20   UNION ALL      
12d30 20 20 20 55 4e 49 4f 4e 20 20 20 20 20 20 20 20     UNION        
12d40 20 20 20 20 45 58 43 45 50 54 20 20 20 20 20 20      EXCEPT      
12d50 20 20 20 20 49 4e 54 45 52 53 45 43 54 0a 2a 2a      INTERSECT.**
12d60 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
12d70 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d  -------  -------
12d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
12d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d  ----------  ----
12da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
12db0 20 20 20 41 6c 74 42 3a 20 20 20 6f 75 74 41 2c     AltB:   outA,
12dc0 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74 41   nextA      outA
12dd0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75  , nextA       ou
12de0 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20  tA, nextA       
12df0 20 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20    nextA.**.**   
12e00 41 65 71 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65  AeqB:   outA, ne
12e10 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78 74  xtA         next
12e20 41 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  A             ne
12e30 78 74 41 20 20 20 20 20 20 20 20 20 6f 75 74 41  xtA         outA
12e40 2c 20 6e 65 78 74 41 0a 2a 2a 0a 2a 2a 20 20 20  , nextA.**.**   
12e50 41 67 74 42 3a 20 20 20 6f 75 74 42 2c 20 6e 65  AgtB:   outB, ne
12e60 78 74 42 20 20 20 20 20 20 6f 75 74 42 2c 20 6e  xtB      outB, n
12e70 65 78 74 42 20 20 20 20 20 20 20 20 20 20 6e 65  extB          ne
12e80 78 74 42 20 20 20 20 20 20 20 20 20 20 20 20 6e  xtB            n
12e90 65 78 74 42 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66  extB.**.**   Eof
12ea0 41 3a 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42  A:   outB, nextB
12eb0 20 20 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74        outB, next
12ec0 42 20 20 20 20 20 20 20 20 20 20 68 61 6c 74 20  B          halt 
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 68 61 6c 74              halt
12ee0 0a 2a 2a 0a 2a 2a 20 20 20 45 6f 66 42 3a 20 20  .**.**   EofB:  
12ef0 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20   outA, nextA    
12f00 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20    outA, nextA   
12f10 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
12f20 20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a          halt.**.
12f30 2a 2a 20 49 6e 20 74 68 65 20 41 6c 74 42 2c 20  ** In the AltB, 
12f40 41 65 71 42 2c 20 61 6e 64 20 41 67 74 42 20 73  AeqB, and AgtB s
12f50 75 62 72 6f 75 74 69 6e 65 73 2c 20 61 6e 20 45  ubroutines, an E
12f60 4f 46 20 6f 6e 20 41 20 66 6f 6c 6c 6f 77 69 6e  OF on A followin
12f70 67 20 6e 65 78 74 41 0a 2a 2a 20 63 61 75 73 65  g nextA.** cause
12f80 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a  s an immediate j
12f90 75 6d 70 20 74 6f 20 45 6f 66 41 20 61 6e 64 20  ump to EofA and 
12fa0 61 6e 20 45 4f 46 20 6f 6e 20 42 20 66 6f 6c 6c  an EOF on B foll
12fb0 6f 77 69 6e 67 20 6e 65 78 74 42 20 63 61 75 73  owing nextB caus
12fc0 65 73 0a 2a 2a 20 61 6e 20 69 6d 6d 65 64 69 61  es.** an immedia
12fd0 74 65 20 6a 75 6d 70 20 74 6f 20 45 6f 66 42 2e  te jump to EofB.
12fe0 20 20 57 69 74 68 69 6e 20 45 6f 66 41 20 61 6e    Within EofA an
12ff0 64 20 45 6f 66 42 2c 20 61 6e 64 20 45 4f 46 20  d EofB, and EOF 
13000 6f 6e 20 65 6e 74 72 79 20 6f 72 0a 2a 2a 20 66  on entry or.** f
13010 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 58 20 63  ollowing nextX c
13020 61 75 73 65 73 20 61 20 6a 75 6d 70 20 74 6f 20  auses a jump to 
13030 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73  the end of the s
13040 65 6c 65 63 74 20 70 72 6f 63 65 73 73 69 6e 67  elect processing
13050 2e 0a 2a 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ..**.** Duplicat
13060 65 20 72 65 6d 6f 76 61 6c 20 69 6e 20 74 68 65  e removal in the
13070 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20   UNION, EXCEPT, 
13080 61 6e 64 20 49 4e 54 45 52 53 45 43 54 20 63 61  and INTERSECT ca
13090 73 65 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 2a  ses is handled.*
130a0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 6f 75 74  * within the out
130b0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  put subroutine. 
130c0 20 54 68 65 20 72 65 67 50 72 65 76 20 72 65 67   The regPrev reg
130d0 69 73 74 65 72 20 73 65 74 20 68 6f 6c 64 73 20  ister set holds 
130e0 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a  the previously.*
130f0 2a 20 6f 75 74 70 75 74 20 76 61 6c 75 65 2e 20  * output value. 
13100 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73   A comparison is
13110 20 6d 61 64 65 20 61 67 61 69 6e 73 74 20 74 68   made against th
13120 69 73 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  is value and the
13130 20 6f 75 74 70 75 74 0a 2a 2a 20 69 73 20 73 6b   output.** is sk
13140 69 70 70 65 64 20 69 66 20 74 68 65 20 6e 65 78  ipped if the nex
13150 74 20 72 65 73 75 6c 74 73 20 77 6f 75 6c 64 20  t results would 
13160 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
13170 68 65 20 70 72 65 76 69 6f 75 73 2e 0a 2a 2a 0a  he previous..**.
13180 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
13190 61 74 69 6f 6e 20 70 6c 61 6e 20 69 73 20 74 6f  ation plan is to
131a0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 74   implement the t
131b0 77 6f 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e  wo coroutines an
131c0 64 20 73 65 76 65 6e 0a 2a 2a 20 73 75 62 72 6f  d seven.** subro
131d0 75 74 69 6e 65 73 20 66 69 72 73 74 2c 20 74 68  utines first, th
131e0 65 6e 20 70 75 74 20 74 68 65 20 63 6f 6e 74 72  en put the contr
131f0 6f 6c 20 6c 6f 67 69 63 20 61 74 20 74 68 65 20  ol logic at the 
13200 62 6f 74 74 6f 6d 2e 20 20 4c 69 6b 65 20 74 68  bottom.  Like th
13210 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
13220 20 20 20 67 6f 74 6f 20 49 6e 69 74 0a 2a 2a 20     goto Init.** 
13230 20 20 20 20 63 6f 41 3a 20 63 6f 72 6f 75 74 69      coA: corouti
13240 6e 65 20 66 6f 72 20 6c 65 66 74 20 71 75 65 72  ne for left quer
13250 79 20 28 41 29 0a 2a 2a 20 20 20 20 20 63 6f 42  y (A).**     coB
13260 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  : coroutine for 
13270 72 69 67 68 74 20 71 75 65 72 79 20 28 42 29 0a  right query (B).
13280 2a 2a 20 20 20 20 6f 75 74 41 3a 20 6f 75 74 70  **    outA: outp
13290 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 41 0a  ut one row of A.
132a0 2a 2a 20 20 20 20 6f 75 74 42 3a 20 6f 75 74 70  **    outB: outp
132b0 75 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 42 20  ut one row of B 
132c0 28 55 4e 49 4f 4e 20 61 6e 64 20 55 4e 49 4f 4e  (UNION and UNION
132d0 20 41 4c 4c 20 6f 6e 6c 79 29 0a 2a 2a 20 20 20   ALL only).**   
132e0 20 45 6f 66 41 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofA: ....**   
132f0 20 45 6f 66 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   EofB: ....**   
13300 20 41 6c 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AltB: ....**   
13310 20 41 65 71 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AeqB: ....**   
13320 20 41 67 74 42 3a 20 2e 2e 2e 0a 2a 2a 20 20 20   AgtB: ....**   
13330 20 49 6e 69 74 3a 20 69 6e 69 74 69 61 6c 69 7a   Init: initializ
13340 65 20 63 6f 72 6f 75 74 69 6e 65 20 72 65 67 69  e coroutine regi
13350 73 74 65 72 73 0a 2a 2a 20 20 20 20 20 20 20 20  sters.**        
13360 20 20 79 69 65 6c 64 20 63 6f 41 0a 2a 2a 20 20    yield coA.**  
13370 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28 41          if eof(A
13380 29 20 67 6f 74 6f 20 45 6f 66 41 0a 2a 2a 20 20  ) goto EofA.**  
13390 20 20 20 20 20 20 20 20 79 69 65 6c 64 20 63 6f          yield co
133a0 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69 66  B.**          if
133b0 20 65 6f 66 28 42 29 20 67 6f 74 6f 20 45 6f 66   eof(B) goto Eof
133c0 42 0a 2a 2a 20 20 20 20 43 6d 70 72 3a 20 43 6f  B.**    Cmpr: Co
133d0 6d 70 61 72 65 20 41 2c 20 42 0a 2a 2a 20 20 20  mpare A, B.**   
133e0 20 20 20 20 20 20 20 4a 75 6d 70 20 41 6c 74 42         Jump AltB
133f0 2c 20 41 65 71 42 2c 20 41 67 74 42 0a 2a 2a 20  , AeqB, AgtB.** 
13400 20 20 20 20 45 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a      End: ....**.
13410 2a 2a 20 57 65 20 63 61 6c 6c 20 41 6c 74 42 2c  ** We call AltB,
13420 20 41 65 71 42 2c 20 41 67 74 42 2c 20 45 6f 66   AeqB, AgtB, Eof
13430 41 2c 20 61 6e 64 20 45 6f 66 42 20 22 73 75 62  A, and EofB "sub
13440 72 6f 75 74 69 6e 65 73 22 20 62 75 74 20 74 68  routines" but th
13450 65 79 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 63  ey are not.** ac
13460 74 75 61 6c 6c 79 20 63 61 6c 6c 65 64 20 75 73  tually called us
13470 69 6e 67 20 47 6f 73 75 62 20 61 6e 64 20 74 68  ing Gosub and th
13480 65 79 20 64 6f 20 6e 6f 74 20 52 65 74 75 72 6e  ey do not Return
13490 2e 20 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42  .  EofA and EofB
134a0 20 6c 6f 6f 70 0a 2a 2a 20 75 6e 74 69 6c 20 61   loop.** until a
134b0 6c 6c 20 64 61 74 61 20 69 73 20 65 78 68 61 75  ll data is exhau
134c0 73 74 65 64 20 74 68 65 6e 20 6a 75 6d 70 20 74  sted then jump t
134d0 6f 20 74 68 65 20 22 65 6e 64 22 20 6c 61 62 65  o the "end" labe
134e0 2e 20 20 41 6c 74 42 2c 20 41 65 71 42 2c 0a 2a  .  AltB, AeqB,.*
134f0 2a 20 61 6e 64 20 41 67 74 42 20 6a 75 6d 70 20  * and AgtB jump 
13500 74 6f 20 65 69 74 68 65 72 20 4c 32 20 6f 72 20  to either L2 or 
13510 74 6f 20 6f 6e 65 20 6f 66 20 45 6f 66 41 20 6f  to one of EofA o
13520 72 20 45 6f 66 42 2e 0a 2a 2f 0a 23 69 66 6e 64  r EofB..*/.#ifnd
13530 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
13540 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73  OMPOUND_SELECT.s
13550 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53  tatic int multiS
13560 65 6c 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20  electOrderBy(.  
13570 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13580 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13590 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
135a0 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
135b0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
135c0 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73  -most of SELECTs
135d0 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
135e0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
135f0 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20  est     /* What 
13600 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72 79  to do with query
13610 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20   results */.){. 
13620 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
13630 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
13640 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 53 65 6c  ounters */.  Sel
13650 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20  ect *pPrior;    
13660 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45     /* Another SE
13670 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79  LECT immediately
13680 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a   to our left */.
13690 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
136a0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
136b0 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73  ate code to this
136c0 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63   VDBE */.  Selec
136d0 74 44 65 73 74 20 64 65 73 74 41 3b 20 20 20 20  tDest destA;    
136e0 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
136f0 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20 41 20  for coroutine A 
13700 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
13710 64 65 73 74 42 3b 20 20 20 20 20 2f 2a 20 44 65  destB;     /* De
13720 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f  stination for co
13730 72 6f 75 74 69 6e 65 20 42 20 2a 2f 0a 20 20 69  routine B */.  i
13740 6e 74 20 72 65 67 41 64 64 72 41 3b 20 20 20 20  nt regAddrA;    
13750 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13760 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c  register for sel
13770 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20  ect-A coroutine 
13780 2a 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 41  */.  int regEofA
13790 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  ;          /* Fl
137a0 61 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77  ag to indicate w
137b0 68 65 6e 20 73 65 6c 65 63 74 2d 41 20 69 73 20  hen select-A is 
137c0 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  complete */.  in
137d0 74 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20  t regAddrB;     
137e0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
137f0 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
13800 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a  ct-B coroutine *
13810 2f 0a 20 20 69 6e 74 20 72 65 67 45 6f 66 42 3b  /.  int regEofB;
13820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
13830 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
13840 65 6e 20 73 65 6c 65 63 74 2d 42 20 69 73 20 63  en select-B is c
13850 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74  omplete */.  int
13860 20 61 64 64 72 53 65 6c 65 63 74 41 3b 20 20 20   addrSelectA;   
13870 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
13880 20 74 68 65 20 73 65 6c 65 63 74 2d 41 20 63 6f   the select-A co
13890 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
138a0 20 61 64 64 72 53 65 6c 65 63 74 42 3b 20 20 20   addrSelectB;   
138b0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
138c0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 20 63 6f   the select-B co
138d0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
138e0 20 72 65 67 4f 75 74 41 3b 20 20 20 20 20 20 20   regOutA;       
138f0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
13900 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20 6f  gister for the o
13910 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75 74 69  utput-A subrouti
13920 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
13930 75 74 42 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utB;          /*
13940 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
13950 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
13960 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -B subroutine */
13970 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 41 3b  .  int addrOutA;
13980 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
13990 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ess of the outpu
139a0 74 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  t-A subroutine *
139b0 2f 0a 20 20 69 6e 74 20 61 64 64 72 4f 75 74 42  /.  int addrOutB
139c0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 41 64 64   = 0;     /* Add
139d0 72 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 70  ress of the outp
139e0 75 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 20  ut-B subroutine 
139f0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f 66  */.  int addrEof
13a00 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  A;         /* Ad
13a10 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c  dress of the sel
13a20 65 63 74 2d 41 2d 65 78 68 61 75 73 74 65 64 20  ect-A-exhausted 
13a30 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
13a40 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
13a50 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
13a60 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
13a70 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
13a80 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
13a90 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
13aa0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
13ab0 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
13ac0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
13ad0 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
13ae0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
13af0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
13b00 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
13b10 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
13b20 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
13b30 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
13b40 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
13b50 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
13b60 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
13b70 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
13b80 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
13b90 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
13ba0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
13bb0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
13bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
13bd0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
13be0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
13bf0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
13c00 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
13c10 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
13c20 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
13c30 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
13c40 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
13c50 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
13c60 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
13c70 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
13c80 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
13c90 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
13ca0 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
13cb0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
13cc0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
13cd0 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
13ce0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
13cf0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
13d00 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
13d10 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
13d20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
13d30 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
13d40 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
13d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d60 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
13d70 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
13d80 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
13d90 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
13da0 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
13db0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
13dc0 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
13dd0 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
13de0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
13df0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
13e00 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
13e10 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
13e20 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
13e30 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
13e40 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
13e50 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
13e60 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
13e70 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
13e80 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
13e90 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
13ea0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
13eb0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
13ec0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
13ed0 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
13ee0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
13ef0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
13f00 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
13f10 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
13f20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13f30 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
13f40 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
13f50 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
13f60 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
13f70 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
13f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
13f90 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
13fa0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
13fb0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
13fc0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
13fd0 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
13fe0 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
13ff0 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
14000 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
14010 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
14020 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
14030 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
14040 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
14050 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
14060 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
14070 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
14080 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
14090 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
140a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
140b0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
140c0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
140d0 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
140e0 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
140f0 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
14100 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
14110 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
14120 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
14130 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
14140 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
14150 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
14160 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
14170 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
14180 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
14190 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
141a0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
141b0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
141c0 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
141d0 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
141e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
141f0 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
14200 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
14210 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
14220 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
14230 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
14240 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
14250 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
14260 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
14270 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
14280 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
14290 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
142a0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
142b0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
142c0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
142d0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
142e0 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
142f0 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
14300 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
14310 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
14320 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
14330 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
14340 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
14350 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
14360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14370 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
14380 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
14390 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
143a0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
143b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
143c0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
143d0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
143e0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
143f0 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
14400 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
14410 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
14420 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
14430 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
14440 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
14450 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
14460 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
14470 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
14480 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
14490 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
144a0 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
144b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
144c0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
144d0 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
144e0 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
144f0 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
14500 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
14510 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
14520 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
14530 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
14540 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
14550 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
14560 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
14570 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
14580 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
14590 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
145a0 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
145b0 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
145c0 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
145d0 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
145e0 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
145f0 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
14600 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
14610 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
14620 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
14630 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
14640 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
14650 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
14660 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
14670 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
14680 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
14690 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
146a0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f  OrderBy->a; i<nO
146b0 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
146c0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
146d0 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
146e0 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20  iOrderByCol>0.  
146f0 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
14700 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
14710 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<=p->pEList->nE
14720 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65  xpr );.      aPe
14730 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d  rmute[i] = pItem
14740 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
14750 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  l - 1;.    }.   
14760 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 73 71 6c   pKeyMerge = sql
14770 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
14780 28 64 62 2c 20 6e 4f 72 64 65 72 42 79 2c 20 31  (db, nOrderBy, 1
14790 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 4d  );.    if( pKeyM
147a0 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 66 6f  erge ){.      fo
147b0 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
147c0 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  y; i++){.       
147d0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
147e0 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
147f0 54 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d  Term = pOrderBy-
14800 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
14810 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
14820 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
14830 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  te ){.          
14840 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
14850 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
14860 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  e, pTerm);.     
14870 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14880 20 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74      pColl = mult
14890 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
148a0 50 61 72 73 65 2c 20 70 2c 20 61 50 65 72 6d 75  Parse, p, aPermu
148b0 74 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  te[i]);.        
148c0 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29    if( pColl==0 )
148d0 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
148e0 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  ltColl;.        
148f0 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
14900 2e 70 45 78 70 72 20 3d 0a 20 20 20 20 20 20 20  .pExpr =.       
14910 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
14920 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
14930 67 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c  g(pParse, pTerm,
14940 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
14950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14960 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14970 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
14980 62 6c 65 28 70 4b 65 79 4d 65 72 67 65 29 20 29  ble(pKeyMerge) )
14990 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 4d 65  ;.        pKeyMe
149a0 72 67 65 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  rge->aColl[i] = 
149b0 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pColl;.        p
149c0 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f 72 74 4f  KeyMerge->aSortO
149d0 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72  rder[i] = pOrder
149e0 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
149f0 65 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  er;.      }.    
14a00 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
14a10 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  KeyMerge = 0;.  
14a20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63 68  }..  /* Reattach
14a30 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
14a40 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65 72  ause to the quer
14a50 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f 72  y..  */.  p->pOr
14a60 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
14a70 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64  ;.  pPrior->pOrd
14a80 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
14a90 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73 65  prListDup(pParse
14aa0 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c 20  ->db, pOrderBy, 
14ab0 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  0);..  /* Alloca
14ac0 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74 65  te a range of te
14ad0 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
14ae0 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e 66  s and the KeyInf
14af0 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66 6f  o needed.  ** fo
14b00 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  r the logic that
14b10 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63 61   removes duplica
14b20 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20 77  te result rows w
14b30 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65  hen the.  ** ope
14b40 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c 20  rator is UNION, 
14b50 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45 52  EXCEPT, or INTER
14b60 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55 4e  SECT (but not UN
14b70 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a 20  ION ALL)..  */. 
14b80 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20   if( op==TK_ALL 
14b90 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  ){.    regPrev =
14ba0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
14bb0 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d 3e   int nExpr = p->
14bc0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
14bd0 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64 65     assert( nOrde
14be0 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64 62  rBy>=nExpr || db
14bf0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
14c00 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d 20  ;.    regPrev = 
14c10 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a  pParse->nMem+1;.
14c20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d      pParse->nMem
14c30 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20 20   += nExpr+1;.   
14c40 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14c50 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
14c60 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20  , 0, regPrev);. 
14c70 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c     pKeyDup = sql
14c80 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
14c90 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b 0a  (db, nExpr, 1);.
14ca0 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70 20      if( pKeyDup 
14cb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
14cc0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
14cd0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 44  sWriteable(pKeyD
14ce0 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  up) );.      for
14cf0 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
14d00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b 65  ++){.        pKe
14d10 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  yDup->aColl[i] =
14d20 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c   multiSelectColl
14d30 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 69  Seq(pParse, p, i
14d40 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44  );.        pKeyD
14d50 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  up->aSortOrder[i
14d60 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
14d70 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20     }.  }. .  /* 
14d80 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65 66  Separate the lef
14d90 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74 20  t and the right 
14da0 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61  query from one a
14db0 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d  nother.  */.  p-
14dc0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73  >pPrior = 0;.  s
14dd0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
14de0 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
14df0 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
14e00 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 69 66  , "ORDER");.  if
14e10 28 20 70 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72  ( pPrior->pPrior
14e20 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
14e30 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
14e40 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 50  oupBy(pParse, pP
14e50 72 69 6f 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f  rior, pPrior->pO
14e60 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
14e70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ;.  }..  /* Comp
14e80 75 74 65 20 74 68 65 20 6c 69 6d 69 74 20 72 65  ute the limit re
14e90 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d  gisters */.  com
14ea0 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65  puteLimitRegiste
14eb0 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 6c 61  rs(pParse, p, la
14ec0 62 65 6c 45 6e 64 29 3b 0a 20 20 69 66 28 20 70  belEnd);.  if( p
14ed0 2d 3e 69 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d  ->iLimit && op==
14ee0 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65  TK_ALL ){.    re
14ef0 67 4c 69 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72  gLimitA = ++pPar
14f00 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
14f10 67 4c 69 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72  gLimitB = ++pPar
14f20 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71  se->nMem;.    sq
14f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
14f40 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69  v, OP_Copy, p->i
14f50 4f 66 66 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66  Offset ? p->iOff
14f60 73 65 74 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69  set+1 : p->iLimi
14f70 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
14f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f90 20 20 20 20 20 72 65 67 4c 69 6d 69 74 41 29 3b       regLimitA);
14fa0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
14fb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70  AddOp2(v, OP_Cop
14fc0 79 2c 20 72 65 67 4c 69 6d 69 74 41 2c 20 72 65  y, regLimitA, re
14fd0 67 4c 69 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73  gLimitB);.  }els
14fe0 65 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  e{.    regLimitA
14ff0 20 3d 20 72 65 67 4c 69 6d 69 74 42 20 3d 20 30   = regLimitB = 0
15000 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
15010 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
15020 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70  >pLimit);.  p->p
15030 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c  Limit = 0;.  sql
15040 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
15050 62 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a  b, p->pOffset);.
15060 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
15070 3b 0a 0a 20 20 72 65 67 41 64 64 72 41 20 3d 20  ;..  regAddrA = 
15080 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
15090 20 20 72 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50    regEofA = ++pP
150a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65  arse->nMem;.  re
150b0 67 41 64 64 72 42 20 3d 20 2b 2b 70 50 61 72 73  gAddrB = ++pPars
150c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f  e->nMem;.  regEo
150d0 66 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  fB = ++pParse->n
150e0 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d  Mem;.  regOutA =
150f0 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
15100 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70  .  regOutB = ++p
15110 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73  Parse->nMem;.  s
15120 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
15130 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52 54  Init(&destA, SRT
15140 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  _Coroutine, regA
15150 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
15160 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
15170 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75  destB, SRT_Corou
15180 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b  tine, regAddrB);
15190 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74  ..  /* Jump past
151a0 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 75 62   the various sub
151b0 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 63 6f 72  routines and cor
151c0 6f 75 74 69 6e 65 73 20 74 6f 20 74 68 65 20 6d  outines to the m
151d0 61 69 6e 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c  ain.  ** merge l
151e0 6f 6f 70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20  oop.  */.  j1 = 
151f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15200 30 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  0(v, OP_Goto);. 
15210 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
15220 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15230 74 41 64 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a  tAddr(v);...  /*
15240 20 47 65 6e 65 72 61 74 65 20 61 20 63 6f 72 6f   Generate a coro
15250 75 74 69 6e 65 20 74 6f 20 65 76 61 6c 75 61 74  utine to evaluat
15260 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  e the SELECT sta
15270 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 0a 20 20  tement to the.  
15280 2a 2a 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63  ** left of the c
15290 6f 6d 70 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72  ompound operator
152a0 20 2d 20 74 68 65 20 22 41 22 20 73 65 6c 65 63   - the "A" selec
152b0 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
152c0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42  opComment((v, "B
152d0 65 67 69 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66  egin coroutine f
152e0 6f 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29  or left SELECT")
152f0 29 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69  );.  pPrior->iLi
15300 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b  mit = regLimitA;
15310 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
15320 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
15330 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
15340 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
15350 65 63 74 28 70 50 61 72 73 65 2c 20 70 50 72 69  ect(pParse, pPri
15360 6f 72 2c 20 26 64 65 73 74 41 29 3b 0a 20 20 73  or, &destA);.  s
15370 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15380 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
15390 31 2c 20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73  1, regEofA);.  s
153a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
153b0 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
153c0 67 41 64 64 72 41 29 3b 0a 20 20 56 64 62 65 4e  gAddrA);.  VdbeN
153d0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
153e0 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  End coroutine fo
153f0 72 20 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29  r left SELECT"))
15400 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
15410 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
15420 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
15430 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
15440 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
15450 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
15460 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
15470 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
15480 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15490 3b 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ;.  VdbeNoopComm
154a0 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e 20 63  ent((v, "Begin c
154b0 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67  oroutine for rig
154c0 68 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 20 20  ht SELECT"));.  
154d0 73 61 76 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e  savedLimit = p->
154e0 69 4c 69 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f  iLimit;.  savedO
154f0 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
15500 65 74 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20  et;.  p->iLimit 
15510 3d 20 72 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70  = regLimitB;.  p
15520 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 20 20  ->iOffset = 0;  
15530 0a 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74  .  explainSetInt
15540 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61 72  eger(iSub2, pPar
15550 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
15560 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  d);.  sqlite3Sel
15570 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
15580 64 65 73 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69  destB);.  p->iLi
15590 6d 69 74 20 3d 20 73 61 76 65 64 4c 69 6d 69 74  mit = savedLimit
155a0 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
155b0 20 73 61 76 65 64 4f 66 66 73 65 74 3b 0a 20 20   savedOffset;.  
155c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
155d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
155e0 20 31 2c 20 72 65 67 45 6f 66 42 29 3b 0a 20 20   1, regEofB);.  
155f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15600 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  1(v, OP_Yield, r
15610 65 67 41 64 64 72 42 29 3b 0a 20 20 56 64 62 65  egAddrB);.  Vdbe
15620 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
15630 22 45 6e 64 20 63 6f 72 6f 75 74 69 6e 65 20 66  "End coroutine f
15640 6f 72 20 72 69 67 68 74 20 53 45 4c 45 43 54 22  or right SELECT"
15650 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  ));..  /* Genera
15660 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  te a subroutine 
15670 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68 65  that outputs the
15680 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20   current row of 
15690 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63  the A.  ** selec
156a0 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75  t as the next ou
156b0 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20  tput row of the 
156c0 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
156d0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
156e0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74  Comment((v, "Out
156f0 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  put routine for 
15700 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75 74 41  A"));.  addrOutA
15710 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74 70 75   = generateOutpu
15720 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50 61 72  tSubroutine(pPar
15730 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
15740 20 20 20 20 20 70 2c 20 26 64 65 73 74 41 2c 20       p, &destA, 
15750 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a  pDest, regOutA,.
15760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15770 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79 44 75   regPrev, pKeyDu
15780 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  p, labelEnd);.  
15790 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
157a0 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
157b0 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75 72   outputs the cur
157c0 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65 20  rent row of the 
157d0 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61 73  B.  ** select as
157e0 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75 74   the next output
157f0 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d 70   row of the comp
15800 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20 2a  ound select..  *
15810 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41  /.  if( op==TK_A
15820 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49  LL || op==TK_UNI
15830 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e 6f  ON ){.    VdbeNo
15840 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
15850 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
15860 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64 72  r B"));.    addr
15870 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65 4f  OutB = generateO
15880 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28  utputSubroutine(
15890 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
158a0 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65 73           p, &des
158b0 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75  tB, pDest, regOu
158c0 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  tB,.            
158d0 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b       regPrev, pK
158e0 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29  eyDup, labelEnd)
158f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4b  ;.  }.  sqlite3K
15900 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
15910 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Dup);..  /* Gene
15920 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
15930 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68  e to run when th
15940 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73  e results from s
15950 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61 72 65  elect A.  ** are
15960 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f   exhausted and o
15970 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65  nly data in sele
15980 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a 20 20  ct B remains..  
15990 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
159a0 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 41 20  ment((v, "eof-A 
159b0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
159c0 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 45 58 43 45   if( op==TK_EXCE
159d0 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 54  PT || op==TK_INT
159e0 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64  ERSECT ){.    ad
159f0 64 72 45 6f 66 41 20 3d 20 73 71 6c 69 74 65 33  drEofA = sqlite3
15a00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15a10 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 45  _Goto, 0, labelE
15a20 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a  nd);.  }else{  .
15a30 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73      addrEofA = s
15a40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15a50 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f  (v, OP_If, regEo
15a60 66 42 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  fB, labelEnd);. 
15a70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15a80 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
15a90 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
15aa0 75 74 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  utB);.    sqlite
15ab0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15ac0 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72  P_Yield, regAddr
15ad0 42 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  B);.    sqlite3V
15ae0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15af0 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66  Goto, 0, addrEof
15b00 41 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65  A);.    p->nSele
15b10 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
15b20 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d  >nSelectRow;.  }
15b30 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
15b40 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  a subroutine to 
15b50 72 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73  run when the res
15b60 75 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74  ults from select
15b70 20 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61   B.  ** are exha
15b80 75 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64  usted and only d
15b90 61 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20  ata in select A 
15ba0 72 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20  remains..  */.  
15bb0 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52  if( op==TK_INTER
15bc0 53 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72  SECT ){.    addr
15bd0 45 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b  EofB = addrEofA;
15be0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c  .    if( p->nSel
15bf0 65 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d  ectRow > pPrior-
15c00 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d  >nSelectRow ) p-
15c10 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50  >nSelectRow = pP
15c20 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
15c30 3b 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20  ;.  }else{  .   
15c40 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
15c50 28 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72  ((v, "eof-B subr
15c60 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61  outine"));.    a
15c70 64 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65  ddrEofB = sqlite
15c80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15c90 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20 6c  P_If, regEofA, l
15ca0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71  abelEnd);.    sq
15cb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15cc0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
15cd0 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b  OutA, addrOutA);
15ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15cf0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
15d00 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
15d10 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15d20 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
15d30 20 30 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20   0, addrEofB);. 
15d40 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74   }..  /* Generat
15d50 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65  e code to handle
15d60 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3c 42   the case of A<B
15d70 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70  .  */.  VdbeNoop
15d80 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 6c  Comment((v, "A-l
15d90 74 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29  t-B subroutine")
15da0 29 3b 0a 20 20 61 64 64 72 41 6c 74 42 20 3d 20  );.  addrAltB = 
15db0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15dc0 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
15dd0 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
15de0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15df0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
15e00 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
15e10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15e20 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
15e30 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41 29 3b  EofA, addrEofA);
15e40 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15e50 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
15e60 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
15e70 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
15e80 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68  ode to handle th
15e90 65 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20  e case of A==B. 
15ea0 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
15eb0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72  _ALL ){.    addr
15ec0 41 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b  AeqB = addrAltB;
15ed0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d  .  }else if( op=
15ee0 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b  =TK_INTERSECT ){
15ef0 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20  .    addrAeqB = 
15f00 61 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64  addrAltB;.    ad
15f10 64 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73  drAltB++;.  }els
15f20 65 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43  e{.    VdbeNoopC
15f30 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71  omment((v, "A-eq
15f40 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
15f50 3b 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d  ;.    addrAeqB =
15f60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15f70 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
15f80 6c 64 2c 20 72 65 67 41 64 64 72 41 29 3b 0a 20  ld, regAddrA);. 
15f90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15fa0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
15fb0 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f 66 41  egEofA, addrEofA
15fc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15fd0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15fe0 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
15ff0 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  r);.  }..  /* Ge
16000 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68  nerate code to h
16010 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f  andle the case o
16020 66 20 41 3e 42 0a 20 20 2a 2f 0a 20 20 56 64 62  f A>B.  */.  Vdb
16030 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
16040 20 22 41 2d 67 74 2d 42 20 73 75 62 72 6f 75 74   "A-gt-B subrout
16050 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 67  ine"));.  addrAg
16060 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  tB = sqlite3Vdbe
16070 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
16080 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
16090 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   || op==TK_UNION
160a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
160b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
160c0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20  Gosub, regOutB, 
160d0 61 64 64 72 4f 75 74 42 29 3b 0a 20 20 7d 0a 20  addrOutB);.  }. 
160e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
160f0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
16100 72 65 67 41 64 64 72 42 29 3b 0a 20 20 73 71 6c  regAddrB);.  sql
16110 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16120 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
16130 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 73  , addrEofB);.  s
16140 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16150 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
16160 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f  labelCmpr);..  /
16170 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73  * This code runs
16180 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c   once to initial
16190 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  ize everything..
161a0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
161b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31  beJumpHere(v, j1
161c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
161d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
161e0 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 41  eger, 0, regEofA
161f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16200 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
16210 65 67 65 72 2c 20 30 2c 20 72 65 67 45 6f 66 42  eger, 0, regEofB
16220 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16230 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
16240 75 62 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64  ub, regAddrA, ad
16250 64 72 53 65 6c 65 63 74 41 29 3b 0a 20 20 73 71  drSelectA);.  sq
16260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16270 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
16280 41 64 64 72 42 2c 20 61 64 64 72 53 65 6c 65 63  AddrB, addrSelec
16290 74 42 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  tB);.  sqlite3Vd
162a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
162b0 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
162c0 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
162d0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
162e0 5f 49 66 2c 20 72 65 67 45 6f 66 42 2c 20 61 64  _If, regEofB, ad
162f0 64 72 45 6f 66 42 29 3b 0a 0a 20 20 2f 2a 20 49  drEofB);..  /* I
16300 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 6d 61 69  mplement the mai
16310 6e 20 6d 65 72 67 65 20 6c 6f 6f 70 0a 20 20 2a  n merge loop.  *
16320 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
16330 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
16340 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20 73 71 6c  abelCmpr);.  sql
16350 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
16360 2c 20 4f 50 5f 50 65 72 6d 75 74 61 74 69 6f 6e  , OP_Permutation
16370 2c 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  , 0, 0, 0, (char
16380 2a 29 61 50 65 72 6d 75 74 65 2c 20 50 34 5f 49  *)aPermute, P4_I
16390 4e 54 41 52 52 41 59 29 3b 0a 20 20 73 71 6c 69  NTARRAY);.  sqli
163a0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
163b0 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 64 65 73   OP_Compare, des
163c0 74 41 2e 69 53 64 73 74 2c 20 64 65 73 74 42 2e  tA.iSdst, destB.
163d0 69 53 64 73 74 2c 20 6e 4f 72 64 65 72 42 79 2c  iSdst, nOrderBy,
163e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
163f0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
16400 29 70 4b 65 79 4d 65 72 67 65 2c 20 50 34 5f 4b  )pKeyMerge, P4_K
16410 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
16420 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
16430 2c 20 4f 50 46 4c 41 47 5f 50 45 52 4d 55 54 45  , OPFLAG_PERMUTE
16440 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16450 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
16460 70 2c 20 61 64 64 72 41 6c 74 42 2c 20 61 64 64  p, addrAltB, add
16470 72 41 65 71 42 2c 20 61 64 64 72 41 67 74 42 29  rAeqB, addrAgtB)
16480 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  ;..  /* Jump to 
16490 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74 20 69  the this point i
164a0 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72 6d 69  n order to termi
164b0 6e 61 74 65 20 74 68 65 20 71 75 65 72 79 2e 0a  nate the query..
164c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
164d0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
164e0 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a 20 20  , labelEnd);..  
164f0 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  /* Set the numbe
16500 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f 6c 75  r of output colu
16510 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  mns.  */.  if( p
16520 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
16530 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 53  _Output ){.    S
16540 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20 3d 20  elect *pFirst = 
16550 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68 69 6c  pPrior;.    whil
16560 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f  e( pFirst->pPrio
16570 72 20 29 20 70 46 69 72 73 74 20 3d 20 70 46 69  r ) pFirst = pFi
16580 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  rst->pPrior;.   
16590 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
165a0 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
165b0 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
165c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 73 73  .  }..  /* Reass
165d0 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70 6f 75  embly the compou
165e0 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68 61 74  nd query so that
165f0 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65   it will be free
16600 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
16610 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
16620 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
16630 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
16640 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
16650 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
16660 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  rior);.  }.  p->
16670 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
16680 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20 49  ..  /*** TBD:  I
16690 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e 65  nsert subroutine
166a0 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65 20   calls to close 
166b0 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f 6d  cursors on incom
166c0 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75 62  plete.  **** sub
166d0 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20 20  queries ****/.  
166e0 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74 65  explainComposite
166f0 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c 20  (pParse, p->op, 
16700 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30 29  iSub1, iSub2, 0)
16710 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16720 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
16730 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
16740 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
16750 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
16760 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
16770 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63 6c  ./* Forward Decl
16780 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  arations */.stat
16790 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78 70  ic void substExp
167a0 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c 20  rList(sqlite3*, 
167b0 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c 20  ExprList*, int, 
167c0 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61 74  ExprList*);.stat
167d0 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65 6c  ic void substSel
167e0 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53 65  ect(sqlite3*, Se
167f0 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78 70  lect *, int, Exp
16800 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  rList *);../*.**
16810 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68   Scan through th
16820 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
16830 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76 65  pr.  Replace eve
16840 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f 0a  ry reference to.
16850 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ** a column in t
16860 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61 62  able number iTab
16870 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  le with a copy o
16880 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68  f the iColumn-th
16890 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45 4c  .** entry in pEL
168a0 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76 65  ist.  (But leave
168b0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
168c0 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  he ROWID column 
168d0 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29 0a  .** unchanged.).
168e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
168f0 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ne is part of th
16900 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72 6f  e flattening pro
16910 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71 75  cedure.  A subqu
16920 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65 73  ery.** whose res
16930 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69 6e  ult set is defin
16940 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70 70  ed by pEList app
16950 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69 6e  ears as entry in
16960 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c 61   the.** FROM cla
16970 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
16980 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56 44  such that the VD
16990 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67 6e  BE cursor assign
169a0 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46 4f  ed to that.** FO
169b0 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  RM clause entry 
169c0 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69 73  is iTable.  This
169d0 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74 68   routine make th
169e0 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a 20  e necessary .** 
169f0 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70 72  changes to pExpr
16a00 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66 65   so that it refe
16a10 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  rs directly to t
16a20 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65 0a  he source table.
16a30 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ** of the subque
16a40 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72 65  ry rather the re
16a50 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
16a60 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74 61  subquery..*/.sta
16a70 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74 45  tic Expr *substE
16a80 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  xpr(.  sqlite3 *
16a90 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52 65  db,        /* Re
16aa0 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72 6f  port malloc erro
16ab0 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e 65  rs to this conne
16ac0 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20  ction */.  Expr 
16ad0 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
16ae0 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68 20  * Expr in which 
16af0 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63 63  substitution occ
16b00 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  urs */.  int iTa
16b10 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ble,         /* 
16b20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62 73  Table to be subs
16b30 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78 70  tituted */.  Exp
16b40 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
16b50 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 65   /* Substitute e
16b60 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29 7b  xpressions */.){
16b70 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
16b80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
16b90 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
16ba0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
16bb0 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
16bc0 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
16bd0 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
16be0 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
16bf0 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d 65   TK_NULL;.    }e
16c00 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20  lse{.      Expr 
16c10 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73 73  *pNew;.      ass
16c20 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 26  ert( pEList!=0 &
16c30 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  & pExpr->iColumn
16c40 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
16c50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16c60 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
16c70 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
16c80 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e 65  ==0 );.      pNe
16c90 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  w = sqlite3ExprD
16ca0 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61  up(db, pEList->a
16cb0 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d  [pExpr->iColumn]
16cc0 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20  .pExpr, 0);.    
16cd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
16ce0 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
16cf0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70 4e        pExpr = pN
16d00 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ew;.    }.  }els
16d10 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  e{.    pExpr->pL
16d20 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72 28  eft = substExpr(
16d30 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
16d40 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
16d50 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  );.    pExpr->pR
16d60 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70 72  ight = substExpr
16d70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  (db, pExpr->pRig
16d80 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ht, iTable, pELi
16d90 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78 70  st);.    if( Exp
16da0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
16db0 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
16dc0 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74  ) ){.      subst
16dd0 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70 72  Select(db, pExpr
16de0 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54 61  ->x.pSelect, iTa
16df0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
16e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
16e10 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62 2c  ubstExprList(db,
16e20 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
16e30 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
16e40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
16e50 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73 74  turn pExpr;.}.st
16e60 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
16e70 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69 74  xprList(.  sqlit
16e80 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
16e90 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63  /* Report malloc
16ea0 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f 0a   errors here */.
16eb0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
16ec0 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74  t,     /* List t
16ed0 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77 68  o scan and in wh
16ee0 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62 73  ich to make subs
16ef0 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e 74  titutes */.  int
16f00 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
16f10 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
16f20 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f 0a   substituted */.
16f30 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
16f40 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69  st     /* Substi
16f50 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a 29  tute values */.)
16f60 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
16f70 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
16f80 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
16f90 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
16fa0 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  ++){.    pList->
16fb0 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75 62  a[i].pExpr = sub
16fc0 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73 74  stExpr(db, pList
16fd0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69 54  ->a[i].pExpr, iT
16fe0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16ff0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
17000 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20 20   substSelect(.  
17010 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
17020 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d       /* Report m
17030 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65 72  alloc errors her
17040 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
17050 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
17060 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
17070 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b 65  in which to make
17080 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 2a   substitutions *
17090 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
170a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
170b0 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65 64  e to be replaced
170c0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
170d0 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75  pEList     /* Su
170e0 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73 20  bstitute values 
170f0 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
17100 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74 20  *pSrc;.  struct 
17110 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
17120 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  tem;.  int i;.  
17130 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b  if( !p ) return;
17140 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
17150 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  (db, p->pEList, 
17160 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
17170 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73 74  .  substExprList
17180 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
17190 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
171a0 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
171b0 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65 72  st(db, p->pOrder
171c0 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
171d0 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69 6e  st);.  p->pHavin
171e0 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64 62  g = substExpr(db
171f0 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69 54  , p->pHaving, iT
17200 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
17210 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62   p->pWhere = sub
17220 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70 57  stExpr(db, p->pW
17230 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70 45  here, iTable, pE
17240 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53 65  List);.  substSe
17250 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72 69  lect(db, p->pPri
17260 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  or, iTable, pELi
17270 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  st);.  pSrc = p-
17280 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
17290 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76 65   pSrc );  /* Eve
172a0 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31 29  n for (SELECT 1)
172b0 20 77 65 20 68 61 76 65 3a 20 70 53 72 63 21 3d   we have: pSrc!=
172c0 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72 63  0 but pSrc->nSrc
172d0 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57  ==0 */.  if( ALW
172e0 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20 20  AYS(pSrc) ){.   
172f0 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
17300 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e 61  c, pItem=pSrc->a
17310 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65  ; i>0; i--, pIte
17320 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62 73  m++){.      subs
17330 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74 65  tSelect(db, pIte
17340 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61 62  m->pSelect, iTab
17350 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  le, pEList);.   
17360 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20   }.  }.}.#endif 
17370 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
17380 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
17390 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
173a0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
173b0 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
173c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
173d0 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
173e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
173f0 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  IEW)./*.** This 
17400 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
17410 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62 71   to flatten subq
17420 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72 66  ueries as a perf
17430 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61  ormance optimiza
17440 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
17450 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 20  utine returns 1 
17460 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61 6e  if it makes chan
17470 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 20  ges and 0 if no 
17480 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75 72  flattening occur
17490 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64 65  s..**.** To unde
174a0 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63 65  rstand the conce
174b0 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e 67  pt of flattening
174c0 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
174d0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65 72  ollowing.** quer
174e0 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  y:.**.**     SEL
174f0 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c 45  ECT a FROM (SELE
17500 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
17510 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 29   t1 WHERE z<100)
17520 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a 2a   WHERE a>5.**.**
17530 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61 79   The default way
17540 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67   of implementing
17550 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20 74   this query is t
17560 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a 2a  o execute the.**
17570 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74 20   subquery first 
17580 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 65  and store the re
17590 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70 6f  sults in a tempo
175a0 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65 6e  rary table, then
175b0 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74 65  .** run the oute
175c0 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74 20  r query on that 
175d0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e  temporary table.
175e0 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20    This requires 
175f0 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f 76  two.** passes ov
17600 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46 75  er the data.  Fu
17610 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61 75  rthermore, becau
17620 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  se the temporary
17630 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e 6f   table.** has no
17640 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57 48   indices, the WH
17650 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74 68  ERE clause on th
17660 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63 61  e outer query ca
17670 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69 6d  nnot be.** optim
17680 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ized..**.** This
17690 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
176a0 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75 65  s to rewrite que
176b0 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68 65  ries such as the
176c0 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20 61   above into.** a
176d0 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65 6c   single flat sel
176e0 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  ect, like this:.
176f0 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
17700 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20 74   x+y AS a FROM t
17710 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41 4e  1 WHERE z<100 AN
17720 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20  D a>5.**.** The 
17730 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 66  code generated f
17740 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69 63  or this simpific
17750 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65 20  ation gives the 
17760 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20 62  same result.** b
17770 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20 73  ut only has to s
17780 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e 63  can the data onc
17790 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65 20  e.  And because 
177a0 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a 2a  indices might .*
177b0 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20 74  * exist on the t
177c0 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70 6c  able t1, a compl
177d0 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65 20  ete scan of the 
177e0 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a 2a  data might be.**
177f0 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a 20   avoided..**.** 
17800 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f 6e  Flattening is on
17810 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66 20  ly attempted if 
17820 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
17830 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
17840 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65 20  *.**   (1)  The 
17850 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65  subquery and the
17860 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20   outer query do 
17870 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67 67  not both use agg
17880 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
17890 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75 65   (2)  The subque
178a0 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67  ry is not an agg
178b0 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f 75  regate or the ou
178c0 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74  ter query is not
178d0 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20   a join..**.**  
178e0 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75 65   (3)  The subque
178f0 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72 69  ry is not the ri
17900 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61  ght operand of a
17910 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69 6e   left outer join
17920 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69 67  .**        (Orig
17930 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23 33  inally ticket #3
17940 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e 65  06.  Strengthene
17950 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33 30  d by ticket #330
17960 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20 20  0).**.**   (4)  
17970 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  The subquery is 
17980 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a 2a  not DISTINCT..**
17990 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f 6e  .**  (**)  At on
179a0 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63 74  e point restrict
179b0 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35 29  ions (4) and (5)
179c0 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73 65   defined a subse
179d0 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a 2a  t of DISTINCT.**
179e0 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65 72          sub-quer
179f0 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65 78  ies that were ex
17a00 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69 73  cluded from this
17a10 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 52   optimization. R
17a20 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20 20  estriction .**  
17a30 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73 69        (4) has si
17a40 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65  nce been expande
17a50 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c 6c  d to exclude all
17a60 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75 65   DISTINCT subque
17a70 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 36  ries..**.**   (6
17a80 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17a90 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67 67  does not use agg
17aa0 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20 6f  regates or the o
17ab0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
17ac0 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53 54  t.**        DIST
17ad0 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 37  INCT..**.**   (7
17ae0 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17af0 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75 73  has a FROM claus
17b00 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20 73  e.  TODO:  For s
17b10 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f 75  ubqueries withou
17b20 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46 52  t.**        A FR
17b30 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73 69  OM clause, consi
17b40 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52 4f  der adding a FRO
17b50 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68 65  M close with the
17b60 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20 20   special.**     
17b70 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65 5f     table sqlite_
17b80 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69 73  once that consis
17b90 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 72  ts of a single r
17ba0 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a  ow containing a.
17bb0 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65  **        single
17bc0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   NULL..**.**   (
17bd0 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  8)  The subquery
17be0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
17bf0 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
17c00 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61 20   query is not a 
17c10 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28 39  join..**.**   (9
17c20 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20  )  The subquery 
17c30 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d  does not use LIM
17c40 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72 20  IT or the outer 
17c50 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75  query does not u
17c60 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67 67  se.**        agg
17c70 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  regates..**.**  
17c80 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75 65  (10)  The subque
17c90 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
17ca0 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68  aggregates or th
17cb0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
17cc0 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
17cd0 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a   use LIMIT..**.*
17ce0 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75 62  *  (11)  The sub
17cf0 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f 75  query and the ou
17d00 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f 74  ter query do not
17d10 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45 52   both have ORDER
17d20 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a   BY clauses..**.
17d30 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69 6d  **  (**)  Not im
17d40 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62 73  plemented.  Subs
17d50 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72 69  umed into restri
17d60 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73 20  ction (3).  Was 
17d70 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20 20  previously.**   
17d80 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65 20       a separate 
17d90 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72 69  restriction deri
17da0 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65 74  ving from ticket
17db0 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28 31   #350..**.**  (1
17dc0 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  3)  The subquery
17dd0 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72 79   and outer query
17de0 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65   do not both use
17df0 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20 28   LIMIT..**.**  (
17e00 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65 72  14)  The subquer
17e10 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4f  y does not use O
17e20 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28 31  FFSET..**.**  (1
17e30 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71 75  5)  The outer qu
17e40 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74 20  ery is not part 
17e50 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  of a compound se
17e60 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20 20  lect or the.**  
17e70 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20 64        subquery d
17e80 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20 4c  oes not have a L
17e90 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a 20  IMIT clause..** 
17ea0 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63 6b         (See tick
17eb0 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69 63  et #2339 and tic
17ec0 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34 5d  ket [02a8e81d44]
17ed0 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20 20  )..**.**  (16)  
17ee0 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  The outer query 
17ef0 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65 67  is not an aggreg
17f00 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71 75  ate or the subqu
17f10 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20 20  ery does.**     
17f20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 4f     not contain O
17f30 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b 65  RDER BY.  (Ticke
17f40 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20 75  t #2942)  This u
17f50 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74 65  sed to not matte
17f60 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74 69  r.**        unti
17f70 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64 20  l we introduced 
17f80 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  the group_concat
17f90 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a 2a  () function.  .*
17fa0 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65 20  *.**  (17)  The 
17fb0 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f 74  sub-query is not
17fc0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65   a compound sele
17fd0 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20 55  ct, or it is a U
17fe0 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20 20  NION ALL .**    
17ff0 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c 61      compound cla
18000 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74 69  use made up enti
18010 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67 72  rely of non-aggr
18020 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20 61  egate queries, a
18030 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74 68  nd .**        th
18040 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a 0a  e parent query:.
18050 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  **.**          *
18060 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20 70   is not itself p
18070 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
18080 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20 20  d select,.**    
18090 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20 61        * is not a
180a0 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20 44  n aggregate or D
180b0 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20 61  ISTINCT query, a
180c0 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 2a  nd.**          *
180d0 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a 2a   is not a join.*
180e0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65 20  *.**        The 
180f0 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d 71  parent and sub-q
18100 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  uery may contain
18110 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e 20   WHERE clauses. 
18120 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20 20  Subject to.**   
18130 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29 2c       rules (11),
18140 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c 20   (13) and (14), 
18150 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63 6f  they may also co
18160 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c 0a  ntain ORDER BY,.
18170 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54 20  **        LIMIT 
18180 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
18190 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65 72  es.  The subquer
181a0 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 79  y cannot use any
181b0 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20 20   compound.**    
181c0 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74 68      operator oth
181d0 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c  er than UNION AL
181e0 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74 68  L because all th
181f0 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e 64  e other compound
18200 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72 61  .**        opera
18210 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d 70  tors have an imp
18220 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77 68  lied DISTINCT wh
18230 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77 65  ich is disallowe
18240 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20 72  d by.**        r
18250 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e 0a  estriction (4)..
18260 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c 73  **.**        Als
18270 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e  o, each componen
18280 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75 65  t of the sub-que
18290 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20 74  ry must return t
182a0 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
182b0 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73 75  *        of resu
182c0 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69 73  lt columns. This
182d0 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 72   is actually a r
182e0 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20 61  equirement for a
182f0 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
18300 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74 61        SELECT sta
18310 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c 20  tement, but all 
18320 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64 6f  the code here do
18330 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65 20  es is make sure 
18340 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20 20  that no.**      
18350 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c 29    such (illegal)
18360 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66 6c   sub-query is fl
18370 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61 6c  attened. The cal
18380 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74 20  ler will detect 
18390 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73 79  the.**        sy
183a0 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20 72  ntax error and r
183b0 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65 64  eturn a detailed
183c0 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   message..**.** 
183d0 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73 75   (18)  If the su
183e0 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d  b-query is a com
183f0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68  pound select, th
18400 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  en all terms of 
18410 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f 52  the.**        OR
18420 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f 66  DER by clause of
18430 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73 74   the parent must
18440 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65 72   be simple refer
18450 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20 20  ences to .**    
18460 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
18470 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a 2a  he sub-query..**
18480 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20 73  .**  (19)  The s
18490 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  ubquery does not
184a0 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74 68   use LIMIT or th
184b0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
184c0 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20  es not.**       
184d0 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63 6c   have a WHERE cl
184e0 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 30  ause..**.**  (20
184f0 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  )  If the sub-qu
18500 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
18510 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 69  d select, then i
18520 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a 2a  t must not use.*
18530 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44 45  *        an ORDE
18540 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54 69  R BY clause.  Ti
18550 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65 20  cket #3773.  We 
18560 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69 73  could relax this
18570 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 20   constraint.**  
18580 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20 62        somewhat b
18590 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74 68  y saying that th
185a0 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  e terms of the O
185b0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6d  RDER BY clause m
185c0 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61 70  ust.**        ap
185d0 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66 69  pear as unmodifi
185e0 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ed result column
185f0 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  s in the outer q
18600 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a 2a  uery.  But we.**
18610 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74 68          have oth
18620 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
18630 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61 6c   in mind to deal
18640 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65 2e   with that case.
18650 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54 68  .**.**  (21)  Th
18660 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20  e subquery does 
18670 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72  not use LIMIT or
18680 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18690 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20   is not.**      
186a0 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53 65    DISTINCT.  (Se
186b0 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31 36  e ticket [752e16
186c0 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 49 6e  46fc])..**.** In
186d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 74   this routine, t
186e0 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65 72  he "p" parameter
186f0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
18700 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
18710 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75 65 72  ..** The subquer
18720 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  y is p->pSrc->a[
18730 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67 20 69  iFrom].  isAgg i
18740 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f 75  s true if the ou
18750 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75 73 65  ter query.** use
18760 73 20 61 67 67 72 65 67 61 74 65 73 20 61 6e 64  s aggregates and
18770 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 69   subqueryIsAgg i
18780 73 20 74 72 75 65 20 69 66 20 74 68 65 20 73 75  s true if the su
18790 62 71 75 65 72 79 20 75 73 65 73 20 61 67 67 72  bquery uses aggr
187a0 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  egates..**.** If
187b0 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6e   flattening is n
187c0 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20 74 68  ot attempted, th
187d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
187e0 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75 72 6e  no-op and return
187f0 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61 74 74  s 0..** If flatt
18800 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d 70 74  ening is attempt
18810 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
18820 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a 2a 2a  returns 1..**.**
18830 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78 70 72   All of the expr
18840 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73 20  ession analysis 
18850 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20 62 6f  must occur on bo
18860 74 68 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  th the outer que
18870 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 75  ry and.** the su
18880 62 71 75 65 72 79 20 62 65 66 6f 72 65 20 74 68  bquery before th
18890 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 2e  is routine runs.
188a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
188b0 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79 28 0a  lattenSubquery(.
188c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
188d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
188e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
188f0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
18900 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
18910 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c 45 43  t or outer SELEC
18920 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
18930 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20 20 20   int iFrom,     
18940 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
18950 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d 20 6f  n p->pSrc->a[] o
18960 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75 62 71  f the inner subq
18970 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 73  uery */.  int is
18980 41 67 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Agg,           /
18990 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65 72 20  * True if outer 
189a0 53 45 4c 45 43 54 20 75 73 65 73 20 61 67 67 72  SELECT uses aggr
189b0 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
189c0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75 65 72  */.  int subquer
189d0 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54 72 75  yIsAgg    /* Tru
189e0 65 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  e if the subquer
189f0 79 20 75 73 65 73 20 61 67 67 72 65 67 61 74 65  y uses aggregate
18a00 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 29 7b   functions */.){
18a10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18a20 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65 78 74  SavedAuthContext
18a30 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
18a40 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c 65 63  Context;.  Selec
18a50 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 53 65  t *pParent;.  Se
18a60 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20 20 20  lect *pSub;     
18a70 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72 20 71    /* The inner q
18a80 75 65 72 79 20 6f 72 20 22 73 75 62 71 75 65 72  uery or "subquer
18a90 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  y" */.  Select *
18aa0 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a 20 50  pSub1;      /* P
18ab0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 69  ointer to the ri
18ac0 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74 20 69  ghtmost select i
18ad0 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f 0a 20  n sub-query */. 
18ae0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b 20   SrcList *pSrc; 
18af0 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
18b00 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 6f   clause of the o
18b10 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a 20 20  uter query */.  
18b20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53 72 63  SrcList *pSubSrc
18b30 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  ;   /* The FROM 
18b40 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 73 75  clause of the su
18b50 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78 70 72  bquery */.  Expr
18b60 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20 20  List *pList;    
18b70 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
18b80 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71  t of the outer q
18b90 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 50  uery */.  int iP
18ba0 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a  arent;        /*
18bb0 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
18bc0 62 65 72 20 6f 66 20 74 68 65 20 70 53 75 62 20  ber of the pSub 
18bd0 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d 70 20  result set temp 
18be0 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
18bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
18c00 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
18c10 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
18c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18c30 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
18c40 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
18c50 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
18c60 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20 20 2f  m *pSubitem;   /
18c70 2a 20 54 68 65 20 73 75 62 71 75 65 72 79 20 2a  * The subquery *
18c80 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
18c90 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
18ca0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
18cb0 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   if flattening i
18cc0 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20 52 65  s permitted.  Re
18cd0 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e 0a 20  turn 0 if not.. 
18ce0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 21   */.  assert( p!
18cf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
18d00 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 3b 20  p->pPrior==0 ); 
18d10 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20 66 6c   /* Unable to fl
18d20 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64 20 71  atten compound q
18d30 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66 28 20  ueries */.  if( 
18d40 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61  OptimizationDisa
18d50 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
18d60 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 29 20  QueryFlattener) 
18d70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 53  ) return 0;.  pS
18d80 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  rc = p->pSrc;.  
18d90 61 73 73 65 72 74 28 20 70 53 72 63 20 26 26 20  assert( pSrc && 
18da0 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46 72 6f  iFrom>=0 && iFro
18db0 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a  m<pSrc->nSrc );.
18dc0 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26 70 53    pSubitem = &pS
18dd0 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a 20 20  rc->a[iFrom];.  
18de0 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62 69 74  iParent = pSubit
18df0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 70  em->iCursor;.  p
18e00 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e  Sub = pSubitem->
18e10 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73 65 72  pSelect;.  asser
18e20 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a 20 20  t( pSub!=0 );.  
18e30 69 66 28 20 69 73 41 67 67 20 26 26 20 73 75 62  if( isAgg && sub
18e40 71 75 65 72 79 49 73 41 67 67 20 29 20 72 65 74  queryIsAgg ) ret
18e50 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
18e60 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18e70 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a 20 20  ction (1)  */.  
18e80 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
18e90 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72 63 3e  g && pSrc->nSrc>
18ea0 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  1 ) return 0;   
18eb0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
18ec0 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a 20 20  ction (2)  */.  
18ed0 70 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e  pSubSrc = pSub->
18ee0 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  pSrc;.  assert( 
18ef0 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f 2a 20  pSubSrc );.  /* 
18f00 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69 6f 6e  Prior to version
18f10 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c 49 4d   3.1.2, when LIM
18f20 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 68 61  IT and OFFSET ha
18f30 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65 20 63  d to be simple c
18f40 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a 20 6e  onstants,.  ** n
18f50 6f 74 20 61 72 62 69 74 72 61 72 79 20 65 78 70  ot arbitrary exp
18f60 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20 61 6c  resssions, we al
18f70 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d 62 69  lowed some combi
18f80 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20 61 6e  ning of LIMIT an
18f90 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
18fa0 63 61 75 73 65 20 74 68 65 79 20 63 6f 75 6c 64  cause they could
18fb0 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61 74 20   be computed at 
18fc0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 42  compile-time.  B
18fd0 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e  ut when LIMIT an
18fe0 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20 62 65  d OFFSET.  ** be
18ff0 63 61 6d 65 20 61 72 62 69 74 72 61 72 79 20 65  came arbitrary e
19000 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 77  xpressions, we w
19010 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20 61 64  ere forced to ad
19020 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 28  d restrictions (
19030 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28 31 34  13).  ** and (14
19040 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  ). */.  if( pSub
19050 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e 70  ->pLimit && p->p
19060 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e 20 30  Limit ) return 0
19070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
19080 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
19090 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62  3) */.  if( pSub
190a0 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65 74 75  ->pOffset ) retu
190b0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
190c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
190d0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 31  * Restriction (1
190e0 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  4) */.  if( p->p
190f0 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70 53 75  Rightmost && pSu
19100 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  b->pLimit ){.   
19110 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
19120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19140 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19150 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20 20 7d  tion (15) */.  }
19160 0a 20 20 69 66 28 20 70 53 75 62 53 72 63 2d 3e  .  if( pSubSrc->
19170 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  nSrc==0 ) return
19180 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
191a0 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20 2a 2f  triction (7)  */
191b0 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
191c0 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
191d0 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20  nct ) return 0; 
191e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
191f0 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20 2a 2f  triction (5)  */
19200 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69  .  if( pSub->pLi
19210 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e 6e 53  mit && (pSrc->nS
19220 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29 20 29  rc>1 || isAgg) )
19230 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
19240 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
19250 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39 29 20  rictions (8)(9) 
19260 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d  */.  }.  if( (p-
19270 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
19280 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26 20 73  istinct)!=0 && s
19290 75 62 71 75 65 72 79 49 73 41 67 67 20 29 7b 0a  ubqueryIsAgg ){.
192a0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
192b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
192c0 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a 20 20  ction (6)  */.  
192d0 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65  }.  if( p->pOrde
192e0 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70 4f 72  rBy && pSub->pOr
192f0 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 72 65  derBy ){.     re
19300 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19330 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e    /* Restriction
19340 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20 20 69   (11) */.  }.  i
19350 66 28 20 69 73 41 67 67 20 26 26 20 70 53 75 62  f( isAgg && pSub
19360 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72 65 74  ->pOrderBy ) ret
19370 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
19380 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
19390 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20 20 69  tion (16) */.  i
193a0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
193b0 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29 20 72  && p->pWhere ) r
193c0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
193d0 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
193e0 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20 20 69  tion (19) */.  i
193f0 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20  f( pSub->pLimit 
19400 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  && (p->selFlags 
19410 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d  & SF_Distinct)!=
19420 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e  0 ){.     return
19430 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52   0;         /* R
19440 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31 29 20  estriction (21) 
19450 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 42 53  */.  }..  /* OBS
19460 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20 31 3a  OLETE COMMENT 1:
19470 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74 69 6f  .  ** Restrictio
19480 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73 75 62  n 3:  If the sub
19490 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69 6e 2c  query is a join,
194a0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
194b0 75 62 71 75 65 72 79 20 69 73 20 0a 20 20 2a 2a  ubquery is .  **
194c0 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74 68 65   not used as the
194d0 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f   right operand o
194e0 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 2e  f an outer join.
194f0 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 77 68    Examples of wh
19500 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73 20 6e  y this.  ** is n
19510 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a  ot allowed:.  **
19520 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31  .  **         t1
19530 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
19540 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a 20 20   (t2 JOIN t3).  
19550 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c  **.  ** If we fl
19560 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c  atten the above,
19570 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20   we would get.  
19580 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
19590 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  (t1 LEFT OUTER J
195a0 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74 33 0a  OIN t2) JOIN t3.
195b0 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63 68 20    **.  ** which 
195c0 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 74 68  is not at all th
195d0 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a 20 20  e same thing..  
195e0 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45 54 45  **.  ** OBSOLETE
195f0 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a   COMMENT 2:.  **
19600 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 32 3a   Restriction 12:
19610 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
19620 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20 6f  y is the right o
19630 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65 66 74  perand of a left
19640 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e   outer.  ** join
19650 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  , make sure the 
19660 73 75 62 71 75 65 72 79 20 68 61 73 20 6e 6f 20  subquery has no 
19670 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 20 20  WHERE clause..  
19680 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73 20 6f  ** An examples o
19690 66 20 77 68 79 20 74 68 69 73 20 69 73 20 6e 6f  f why this is no
196a0 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a  t allowed:.  **.
196b0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 31 20    **         t1 
196c0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
196d0 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  (SELECT * FROM t
196e0 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30 29 0a  2 WHERE t2.x>0).
196f0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
19700 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
19710 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
19720 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
19730 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
19740 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52 45 20   JOIN t2) WHERE 
19750 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a  t2.x>0.  **.  **
19760 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e 30 20   But the t2.x>0 
19770 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61 79 73  test will always
19780 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20   fail on a NULL 
19790 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69 63 68  row of t2, which
197a0 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 6c  .  ** effectivel
197b0 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65 20 4f  y converts the O
197c0 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f 20 61  UTER JOIN into a
197d0 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20  n INNER JOIN..  
197e0 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f 56 45  **.  ** THIS OVE
197f0 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54 45 20  RRIDES OBSOLETE 
19800 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44 20 32  COMMENTS 1 AND 2
19810 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54 69 63   ABOVE:.  ** Tic
19820 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77 73 20  ket #3300 shows 
19830 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e 67 20  that flattening 
19840 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
19850 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a 20 20  f a LEFT JOIN.  
19860 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20 77 69  ** is fraught wi
19870 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65 73 74  th danger.  Best
19880 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 77 68   to avoid the wh
19890 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66 20 74  ole thing.  If t
198a0 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79  he.  ** subquery
198b0 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 65   is the right te
198c0 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  rm of a LEFT JOI
198d0 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 66  N, then do not f
198e0 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69  latten..  */.  i
198f0 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e 6a 6f  f( (pSubitem->jo
19900 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45  intype & JT_OUTE
19910 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  R)!=0 ){.    ret
19920 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
19930 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31 37 3a   Restriction 17:
19940 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
19950 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
19960 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69 74 20  SELECT, then it 
19970 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20 6f 6e  must.  ** use on
19980 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41 4c 4c  ly the UNION ALL
19990 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64 20 6e   operator. And n
199a0 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d 70 6c  one of the simpl
199b0 65 20 73 65 6c 65 63 74 20 71 75 65 72 69 65 73  e select queries
199c0 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b 65 20  .  ** that make 
199d0 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  up the compound 
199e0 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c 6f 77  SELECT are allow
199f0 65 64 20 74 6f 20 62 65 20 61 67 67 72 65 67 61  ed to be aggrega
19a00 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74 0a 20  te or distinct. 
19a10 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20 20 2a   ** queries..  *
19a20 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70 50  /.  if( pSub->pP
19a30 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20  rior ){.    if( 
19a40 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29  pSub->pOrderBy )
19a50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
19a60 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f  ;  /* Restrictio
19a70 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  n 20 */.    }.  
19a80 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c 20 28    if( isAgg || (
19a90 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
19aa0 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 7c 7c  _Distinct)!=0 ||
19ab0 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 29   pSrc->nSrc!=1 )
19ac0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
19ad0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
19ae0 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53 75 62  pSub1=pSub; pSub
19af0 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31 2d 3e  1; pSub1=pSub1->
19b00 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20 74  pPrior){.      t
19b10 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d  estcase( (pSub1-
19b20 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
19b30 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
19b40 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69 73 74  egate))==SF_Dist
19b50 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 74 65  inct );.      te
19b60 73 74 63 61 73 65 28 20 28 70 53 75 62 31 2d 3e  stcase( (pSub1->
19b70 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44  selFlags & (SF_D
19b80 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65  istinct|SF_Aggre
19b90 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67 72 65  gate))==SF_Aggre
19ba0 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20 61 73  gate );.      as
19bb0 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53 72 63  sert( pSub->pSrc
19bc0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  !=0 );.      if(
19bd0 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c 61 67   (pSub1->selFlag
19be0 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
19bf0 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 29 21  |SF_Aggregate))!
19c00 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 53  =0.       || (pS
19c10 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26 20 70  ub1->pPrior && p
19c20 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c  Sub1->op!=TK_ALL
19c30 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  ) .       || pSu
19c40 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3c 31  b1->pSrc->nSrc<1
19c50 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75 62 2d  .       || pSub-
19c60 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
19c70 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pSub1->pEList->n
19c80 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a 20 20  Expr.      ){.  
19c90 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
19ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
19cb0 73 74 63 61 73 65 28 20 70 53 75 62 31 2d 3e 70  stcase( pSub1->p
19cc0 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b 0a 20  Src->nSrc>1 );. 
19cd0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
19ce0 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a  triction 18. */.
19cf0 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65      if( p->pOrde
19d00 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  rBy ){.      int
19d10 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   ii;.      for(i
19d20 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72 64 65  i=0; ii<p->pOrde
19d30 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69 2b 2b  rBy->nExpr; ii++
19d40 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
19d50 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 69  ->pOrderBy->a[ii
19d60 5d 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ].u.x.iOrderByCo
19d70 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
19d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19d90 20 7d 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20   }..  /***** If 
19da0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
19db0 69 6e 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20  int, flattening 
19dc0 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a  is permitted. **
19dd0 2a 2a 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f  ***/..  /* Autho
19de0 72 69 7a 65 20 74 68 65 20 73 75 62 71 75 65 72  rize the subquer
19df0 79 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a  y */.  pParse->z
19e00 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53  AuthContext = pS
19e10 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  ubitem->zName;. 
19e20 20 54 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73   TESTONLY(i =) s
19e30 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
19e40 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
19e50 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
19e60 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d  .  testcase( i==
19e70 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20  SQLITE_DENY );. 
19e80 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
19e90 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75  ntext = zSavedAu
19ea0 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a  thContext;..  /*
19eb0 20 49 66 20 74 68 65 20 73 75 62 2d 71 75 65 72   If the sub-quer
19ec0 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20  y is a compound 
19ed0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19ee0 2c 20 74 68 65 6e 20 28 62 79 20 72 65 73 74 72  , then (by restr
19ef0 69 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20  ictions.  ** 17 
19f00 61 6e 64 20 31 38 20 61 62 6f 76 65 29 20 69 74  and 18 above) it
19f10 20 6d 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e   must be a UNION
19f20 20 41 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72   ALL and the par
19f30 65 6e 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a  ent query must .
19f40 20 20 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66    ** be of the f
19f50 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
19f60 20 20 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d     SELECT <expr-
19f70 6c 69 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62  list> FROM (<sub
19f80 2d 71 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d  -query>) <where-
19f90 63 6c 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20  clause> .  **.  
19fa0 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ** followed by a
19fb0 6e 79 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d  ny ORDER BY, LIM
19fc0 49 54 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54  IT and/or OFFSET
19fd0 20 63 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62   clauses. This b
19fe0 6c 6f 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65  lock.  ** create
19ff0 73 20 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20  s N-1 copies of 
1a000 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
1a010 20 77 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44   without any ORD
1a020 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20  ER BY, LIMIT or 
1a030 0a 20 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61  .  ** OFFSET cla
1a040 75 73 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74  uses and joins t
1a050 68 65 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d  hem to the left-
1a060 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65  hand-side of the
1a070 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75   original.  ** u
1a080 73 69 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f  sing UNION ALL o
1a090 70 65 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69  perators. In thi
1a0a0 73 20 63 61 73 65 20 4e 20 69 73 20 74 68 65 20  s case N is the 
1a0b0 6e 75 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65  number of simple
1a0c0 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61  .  ** select sta
1a0d0 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63  tements in the c
1a0e0 6f 6d 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72  ompound sub-quer
1a0f0 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61  y..  **.  ** Exa
1a100 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
1a110 20 20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46      SELECT a+1 F
1a120 52 4f 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20  ROM (.  **      
1a130 20 20 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20    SELECT x FROM 
1a140 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1a150 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1a160 20 20 20 20 20 20 53 45 4c 45 43 54 20 79 20 46        SELECT y F
1a170 52 4f 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20  ROM tab.  **    
1a180 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
1a190 2a 2a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  **        SELECT
1a1a0 20 61 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74   abs(z*2) FROM t
1a1b0 61 62 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57  ab2.  **     ) W
1a1c0 48 45 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20  HERE a!=5 ORDER 
1a1d0 42 59 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  BY 1.  **.  ** T
1a1e0 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
1a1f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1a200 45 4c 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74  ELECT x+1 FROM t
1a210 61 62 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a  ab WHERE x+1!=5.
1a220 20 20 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41    **     UNION A
1a230 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  LL.  **     SELE
1a240 43 54 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20  CT y+1 FROM tab 
1a250 57 48 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a  WHERE y+1!=5.  *
1a260 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a  *     UNION ALL.
1a270 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
1a280 61 62 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20  abs(z*2)+1 FROM 
1a290 74 61 62 32 20 57 48 45 52 45 20 61 62 73 28 7a  tab2 WHERE abs(z
1a2a0 2a 32 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  *2)+1!=5.  **   
1a2b0 20 20 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a    ORDER BY 1.  *
1a2c0 2a 0a 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74  *.  ** We call t
1a2d0 68 69 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e  his the "compoun
1a2e0 64 2d 73 75 62 71 75 65 72 79 20 66 6c 61 74 74  d-subquery flatt
1a2f0 65 6e 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66  ening"..  */.  f
1a300 6f 72 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50  or(pSub=pSub->pP
1a310 72 69 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62  rior; pSub; pSub
1a320 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a  =pSub->pPrior){.
1a330 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77      Select *pNew
1a340 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
1a350 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
1a360 72 64 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72  rderBy;.    Expr
1a370 20 2a 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c   *pLimit = p->pL
1a380 69 6d 69 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  imit;.    Expr *
1a390 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
1a3a0 66 73 65 74 3b 0a 20 20 20 20 53 65 6c 65 63 74  fset;.    Select
1a3b0 20 2a 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50   *pPrior = p->pP
1a3c0 72 69 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72  rior;.    p->pOr
1a3d0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70  derBy = 0;.    p
1a3e0 2d 3e 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20  ->pSrc = 0;.    
1a3f0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
1a400 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
1a410 3b 0a 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74  ;.    p->pOffset
1a420 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 20 3d   = 0;.    pNew =
1a430 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
1a440 70 28 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  p(db, p, 0);.   
1a450 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
1a460 66 66 73 65 74 3b 0a 20 20 20 20 70 2d 3e 70 4c  ffset;.    p->pL
1a470 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
1a480 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
1a490 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
1a4a0 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
1a4b0 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c     p->op = TK_AL
1a4c0 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74  L;.    p->pRight
1a4d0 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  most = 0;.    if
1a4e0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1a4f0 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72     pNew = pPrior
1a500 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a510 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
1a520 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
1a530 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74  pNew->pRightmost
1a540 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1a550 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77  p->pPrior = pNew
1a560 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
1a570 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1a580 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
1a590 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
1a5a0 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
1a5b0 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1a5c0 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
1a5d0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1a5e0 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
1a5f0 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
1a600 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
1a610 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
1a620 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1a630 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
1a640 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1a650 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
1a660 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a670 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1a680 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1a690 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1a6a0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1a6b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a6c0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1a6d0 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1a6e0 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1a6f0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1a700 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1a710 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1a720 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1a730 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1a740 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1a750 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1a760 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1a770 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1a780 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1a790 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1a7a0 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1a7b0 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1a7c0 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1a7d0 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1a7e0 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1a7f0 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1a800 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1a810 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1a820 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1a830 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1a840 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1a850 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1a860 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1a870 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1a880 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1a890 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1a8a0 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1a8b0 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1a8c0 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1a8d0 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1a8e0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1a8f0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1a900 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1a910 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1a920 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1a930 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1a940 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1a950 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1a960 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1a970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a980 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1a990 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1a9a0 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1a9b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1a9c0 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1a9d0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1a9e0 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1a9f0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1aa00 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1aa10 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1aa20 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1aa30 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1aa40 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1aa50 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1aa60 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1aa70 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1aa80 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1aa90 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1aaa0 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1aab0 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1aac0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1aad0 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1aae0 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1aaf0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1ab00 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1ab10 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1ab20 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1ab30 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1ab40 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1ab50 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1ab60 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1ab70 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1ab80 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1ab90 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1aba0 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1abb0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1abc0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1abd0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1abe0 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1abf0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1ac00 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1ac10 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1ac20 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1ac30 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1ac40 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1ac50 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1ac60 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1ac70 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1ac80 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1ac90 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1aca0 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1acb0 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1acc0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1acd0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1ace0 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1acf0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1ad00 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1ad10 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1ad20 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1ad30 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1ad40 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1ad50 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1ad60 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1ad70 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1ad80 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1ad90 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1ada0 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1adb0 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1adc0 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1add0 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1ade0 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1adf0 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1ae00 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1ae10 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1ae20 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1ae30 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1ae40 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1ae50 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1ae60 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1ae70 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1ae80 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1ae90 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1aea0 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1aeb0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1aec0 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1aed0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1aee0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1aef0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1af00 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1af10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1af20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1af30 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1af40 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1af50 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1af60 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1af70 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1af80 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1af90 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1afa0 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1afb0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1afc0 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1afd0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1afe0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1aff0 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1b000 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1b010 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1b020 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1b030 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1b040 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1b050 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1b060 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1b070 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1b080 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1b090 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1b0a0 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1b0b0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1b0c0 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1b0d0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1b0e0 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1b0f0 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1b100 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1b110 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1b120 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1b130 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1b140 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
1b150 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
1b160 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
1b170 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
1b180 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
1b190 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
1b1a0 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
1b1b0 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
1b1c0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1b1d0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1b1e0 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
1b1f0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
1b200 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1b210 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1b220 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1b230 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
1b240 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
1b250 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1b260 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
1b270 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1b280 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
1b290 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
1b2a0 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
1b2b0 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1b2c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1b2d0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
1b2e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1b2f0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1b300 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1b310 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
1b320 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
1b330 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
1b340 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1b350 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1b360 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1b370 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1b380 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1b390 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1b3a0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1b3b0 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1b3c0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1b3d0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1b3e0 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1b3f0 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1b400 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1b410 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1b420 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1b430 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1b440 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1b450 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1b460 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1b470 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1b480 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1b490 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
1b4a0 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
1b4b0 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
1b4c0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1b4d0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
1b4e0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
1b4f0 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
1b500 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
1b510 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1b520 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1b530 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1b540 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
1b550 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
1b560 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1b570 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
1b580 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
1b590 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
1b5a0 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1b5b0 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1b5c0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1b5d0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1b5e0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1b5f0 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1b600 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1b610 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1b620 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1b630 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1b640 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
1b650 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
1b660 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1b670 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
1b680 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1b690 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b6a0 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
1b6b0 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
1b6c0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
1b6d0 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
1b6e0 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
1b6f0 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1b700 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
1b710 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1b720 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
1b730 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1b740 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1b750 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
1b760 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1b770 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1b780 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1b790 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1b7a0 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1b7b0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1b7c0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1b7d0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
1b7e0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rBy ){.      ass
1b7f0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
1b800 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
1b810 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
1b820 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
1b830 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
1b840 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
1b850 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1b860 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1b870 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1b880 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1b890 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
1b8a0 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1b8b0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1b8c0 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
1b8d0 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
1b8e0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
1b8f0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
1b900 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
1b910 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
1b920 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1b930 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
1b940 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
1b950 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
1b960 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
1b970 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1b980 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
1b990 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1b9a0 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
1b9b0 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1b9c0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1b9d0 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1b9e0 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1b9f0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1ba00 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1ba10 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
1ba20 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1ba30 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1ba40 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1ba70 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1ba80 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
1ba90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1baa0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
1bab0 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1bac0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1bad0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1bae0 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
1baf0 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
1bb00 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
1bb10 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1bb20 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1bb30 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
1bb40 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1bb50 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1bb60 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1bb70 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1bb80 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
1bb90 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
1bba0 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
1bbb0 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
1bbc0 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
1bbd0 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
1bbe0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1bbf0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1bc00 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
1bc10 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
1bc20 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
1bc30 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
1bc40 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
1bc50 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
1bc60 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
1bc70 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
1bc80 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
1bc90 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1bca0 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
1bcb0 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
1bcc0 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
1bcd0 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
1bce0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
1bcf0 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
1bd00 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
1bd10 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
1bd20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
1bd30 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
1bd40 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
1bd50 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
1bd60 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
1bd70 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1bd80 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
1bd90 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
1bda0 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
1bdb0 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
1bdc0 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
1bdd0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1bde0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
1bdf0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
1be00 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1be10 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1be20 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1be30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1be40 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
1be50 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
1be60 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1be70 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1be80 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
1be90 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
1bea0 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
1beb0 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
1bec0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1bed0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
1bee0 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
1bef0 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
1bf00 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1bf10 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
1bf20 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1bf30 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
1bf40 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
1bf50 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
1bf60 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
1bf70 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1bf80 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
1bf90 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
1bfa0 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
1bfb0 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
1bfc0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
1bfd0 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
1bfe0 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
1bff0 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
1c000 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
1c010 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
1c020 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
1c030 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
1c040 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
1c050 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
1c060 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1c070 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
1c080 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
1c090 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
1c0a0 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
1c0b0 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
1c0c0 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
1c0d0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1c0e0 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
1c0f0 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
1c100 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
1c110 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
1c120 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1c130 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
1c140 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1c150 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
1c160 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
1c170 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
1c180 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
1c190 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
1c1a0 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
1c1b0 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
1c1c0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
1c1d0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1c1e0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1c1f0 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
1c200 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
1c210 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
1c220 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
1c230 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
1c240 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
1c250 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
1c260 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
1c270 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1c280 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
1c290 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1c2a0 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
1c2b0 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1c2c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1c2d0 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
1c2e0 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
1c2f0 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
1c300 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
1c310 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
1c320 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
1c330 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1c340 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
1c350 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
1c360 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
1c370 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
1c380 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
1c390 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
1c3a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
1c3b0 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
1c3c0 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
1c3d0 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
1c3e0 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
1c3f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
1c400 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
1c410 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1c420 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1c430 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
1c440 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1c450 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  rgment is the as
1c460 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
1c470 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
1c480 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
1c490 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
1c4a0 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
1c4b0 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
1c4c0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1c4d0 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
1c4e0 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
1c4f0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
1c500 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
1c510 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
1c520 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
1c530 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
1c540 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
1c550 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
1c560 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
1c570 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
1c580 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1c590 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
1c5a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
1c5b0 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
1c5c0 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
1c5d0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1c5e0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
1c5f0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
1c600 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
1c610 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
1c620 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
1c630 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
1c640 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
1c650 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
1c660 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
1c670 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
1c680 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
1c690 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
1c6a0 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
1c6b0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
1c6c0 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
1c6d0 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
1c6e0 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
1c6f0 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
1c700 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
1c710 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1c720 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
1c730 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
1c740 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
1c750 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
1c760 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
1c770 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
1c780 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
1c790 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
1c7a0 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
1c7b0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1c7c0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1c7d0 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
1c7e0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
1c7f0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
1c800 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
1c810 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
1c820 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
1c830 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
1c840 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
1c850 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1c860 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
1c870 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
1c880 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
1c890 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
1c8a0 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
1c8b0 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
1c8c0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
1c8d0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
1c8e0 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
1c8f0 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
1c900 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
1c910 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
1c920 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
1c930 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
1c940 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
1c950 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
1c960 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
1c970 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
1c980 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
1c990 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a  pTab && pFrom->z
1c9a0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62  Index ){.    Tab
1c9b0 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
1c9c0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
1c9d0 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d   *zIndex = pFrom
1c9e0 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e  ->zIndex;.    In
1c9f0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
1ca00 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
1ca10 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70  ndex; .        p
1ca20 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74  Idx && sqlite3St
1ca30 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d  rICmp(pIdx->zNam
1ca40 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20  e, zIndex); .   
1ca50 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
1ca60 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
1ca70 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
1ca80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1ca90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1caa0 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
1cab0 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20   zIndex, 0);.   
1cac0 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
1cad0 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
1cae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1caf0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
1cb00 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d   pFrom->pIndex =
1cb10 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
1cb20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1cb30 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f  ./*.** Detect co
1cb40 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1cb50 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
1cb60 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
1cb70 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e  ause with .** an
1cb80 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
1cb90 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
1cba0 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
1cbb0 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
1cbc0 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
1cbd0 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
1cbe0 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
1cbf0 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72  *.** These are r
1cc00 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75  ewritten as a su
1cc10 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  bquery:.**.**   
1cc20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
1cc30 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1cc40 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
1cc50 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   ... FROM t2).**
1cc60 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e       ORDER BY ..
1cc70 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
1cc80 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
1cc90 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  rmation is neces
1cca0 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65  sary because the
1ccb0 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
1ccc0 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  rBy() routine.**
1ccd0 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65   above that gene
1cce0 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
1ccf0 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  or a compound SE
1cd00 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  LECT with an ORD
1cd10 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  ER BY clause.** 
1cd20 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67  uses a merge alg
1cd30 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75  orithm that requ
1cd40 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  ires the same co
1cd50 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1cd60 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   on the.** resul
1cd70 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20  t columns as on 
1cd80 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1cd90 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74  use.  See ticket
1cda0 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  .** http://www.s
1cdb0 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
1cdc0 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a  fo/6709574d2a.**
1cdd0 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
1cde0 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  rmation is only 
1cdf0 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50  needed for EXCEP
1ce00 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e  T, INTERSECT, an
1ce10 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20  d UNION..** The 
1ce20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
1ce30 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69  or works fine wi
1ce40 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  th multiSelectOr
1ce50 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65  derBy() even whe
1ce60 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43  n.** there are C
1ce70 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20  OLLATE terms in 
1ce80 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f  the ORDER BY..*/
1ce90 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76  .static int conv
1cea0 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
1ceb0 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b  tToSubquery(Walk
1cec0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
1ced0 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
1cee0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  ;.  Select *pNew
1cef0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a  ;.  Select *pX;.
1cf00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1cf10 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1cf20 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c  _item *a;.  SrcL
1cf30 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20  ist *pNewSrc;.  
1cf40 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
1cf50 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20   Token dummy;.. 
1cf60 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
1cf70 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
1cf80 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70  ontinue;.  if( p
1cf90 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
1cfa0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1cfb0 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b  nue;.  for(pX=p;
1cfc0 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d   pX && (pX->op==
1cfd0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70  TK_ALL || pX->op
1cfe0 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58  ==TK_SELECT); pX
1cff0 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20  =pX->pPrior){}. 
1d000 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74   if( pX==0 ) ret
1d010 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1d020 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65  ;.  a = p->pOrde
1d030 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  rBy->a;.  for(i=
1d040 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1d050 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  pr-1; i>=0; i--)
1d060 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70  {.    if( a[i].p
1d070 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1d080 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b  _Collate ) break
1d090 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20  ;.  }.  if( i<0 
1d0a0 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
1d0b0 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  tinue;..  /* If 
1d0c0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1d0d0 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
1d0e0 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
1d0f0 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  on is required. 
1d100 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
1d110 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
1d120 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1d130 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
1d140 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1d150 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
1d160 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
1d170 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1d180 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28  Abort;.  memset(
1d190 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f  &dummy, 0, sizeo
1d1a0 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65  f(dummy));.  pNe
1d1b0 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  wSrc = sqlite3Sr
1d1c0 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
1d1d0 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
1d1e0 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30  ,&dummy,pNew,0,0
1d1f0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63  );.  if( pNewSrc
1d200 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1d210 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20  _Abort;.  *pNew 
1d220 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20  = *p;.  p->pSrc 
1d230 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e  = pNewSrc;.  p->
1d240 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
1d250 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1d260 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
1d270 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c  3Expr(db, TK_ALL
1d280 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
1d290 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
1d2a0 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
1d2b0 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
1d2c0 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
1d2d0 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
1d2e0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1d2f0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
1d300 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d 20   pNew->pLimit = 
1d310 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73  0;.  pNew->pOffs
1d320 65 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  et = 0;.  return
1d330 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
1d340 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
1d350 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
1d360 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 73  Parse *pParse, s
1d370 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d380 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  em *p){.  if( p-
1d390 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 29 7b  >zDatabase==0 ){
1d3a0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  .    char *zName
1d3b0 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   = p->zName;.   
1d3c0 20 57 69 74 68 20 2a 70 57 69 74 68 3b 0a 0a 20   With *pWith;.. 
1d3d0 20 20 20 66 6f 72 28 70 57 69 74 68 3d 70 50 61     for(pWith=pPa
1d3e0 72 73 65 2d 3e 70 57 69 74 68 3b 20 70 57 69 74  rse->pWith; pWit
1d3f0 68 3b 20 70 57 69 74 68 3d 70 57 69 74 68 2d 3e  h; pWith=pWith->
1d400 70 4f 75 74 65 72 29 7b 0a 20 20 20 20 20 20 69  pOuter){.      i
1d410 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
1d420 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
1d430 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
1d440 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1d450 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74  ICmp(zName, pWit
1d460 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  h->a[i].zName)==
1d470 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
1d480 65 74 75 72 6e 20 26 70 57 69 74 68 2d 3e 61 5b  eturn &pWith->a[
1d490 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i];.        }.  
1d4a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1d4b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 76    return 0;.}..v
1d4c0 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 50  oid sqlite3WithP
1d4d0 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72 73  ush(Parse *pPars
1d4e0 65 2c 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b  e, With *pWith){
1d4f0 0a 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a  .  if( pWith ){.
1d500 20 20 20 20 70 57 69 74 68 2d 3e 70 4f 75 74 65      pWith->pOute
1d510 72 20 3d 20 70 50 61 72 73 65 2d 3e 70 57 69 74  r = pParse->pWit
1d520 68 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70  h;.    pParse->p
1d530 57 69 74 68 20 3d 20 70 57 69 74 68 3b 0a 20 20  With = pWith;.  
1d540 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
1d550 77 69 74 68 50 6f 70 28 50 61 72 73 65 20 2a 70  withPop(Parse *p
1d560 50 61 72 73 65 2c 20 57 69 74 68 20 2a 70 57 69  Parse, With *pWi
1d570 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68  th){.  if( pWith
1d580 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1d590 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3d 3d 70  pParse->pWith==p
1d5a0 57 69 74 68 20 29 3b 0a 20 20 20 20 70 50 61 72  With );.    pPar
1d5b0 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57 69 74  se->pWith = pWit
1d5c0 68 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d  h->pOuter;.  }.}
1d5d0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63 74 65  ..static int cte
1d5e0 50 75 73 68 28 50 61 72 73 65 20 2a 70 50 61 72  Push(Parse *pPar
1d5f0 73 65 2c 20 73 74 72 75 63 74 20 43 74 65 20 2a  se, struct Cte *
1d600 70 43 74 65 29 7b 0a 20 20 69 66 28 20 70 43 74  pCte){.  if( pCt
1d610 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
1d620 43 74 65 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Cte *p;.    for(
1d630 70 3d 70 50 61 72 73 65 2d 3e 70 43 74 65 3b 20  p=pParse->pCte; 
1d640 70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 43 74  p; p=p->pOuterCt
1d650 65 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 3d  e){.      if( p=
1d660 3d 70 43 74 65 20 29 7b 0a 20 20 20 20 20 20 20  =pCte ){.       
1d670 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1d680 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
1d690 61 72 73 65 2c 20 22 69 6c 6c 65 67 61 6c 20 72  arse, "illegal r
1d6a0 65 63 75 72 73 69 76 65 20 64 65 66 69 6e 69 6e  ecursive definin
1d6b0 69 74 69 6f 6e 20 69 6e 20 63 74 65 3a 20 25 73  ition in cte: %s
1d6c0 22 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 0a 20  ", pCte->zName. 
1d6d0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1d6e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d6f0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
1d700 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 70 43     }.    .    pC
1d710 74 65 2d 3e 70 4f 75 74 65 72 43 74 65 20 3d 20  te->pOuterCte = 
1d720 70 50 61 72 73 65 2d 3e 70 43 74 65 3b 0a 20 20  pParse->pCte;.  
1d730 20 20 70 50 61 72 73 65 2d 3e 70 43 74 65 20 3d    pParse->pCte =
1d740 20 70 43 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74   pCte;.  }.  ret
1d750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d760 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 74  ..static void ct
1d770 65 50 6f 70 28 50 61 72 73 65 20 2a 70 50 61 72  ePop(Parse *pPar
1d780 73 65 2c 20 73 74 72 75 63 74 20 43 74 65 20 2a  se, struct Cte *
1d790 70 43 74 65 29 7b 0a 20 20 69 66 28 20 70 43 74  pCte){.  if( pCt
1d7a0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1d7b0 20 70 50 61 72 73 65 2d 3e 70 43 74 65 3d 3d 70   pParse->pCte==p
1d7c0 43 74 65 20 29 3b 0a 20 20 20 20 70 50 61 72 73  Cte );.    pPars
1d7d0 65 2d 3e 70 43 74 65 20 3d 20 70 43 74 65 2d 3e  e->pCte = pCte->
1d7e0 70 4f 75 74 65 72 43 74 65 3b 0a 20 20 7d 0a 7d  pOuterCte;.  }.}
1d7f0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
1d800 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
1d810 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
1d820 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
1d830 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
1d840 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
1d850 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
1d860 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
1d870 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
1d880 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1d890 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
1d8a0 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
1d8b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
1d8c0 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
1d8d0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
1d8e0 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
1d8f0 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
1d900 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
1d910 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
1d920 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
1d930 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
1d940 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
1d950 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
1d960 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
1d970 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
1d980 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
1d990 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
1d9a0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1d9b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
1d9c0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
1d9d0 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
1d9e0 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
1d9f0 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
1da00 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
1da10 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
1da20 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
1da30 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
1da40 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
1da50 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
1da60 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
1da70 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
1da80 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
1da90 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
1daa0 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
1dab0 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
1dac0 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
1dad0 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
1dae0 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
1daf0 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
1db00 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
1db10 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
1db20 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
1db30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
1db40 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
1db50 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1db60 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
1db70 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
1db80 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
1db90 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
1dba0 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
1dbb0 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
1dbc0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
1dbd0 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
1dbe0 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
1dbf0 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
1dc00 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
1dc10 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
1dc20 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
1dc30 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
1dc40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1dc50 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
1dc60 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
1dc70 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
1dc80 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
1dc90 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
1dca0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
1dcb0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
1dcc0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1dcd0 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
1dce0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
1dcf0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1dd00 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1dd10 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67   Expr *pE, *pRig
1dd20 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31  ht, *pExpr;.  u1
1dd30 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  6 selFlags = p->
1dd40 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e  selFlags;..  p->
1dd50 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
1dd60 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64  xpanded;.  if( d
1dd70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1dd80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
1dd90 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
1dda0 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72  if( NEVER(p->pSr
1ddb0 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61  c==0) || (selFla
1ddc0 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
1ddd0 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1dde0 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
1ddf0 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
1de00 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
1de10 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   = p->pEList;.. 
1de20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 63 75   /* Make sure cu
1de30 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 68 61 76  rsor numbers hav
1de40 65 20 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20  e been assigned 
1de50 74 6f 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  to all entries i
1de60 6e 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f 4d 20  n.  ** the FROM 
1de70 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 53 45  clause of the SE
1de80 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a  LECT statement..
1de90 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 53 72    */.  sqlite3Sr
1dea0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1deb0 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  rs(pParse, pTabL
1dec0 69 73 74 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ist);..  /* Look
1ded0 20 75 70 20 65 76 65 72 79 20 74 61 62 6c 65 20   up every table 
1dee0 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f  named in the FRO
1def0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1df00 73 65 6c 65 63 74 2e 20 20 49 66 0a 20 20 2a 2a  select.  If.  **
1df10 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
1df20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
1df30 61 20 73 75 62 71 75 65 72 79 20 69 6e 73 74 65  a subquery inste
1df40 61 64 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ad of a table or
1df50 20 76 69 65 77 2c 0a 20 20 2a 2a 20 74 68 65 6e   view,.  ** then
1df60 20 63 72 65 61 74 65 20 61 20 74 72 61 6e 73 69   create a transi
1df70 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75 63 74  ent table struct
1df80 75 72 65 20 74 6f 20 64 65 73 63 72 69 62 65 20  ure to describe 
1df90 74 68 65 20 73 75 62 71 75 65 72 79 2e 0a 20 20  the subquery..  
1dfa0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46  */.  for(i=0, pF
1dfb0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1dfc0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1dfd0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1dfe0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 43 74 65  {.    struct Cte
1dff0 20 2a 70 43 74 65 20 3d 20 30 3b 0a 20 20 20 20   *pCte = 0;.    
1e000 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
1e010 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62   if( pFrom->pTab
1e020 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  !=0 ){.      /* 
1e030 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 68  This statement h
1e040 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1e050 70 72 65 70 61 72 65 64 2e 20 20 54 68 65 72 65  prepared.  There
1e060 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20 20   is no need.    
1e070 20 20 2a 2a 20 74 6f 20 67 6f 20 66 75 72 74 68    ** to go furth
1e080 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  er. */.      ass
1e090 65 72 74 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20  ert( i==0 );.   
1e0a0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
1e0b0 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  une;.    }.#ifnd
1e0c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
1e0d0 54 45 0a 20 20 20 20 70 43 74 65 20 3d 20 73 65  TE.    pCte = se
1e0e0 61 72 63 68 57 69 74 68 28 70 50 61 72 73 65 2c  archWith(pParse,
1e0f0 20 70 46 72 6f 6d 29 3b 0a 20 20 20 20 69 66 28   pFrom);.    if(
1e100 20 70 43 74 65 20 29 7b 0a 20 20 20 20 20 20 70   pCte ){.      p
1e110 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20  From->pSelect = 
1e120 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
1e130 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65  (db, pCte->pSele
1e140 63 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ct, 0);.      if
1e150 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
1e160 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1e170 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 23 65  _Abort;.    }.#e
1e180 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 72  ndif.    if( pFr
1e190 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20  om->zName==0 || 
1e1a0 70 43 74 65 20 29 7b 0a 23 69 66 6e 64 65 66 20  pCte ){.#ifndef 
1e1b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
1e1c0 55 45 52 59 0a 20 20 20 20 20 20 45 78 70 72 4c  UERY.      ExprL
1e1d0 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
1e1e0 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
1e1f0 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  = pFrom->pSelect
1e200 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62  ;.      /* A sub
1e210 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46 52  -query in the FR
1e220 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  OM clause of a S
1e230 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20 61  ELECT */.      a
1e240 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30 20 29  ssert( pSel!=0 )
1e250 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1e260 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
1e270 3b 0a 20 20 20 20 20 20 69 66 28 20 63 74 65 50  ;.      if( cteP
1e280 75 73 68 28 70 50 61 72 73 65 2c 20 70 43 74 65  ush(pParse, pCte
1e290 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
1e2a0 62 6f 72 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  bort;.      sqli
1e2b0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
1e2c0 61 6c 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20  alker, pSel);.  
1e2d0 20 20 20 20 63 74 65 50 6f 70 28 70 50 61 72 73      ctePop(pPars
1e2e0 65 2c 20 70 43 74 65 29 3b 0a 20 20 20 20 20 20  e, pCte);.      
1e2f0 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54  pFrom->pTab = pT
1e300 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ab = sqlite3DbMa
1e310 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1e320 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 20  eof(Table));.   
1e330 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
1e340 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
1e350 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e  t;.      pTab->n
1e360 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  Ref = 1;.      p
1e370 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  Tab->zName = sql
1e380 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
1e390 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22 2c 20  "sqlite_sq_%p", 
1e3a0 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a 20 20  (void*)pTab);.  
1e3b0 20 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d      while( pSel-
1e3c0 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65 6c 20  >pPrior ){ pSel 
1e3d0 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 20  = pSel->pPrior; 
1e3e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 65  }.      if( pCte
1e3f0 20 26 26 20 70 43 74 65 2d 3e 70 43 6f 6c 73 20   && pCte->pCols 
1e400 29 7b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73  ){.        pELis
1e410 74 20 3d 20 70 43 74 65 2d 3e 70 43 6f 6c 73 3b  t = pCte->pCols;
1e420 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e430 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
1e440 53 65 6c 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  Sel->pEList;.   
1e450 20 20 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63     }.      selec
1e460 74 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  tColumnsFromExpr
1e470 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 45 4c  List(pParse, pEL
1e480 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f 6c  ist, &pTab->nCol
1e490 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a  , &pTab->aCol);.
1e4a0 20 20 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65        pTab->iPKe
1e4b0 79 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 54  y = -1;.      pT
1e4c0 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30  ab->nRowEst = 10
1e4d0 34 38 35 37 36 3b 0a 20 20 20 20 20 20 70 54 61  48576;.      pTa
1e4e0 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
1e4f0 46 5f 45 70 68 65 6d 65 72 61 6c 3b 0a 23 65 6e  F_Ephemeral;.#en
1e500 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
1e510 20 20 20 20 20 2f 2a 20 41 6e 20 6f 72 64 69 6e       /* An ordin
1e520 61 72 79 20 74 61 62 6c 65 20 6f 72 20 76 69 65  ary table or vie
1e530 77 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 46 52  w name in the FR
1e540 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OM clause */.   
1e550 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
1e560 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  ->pTab==0 );.   
1e570 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d     pFrom->pTab =
1e580 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c   pTab = sqlite3L
1e590 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70  ocateTableItem(p
1e5a0 50 61 72 73 65 2c 20 30 2c 20 70 46 72 6f 6d 29  Parse, 0, pFrom)
1e5b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
1e5c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1e5d0 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 69 66  _Abort;.      if
1e5e0 28 20 70 54 61 62 2d 3e 6e 52 65 66 3d 3d 30 78  ( pTab->nRef==0x
1e5f0 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
1e600 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1e610 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
1e620 79 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  y references to 
1e630 5c 22 25 73 5c 22 3a 20 6d 61 78 20 36 35 35 33  \"%s\": max 6553
1e640 35 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  5",.           p
1e650 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
1e660 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62       pFrom->pTab
1e670 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
1e680 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
1e690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 54        }.      pT
1e6a0 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 23 69 66 20  ab->nRef++;.#if 
1e6b0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1e6c0 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
1e6d0 65 66 69 6e 65 64 20 28 53 51 4c 49 54 45 5f 4f  efined (SQLITE_O
1e6e0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1e6f0 29 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ).      if( pTab
1e700 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 49 73 56  ->pSelect || IsV
1e710 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
1e720 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 72 65          /* We re
1e730 61 63 68 20 68 65 72 65 20 69 66 20 74 68 65 20  ach here if the 
1e740 6e 61 6d 65 64 20 74 61 62 6c 65 20 69 73 20 61  named table is a
1e750 20 72 65 61 6c 6c 79 20 61 20 76 69 65 77 20 2a   really a view *
1e760 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  /.        if( sq
1e770 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75  lite3ViewGetColu
1e780 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
1e790 70 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 57  pTab) ) return W
1e7a0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
1e7b0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
1e7c0 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  >pSelect==0 );. 
1e7d0 20 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70 53         pFrom->pS
1e7e0 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
1e7f0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
1e800 62 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  b->pSelect, 0);.
1e810 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1e820 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
1e830 72 2c 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63  r, pFrom->pSelec
1e840 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  t);.      }.#end
1e850 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
1e860 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65   Locate the inde
1e870 78 20 6e 61 6d 65 64 20 62 79 20 74 68 65 20 49  x named by the I
1e880 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1e890 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 20  , if any. */.   
1e8a0 20 69 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65   if( sqlite3Inde
1e8b0 78 65 64 42 79 4c 6f 6f 6b 75 70 28 70 50 61 72  xedByLookup(pPar
1e8c0 73 65 2c 20 70 46 72 6f 6d 29 20 29 7b 0a 20 20  se, pFrom) ){.  
1e8d0 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
1e8e0 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  bort;.    }.  }.
1e8f0 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 4e 41  .  /* Process NA
1e900 54 55 52 41 4c 20 6b 65 79 77 6f 72 64 73 2c 20  TURAL keywords, 
1e910 61 6e 64 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  and ON and USING
1e920 20 63 6c 61 75 73 65 73 20 6f 66 20 6a 6f 69 6e   clauses of join
1e930 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
1e940 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
1e950 7c 20 73 71 6c 69 74 65 50 72 6f 63 65 73 73 4a  | sqliteProcessJ
1e960 6f 69 6e 28 70 50 61 72 73 65 2c 20 70 29 20 29  oin(pParse, p) )
1e970 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
1e980 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f  _Abort;.  }..  /
1e990 2a 20 46 6f 72 20 65 76 65 72 79 20 22 2a 22 20  * For every "*" 
1e9a0 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 74  that occurs in t
1e9b0 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20  he column list, 
1e9c0 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
1e9d0 20 6f 66 0a 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c   of.  ** all col
1e9e0 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c  umns in all tabl
1e9f0 65 73 2e 20 20 41 6e 64 20 66 6f 72 20 65 76 65  es.  And for eve
1ea00 72 79 20 54 41 42 4c 45 2e 2a 20 69 6e 73 65 72  ry TABLE.* inser
1ea10 74 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a  t the names.  **
1ea20 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20   of all columns 
1ea30 69 6e 20 54 41 42 4c 45 2e 20 20 54 68 65 20 70  in TABLE.  The p
1ea40 61 72 73 65 72 20 69 6e 73 65 72 74 65 64 20 61  arser inserted a
1ea50 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73   special express
1ea60 69 6f 6e 0a 20 20 2a 2a 20 77 69 74 68 20 74 68  ion.  ** with th
1ea70 65 20 54 4b 5f 41 4c 4c 20 6f 70 65 72 61 74 6f  e TK_ALL operato
1ea80 72 20 66 6f 72 20 65 61 63 68 20 22 2a 22 20 74  r for each "*" t
1ea90 68 61 74 20 69 74 20 66 6f 75 6e 64 20 69 6e 20  hat it found in 
1eaa0 74 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e  the column list.
1eab0 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  ** The follow
1eac0 69 6e 67 20 63 6f 64 65 20 6a 75 73 74 20 68 61  ing code just ha
1ead0 73 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  s to locate the 
1eae0 54 4b 5f 41 4c 4c 20 65 78 70 72 65 73 73 69 6f  TK_ALL expressio
1eaf0 6e 73 20 61 6e 64 20 65 78 70 61 6e 64 0a 20 20  ns and expand.  
1eb00 2a 2a 20 65 61 63 68 20 6f 6e 65 20 74 6f 20 74  ** each one to t
1eb10 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63  he list of all c
1eb20 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c 20 74 61  olumns in all ta
1eb30 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  bles..  **.  ** 
1eb40 54 68 65 20 66 69 72 73 74 20 6c 6f 6f 70 20 6a  The first loop j
1eb50 75 73 74 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ust checks to se
1eb60 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
1eb70 6e 79 20 22 2a 22 20 6f 70 65 72 61 74 6f 72 73  ny "*" operators
1eb80 0a 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 20  .  ** that need 
1eb90 65 78 70 61 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a  expanding..  */.
1eba0 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c    for(k=0; k<pEL
1ebb0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29  ist->nExpr; k++)
1ebc0 7b 0a 20 20 20 20 70 45 20 3d 20 70 45 4c 69 73  {.    pE = pELis
1ebd0 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20  t->a[k].pExpr;. 
1ebe0 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54     if( pE->op==T
1ebf0 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a 20  K_ALL ) break;. 
1ec00 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f     assert( pE->o
1ec10 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d  p!=TK_DOT || pE-
1ec20 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
1ec30 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e 6f 70    assert( pE->op
1ec40 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70 45 2d  !=TK_DOT || (pE-
1ec50 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70 45 2d  >pLeft!=0 && pE-
1ec60 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pLeft->op==TK_I
1ec70 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45  D) );.    if( pE
1ec80 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26 26 20  ->op==TK_DOT && 
1ec90 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  pE->pRight->op==
1eca0 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b 0a  TK_ALL ) break;.
1ecb0 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45 4c 69    }.  if( k<pELi
1ecc0 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
1ecd0 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 77 65   /*.    ** If we
1ece0 20 67 65 74 20 68 65 72 65 20 69 74 20 6d 65 61   get here it mea
1ecf0 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ns the result se
1ed00 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f  t contains one o
1ed10 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20 20 2a  r more "*".    *
1ed20 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  * operators that
1ed30 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78 70 61   need to be expa
1ed40 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68 72 6f  nded.  Loop thro
1ed50 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
1ed60 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ion.    ** in th
1ed70 65 20 72 65 73 75 6c 74 20 73 65 74 20 61 6e 64  e result set and
1ed80 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f 6e 65   expand them one
1ed90 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2f 0a   by one..    */.
1eda0 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
1edb0 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20 70 45  ist_item *a = pE
1edc0 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45 78 70  List->a;.    Exp
1edd0 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20 30 3b  rList *pNew = 0;
1ede0 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
1edf0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1ee00 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 6e 67  gs;.    int long
1ee10 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73 20 26  Names = (flags &
1ee20 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e   SQLITE_FullColN
1ee30 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20 20 20  ames)!=0.       
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1ee50 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  & (flags & SQLIT
1ee60 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
1ee70 3d 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65  ==0;..    /* Whe
1ee80 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 46 52 4f  n processing FRO
1ee90 4d 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72  M-clause subquer
1eea0 69 65 73 2c 20 69 74 20 69 73 20 61 6c 77 61 79  ies, it is alway
1eeb0 73 20 74 68 65 20 63 61 73 65 0a 20 20 20 20 2a  s the case.    *
1eec0 2a 20 74 68 61 74 20 66 75 6c 6c 5f 63 6f 6c 75  * that full_colu
1eed0 6d 6e 5f 6e 61 6d 65 73 3d 4f 46 46 20 61 6e 64  mn_names=OFF and
1eee0 20 73 68 6f 72 74 5f 63 6f 6c 75 6d 6e 5f 6e 61   short_column_na
1eef0 6d 65 73 3d 4f 4e 2e 20 20 54 68 65 0a 20 20 20  mes=ON.  The.   
1ef00 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 75 6c   ** sqlite3Resul
1ef10 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 72  tSetOfSelect() r
1ef20 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 20  outine makes it 
1ef30 73 6f 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  so. */.    asser
1ef40 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
1ef50 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
1ef60 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  ==0.          ||
1ef70 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54   ((flags & SQLIT
1ef80 45 5f 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 29 3d  E_FullColNames)=
1ef90 3d 30 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  =0 &&.          
1efa0 20 20 20 20 28 66 6c 61 67 73 20 26 20 53 51 4c      (flags & SQL
1efb0 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
1efc0 73 29 21 3d 30 29 20 29 3b 0a 0a 20 20 20 20 66  s)!=0) );..    f
1efd0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74  or(k=0; k<pEList
1efe0 2d 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20  ->nExpr; k++){. 
1eff0 20 20 20 20 20 70 45 20 3d 20 61 5b 6b 5d 2e 70       pE = a[k].p
1f000 45 78 70 72 3b 0a 20 20 20 20 20 20 70 52 69 67  Expr;.      pRig
1f010 68 74 20 3d 20 70 45 2d 3e 70 52 69 67 68 74 3b  ht = pE->pRight;
1f020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1f030 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
1f040 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
1f050 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 21 3d      if( pE->op!=
1f060 54 4b 5f 41 4c 4c 20 26 26 20 28 70 45 2d 3e 6f  TK_ALL && (pE->o
1f070 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70 52 69  p!=TK_DOT || pRi
1f080 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
1f090 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1f0a0 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
1f0b0 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
1f0c0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
1f0d0 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
1f0e0 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
1f0f0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1f100 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1f110 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
1f120 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1f130 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
1f140 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
1f150 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
1f160 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
1f170 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
1f180 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70  ew->nExpr-1].zSp
1f190 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b  an = a[k].zSpan;
1f1a0 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
1f1b0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
1f1c0 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20       a[k].zSpan 
1f1d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1f1e0 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
1f1f0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 0;.      }el
1f200 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
1f210 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
1f220 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
1f230 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
1f240 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
1f250 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
1f260 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
1f270 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
1f280 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
1f290 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
1f2a0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
1f2b0 54 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20  TName = 0;      
1f2c0 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d 65   /* text of name
1f2d0 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20 20   of TABLE */.   
1f2e0 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d       if( pE->op=
1f2f0 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
1f300 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d       assert( pE-
1f310 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20  >pLeft!=0 );.   
1f320 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1f330 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1f340 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49 6e  pE->pLeft, EP_In
1f350 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20  tValue) );.     
1f360 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70 45       zTName = pE
1f370 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
1f380 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
1f390 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 46       for(i=0, pF
1f3a0 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b  rom=pTabList->a;
1f3b0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
1f3c0 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29  c; i++, pFrom++)
1f3d0 7b 0a 20 20 20 20 20 20 20 20 20 20 54 61 62 6c  {.          Tabl
1f3e0 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1f3f0 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20  >pTab;.         
1f400 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
1f410 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pFrom->pSelect;.
1f420 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1f430 7a 54 61 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d  zTabName = pFrom
1f440 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
1f450 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1f460 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20 30 3b  zSchemaName = 0;
1f470 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1f480 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  Db;.          if
1f490 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 29 7b  ( zTabName==0 ){
1f4a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 61  .            zTa
1f4b0 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
1f4c0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ame;.          }
1f4d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
1f4e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1f4f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
1f500 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20 7c     if( pSub==0 |
1f510 7c 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  | (pSub->selFlag
1f520 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f  s & SF_NestedFro
1f530 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
1f540 20 20 20 20 20 70 53 75 62 20 3d 20 30 3b 0a 20       pSub = 0;. 
1f550 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a             if( z
1f560 54 4e 61 6d 65 20 26 26 20 73 71 6c 69 74 65 33  TName && sqlite3
1f570 53 74 72 49 43 6d 70 28 7a 54 4e 61 6d 65 2c 20  StrICmp(zTName, 
1f580 7a 54 61 62 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  zTabName)!=0 ){.
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1f5a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1f5b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f5c0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
1f5d0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
1f5e0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
1f5f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63  .            zSc
1f600 68 65 6d 61 4e 61 6d 65 20 3d 20 69 44 62 3e 3d  hemaName = iDb>=
1f610 30 20 3f 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  0 ? db->aDb[iDb]
1f620 2e 7a 4e 61 6d 65 20 3a 20 22 2a 22 3b 0a 20 20  .zName : "*";.  
1f630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f640 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1f650 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  Tab->nCol; j++){
1f660 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1f670 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  r *zName = pTab-
1f680 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  >aCol[j].zName;.
1f690 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
1f6a0 20 2a 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20   *zColname;  /* 
1f6b0 54 68 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c  The computed col
1f6c0 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  umn name */.    
1f6d0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
1f6e0 6f 46 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c  oFree;   /* Mall
1f6f0 6f 63 65 64 20 73 74 72 69 6e 67 20 74 68 61 74  oced string that
1f700 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
1f710 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ed */.          
1f720 20 20 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65    Token sColname
1f730 3b 20 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63  ;  /* Computed c
1f740 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20  olumn name as a 
1f750 74 6f 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  token */..      
1f760 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e        assert( zN
1f770 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ame );.         
1f780 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26     if( zTName &&
1f790 20 70 53 75 62 0a 20 20 20 20 20 20 20 20 20 20   pSub.          
1f7a0 20 20 20 26 26 20 73 71 6c 69 74 65 33 4d 61 74     && sqlite3Mat
1f7b0 63 68 53 70 61 6e 4e 61 6d 65 28 70 53 75 62 2d  chSpanName(pSub-
1f7c0 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  >pEList->a[j].zS
1f7d0 70 61 6e 2c 20 30 2c 20 7a 54 4e 61 6d 65 2c 20  pan, 0, zTName, 
1f7e0 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  0)==0.          
1f7f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
1f800 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1f810 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
1f820 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20          /* If a 
1f830 63 6f 6c 75 6d 6e 20 69 73 20 6d 61 72 6b 65 64  column is marked
1f840 20 61 73 20 27 68 69 64 64 65 6e 27 20 28 63 75   as 'hidden' (cu
1f850 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 70 6f 73  rrently only pos
1f860 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  sible.          
1f870 20 20 2a 2a 20 66 6f 72 20 76 69 72 74 75 61 6c    ** for virtual
1f880 20 74 61 62 6c 65 73 29 2c 20 64 6f 20 6e 6f 74   tables), do not
1f890 20 69 6e 63 6c 75 64 65 20 69 74 20 69 6e 20 74   include it in t
1f8a0 68 65 20 65 78 70 61 6e 64 65 64 0a 20 20 20 20  he expanded.    
1f8b0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 73 75 6c          ** resul
1f8c0 74 2d 73 65 74 20 6c 69 73 74 2e 0a 20 20 20 20  t-set list..    
1f8d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1f8e0 20 20 20 20 20 20 20 69 66 28 20 49 73 48 69 64         if( IsHid
1f8f0 64 65 6e 43 6f 6c 75 6d 6e 28 26 70 54 61 62 2d  denColumn(&pTab-
1f900 3e 61 43 6f 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20  >aCol[j]) ){.   
1f910 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1f920 74 28 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  t(IsVirtual(pTab
1f930 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
1f940 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1f950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f960 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e 20        tableSeen 
1f970 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
1f980 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54 4e    if( i>0 && zTN
1f990 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
1f9a0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46 72          if( (pFr
1f9b0 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  om->jointype & J
1f9c0 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20 20  T_NATURAL)!=0.  
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
1f9e0 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49   tableAndColumnI
1f9f0 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20 69  ndex(pTabList, i
1fa00 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a 20  , zName, 0, 0). 
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a               ){.
1fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa30 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c 20  /* In a NATURAL 
1fa40 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20 6a  join, omit the j
1fa50 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  oin columns from
1fa60 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20   the .          
1fa70 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 74        ** table t
1fa80 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74  o the right of t
1fa90 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20 20  he join */.     
1faa0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1fab0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1fac0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1fad0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 64     if( sqlite3Id
1fae0 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d 2d  ListIndex(pFrom-
1faf0 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29 3e  >pUsing, zName)>
1fb00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1fb10 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a 6f        /* In a jo
1fb20 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47 20  in with a USING 
1fb30 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f 6c  clause, omit col
1fb40 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20 20  umns in the.    
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75              ** u
1fb60 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f 6d  sing clause from
1fb70 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74 68   the table on th
1fb80 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1fba0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1fbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1fbc0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1fbd0 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
1fbe0 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20  Expr(db, TK_ID, 
1fbf0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
1fc00 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 7a      zColname = z
1fc10 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
1fc20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a 20    zToFree = 0;. 
1fc30 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c             if( l
1fc40 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61 62  ongNames || pTab
1fc50 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b 0a  List->nSrc>1 ){.
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
1fc70 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr *pLeft;.     
1fc80 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d           pLeft =
1fc90 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
1fca0 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d 65   TK_ID, zTabName
1fcb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1fcc0 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   pExpr = sqlite3
1fcd0 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
1fce0 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
1fcf0 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ght, 0);.       
1fd00 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68 65         if( zSche
1fd10 6d 61 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  maName ){.      
1fd20 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
1fd30 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1fd40 2c 20 54 4b 5f 49 44 2c 20 7a 53 63 68 65 6d 61  , TK_ID, zSchema
1fd50 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
1fd60 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73         pExpr = s
1fd70 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
1fd80 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66  se, TK_DOT, pLef
1fd90 74 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  t, pExpr, 0);.  
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1fdc0 6c 6f 6e 67 4e 61 6d 65 73 20 29 7b 0a 20 20 20  longNames ){.   
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
1fde0 6c 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  lname = sqlite3M
1fdf0 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25  Printf(db, "%s.%
1fe00 73 22 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e  s", zTabName, zN
1fe10 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
1fe20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d 20        zToFree = 
1fe30 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20  zColname;.      
1fe40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1fe50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1fe60 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1fe70 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20   = pRight;.     
1fe80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fe90 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
1fea0 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
1feb0 64 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  d(pParse, pNew, 
1fec0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
1fed0 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d      sColname.z =
1fee0 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20 20 20 20 20   zColname;.     
1fef0 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d 65 2e         sColname.
1ff00 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
1ff10 6e 33 30 28 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20  n30(zColname);. 
1ff20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1ff30 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
1ff40 65 28 70 50 61 72 73 65 2c 20 70 4e 65 77 2c 20  e(pParse, pNew, 
1ff50 26 73 43 6f 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20  &sColname, 0);. 
1ff60 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1ff70 4e 65 77 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  New && (p->selFl
1ff80 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
1ff90 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
1ffa0 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
1ffb0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1ffc0 58 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 70 4e 65  X = &pNew->a[pNe
1ffd0 77 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20 20  w->nExpr-1];.   
1ffe0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
1fff0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Sub ){.         
20000 20 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e         pX->zSpan
20010 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
20020 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 45 4c  up(db, pSub->pEL
20030 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 29  ist->a[j].zSpan)
20040 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20050 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
20060 7a 53 70 61 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  zSpan==0 );.    
20070 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
20080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20090 20 70 58 2d 3e 7a 53 70 61 6e 20 3d 20 73 71 6c   pX->zSpan = sql
200a0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
200b0 22 25 73 2e 25 73 2e 25 73 22 2c 0a 20 20 20 20  "%s.%s.%s",.    
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200e0 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61 4e 61         zSchemaNa
200f0 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 7a 43  me, zTabName, zC
20100 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  olname);.       
20110 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
20120 65 28 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20  e( pX->zSpan==0 
20130 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
20140 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
20150 20 70 58 2d 3e 62 53 70 61 6e 49 73 54 61 62 20   pX->bSpanIsTab 
20160 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
20170 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   }.            s
20180 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20190 20 7a 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 20   zToFree);.     
201a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
201b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 61  .        if( !ta
201c0 62 6c 65 53 65 65 6e 20 29 7b 0a 20 20 20 20 20  bleSeen ){.     
201d0 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65 20       if( zTName 
201e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
201f0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
20200 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
20210 74 61 62 6c 65 3a 20 25 73 22 2c 20 7a 54 4e 61  table: %s", zTNa
20220 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  me);.          }
20230 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20240 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20250 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 74 61  g(pParse, "no ta
20260 62 6c 65 73 20 73 70 65 63 69 66 69 65 64 22 29  bles specified")
20270 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
20290 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
202a0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
202b0 64 62 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20  db, pEList);.   
202c0 20 70 2d 3e 70 45 4c 69 73 74 20 3d 20 70 4e 65   p->pEList = pNe
202d0 77 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  w;.  }.#if SQLIT
202e0 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69  E_MAX_COLUMN.  i
202f0 66 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26 20  f( p->pEList && 
20300 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
20310 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
20320 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
20330 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
20340 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
20350 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e  "too many column
20360 73 20 69 6e 20 72 65 73 75 6c 74 20 73 65 74 22  s in result set"
20370 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
20380 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
20390 6e 75 65 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  nue;.}..static i
203a0 6e 74 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65  nt selectExpande
203b0 72 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57  rWith(Walker *pW
203c0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
203d0 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
203e0 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
203f0 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c  pWalker->pParse,
20400 20 70 2d 3e 70 57 69 74 68 29 3b 0a 20 20 72 65   p->pWith);.  re
20410 73 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  s = selectExpand
20420 65 72 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a  er(pWalker, p);.
20430 20 20 77 69 74 68 50 6f 70 28 70 57 61 6c 6b 65    withPop(pWalke
20440 72 2d 3e 70 50 61 72 73 65 2c 20 70 2d 3e 70 57  r->pParse, p->pW
20450 69 74 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ith);.  return r
20460 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4e 6f 2d  es;.}../*.** No-
20470 6f 70 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 74  op routine for t
20480 68 65 20 70 61 72 73 65 2d 74 72 65 65 20 77 61  he parse-tree wa
20490 6c 6b 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  lker..**.** When
204a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
204b0 20 74 68 65 20 57 61 6c 6b 65 72 2e 78 45 78 70   the Walker.xExp
204c0 72 43 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 65  rCallback then e
204d0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 0a  xpression trees.
204e0 2a 2a 20 61 72 65 20 77 61 6c 6b 65 64 20 77 69  ** are walked wi
204f0 74 68 6f 75 74 20 61 6e 79 20 61 63 74 69 6f 6e  thout any action
20500 73 20 62 65 69 6e 67 20 74 61 6b 65 6e 20 61 74  s being taken at
20510 20 65 61 63 68 20 6e 6f 64 65 2e 20 20 50 72 65   each node.  Pre
20520 73 75 6d 61 62 6c 79 2c 0a 2a 2a 20 77 68 65 6e  sumably,.** when
20530 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
20540 20 75 73 65 64 20 66 6f 72 20 57 61 6c 6b 65 72   used for Walker
20550 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 74  .xExprCallback t
20560 68 65 6e 20 0a 2a 2a 20 57 61 6c 6b 65 72 2e 78  hen .** Walker.x
20570 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 69  SelectCallback i
20580 73 20 73 65 74 20 74 6f 20 64 6f 20 73 6f 6d 65  s set to do some
20590 74 68 69 6e 67 20 75 73 65 66 75 6c 20 66 6f 72  thing useful for
205a0 20 65 76 65 72 79 20 0a 2a 2a 20 73 75 62 71 75   every .** subqu
205b0 65 72 79 20 69 6e 20 74 68 65 20 70 61 72 73 65  ery in the parse
205c0 72 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69  r tree..*/.stati
205d0 63 20 69 6e 74 20 65 78 70 72 57 61 6c 6b 4e 6f  c int exprWalkNo
205e0 6f 70 28 57 61 6c 6b 65 72 20 2a 4e 6f 74 55 73  op(Walker *NotUs
205f0 65 64 2c 20 45 78 70 72 20 2a 4e 6f 74 55 73 65  ed, Expr *NotUse
20600 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
20610 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64  RAMETER2(NotUsed
20620 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72  , NotUsed2);.  r
20630 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e  eturn WRC_Contin
20640 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ue;.}../*.** Thi
20650 73 20 72 6f 75 74 69 6e 65 20 22 65 78 70 61 6e  s routine "expan
20660 64 73 22 20 61 20 53 45 4c 45 43 54 20 73 74 61  ds" a SELECT sta
20670 74 65 6d 65 6e 74 20 61 6e 64 20 61 6c 6c 20 6f  tement and all o
20680 66 20 69 74 73 20 73 75 62 71 75 65 72 69 65 73  f its subqueries
20690 2e 0a 2a 2a 20 46 6f 72 20 61 64 64 69 74 69 6f  ..** For additio
206a0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
206b0 6f 6e 20 77 68 61 74 20 69 74 20 6d 65 61 6e 73  on what it means
206c0 20 74 6f 20 22 65 78 70 61 6e 64 22 20 61 20 53   to "expand" a S
206d0 45 4c 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65  ELECT.** stateme
206e0 6e 74 2c 20 73 65 65 20 74 68 65 20 63 6f 6d 6d  nt, see the comm
206f0 65 6e 74 20 6f 6e 20 74 68 65 20 73 65 6c 65 63  ent on the selec
20700 74 45 78 70 61 6e 64 20 77 6f 72 6b 65 72 20 63  tExpand worker c
20710 61 6c 6c 62 61 63 6b 20 61 62 6f 76 65 2e 0a 2a  allback above..*
20720 2a 0a 2a 2a 20 45 78 70 61 6e 64 69 6e 67 20 61  *.** Expanding a
20730 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
20740 74 20 69 73 20 74 68 65 20 66 69 72 73 74 20 73  t is the first s
20750 74 65 70 20 69 6e 20 70 72 6f 63 65 73 73 69 6e  tep in processin
20760 67 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  g a.** SELECT st
20770 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 53 45  atement.  The SE
20780 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6d  LECT statement m
20790 75 73 74 20 62 65 20 65 78 70 61 6e 64 65 64 20  ust be expanded 
207a0 62 65 66 6f 72 65 0a 2a 2a 20 6e 61 6d 65 20 72  before.** name r
207b0 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 70 65 72  esolution is per
207c0 66 6f 72 6d 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  formed..**.** If
207d0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
207e0 72 6f 6e 67 2c 20 61 6e 20 65 72 72 6f 72 20 6d  rong, an error m
207f0 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74 65  essage is writte
20800 6e 20 69 6e 74 6f 20 70 50 61 72 73 65 2e 0a 2a  n into pParse..*
20810 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
20820 6e 63 74 69 6f 6e 20 63 61 6e 20 64 65 74 65 63  nction can detec
20830 74 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 62 79  t the problem by
20840 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 70 50 61 72   looking at pPar
20850 73 65 2d 3e 6e 45 72 72 0a 2a 2a 20 61 6e 64 2f  se->nErr.** and/
20860 6f 72 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  or pParse->db->m
20870 61 6c 6c 6f 63 46 61 69 6c 65 64 2e 0a 2a 2f 0a  allocFailed..*/.
20880 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
20890 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
208a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
208b0 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
208c0 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
208d0 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
208e0 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78  eof(w));.  w.xEx
208f0 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
20900 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
20910 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
20920 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 68 61    if( pParse->ha
20930 73 43 6f 6d 70 6f 75 6e 64 20 29 7b 0a 20 20 20  sCompound ){.   
20940 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
20950 63 6b 20 3d 20 63 6f 6e 76 65 72 74 43 6f 6d 70  ck = convertComp
20960 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
20970 75 65 72 79 3b 0a 20 20 20 20 73 71 6c 69 74 65  uery;.    sqlite
20980 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
20990 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20  pSelect);.  }.  
209a0 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
209b0 6b 20 3d 20 73 65 6c 65 63 74 45 78 70 61 6e 64  k = selectExpand
209c0 65 72 57 69 74 68 3b 0a 20 20 73 71 6c 69 74 65  erWith;.  sqlite
209d0 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
209e0 70 53 65 6c 65 63 74 29 3b 0a 7d 0a 0a 0a 23 69  pSelect);.}...#i
209f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20a00 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a 2a 2a  T_SUBQUERY./*.**
20a10 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b 65   This is a Walke
20a20 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
20a30 6b 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  k callback for t
20a40 68 65 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  he sqlite3Select
20a50 54 79 70 65 49 6e 66 6f 28 29 0a 2a 2a 20 69 6e  TypeInfo().** in
20a60 74 65 72 66 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 46  terface..**.** F
20a70 6f 72 20 65 61 63 68 20 46 52 4f 4d 2d 63 6c 61  or each FROM-cla
20a80 75 73 65 20 73 75 62 71 75 65 72 79 2c 20 61 64  use subquery, ad
20a90 64 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 20 61  d Column.zType a
20aa0 6e 64 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a  nd Column.zColl.
20ab0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ** information t
20ac0 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
20ad0 63 74 75 72 65 20 74 68 61 74 20 72 65 70 72 65  cture that repre
20ae0 73 65 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74  sents the result
20af0 20 73 65 74 0a 2a 2a 20 6f 66 20 74 68 61 74 20   set.** of that 
20b00 73 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20  subquery..**.** 
20b10 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
20b20 75 72 65 20 74 68 61 74 20 72 65 70 72 65 73 65  ure that represe
20b30 6e 74 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  nts the result s
20b40 65 74 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  et was construct
20b50 65 64 0a 2a 2a 20 62 79 20 73 65 6c 65 63 74 45  ed.** by selectE
20b60 78 70 61 6e 64 65 72 28 29 20 62 75 74 20 74 68  xpander() but th
20b70 65 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61  e type and colla
20b80 74 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tion information
20b90 20 77 61 73 20 6f 6d 69 74 74 65 64 0a 2a 2a 20   was omitted.** 
20ba0 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 62 65  at that point be
20bb0 63 61 75 73 65 20 69 64 65 6e 74 69 66 69 65 72  cause identifier
20bc0 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20 62 65  s had not yet be
20bd0 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 54 68  en resolved.  Th
20be0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
20bf0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 69 64   called after id
20c00 65 6e 74 69 66 69 65 72 20 72 65 73 6f 6c 75 74  entifier resolut
20c10 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
20c20 6e 74 20 73 65 6c 65 63 74 41 64 64 53 75 62 71  nt selectAddSubq
20c30 75 65 72 79 54 79 70 65 49 6e 66 6f 28 57 61 6c  ueryTypeInfo(Wal
20c40 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
20c50 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
20c60 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  e *pParse;.  int
20c70 20 69 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   i;.  SrcList *p
20c80 54 61 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  TabList;.  struc
20c90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
20ca0 70 46 72 6f 6d 3b 0a 0a 20 20 61 73 73 65 72 74  pFrom;..  assert
20cb0 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
20cc0 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20  SF_Resolved );. 
20cd0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
20ce0 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
20cf0 66 6f 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  fo)==0 ){.    p-
20d00 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
20d10 48 61 73 54 79 70 65 49 6e 66 6f 3b 0a 20 20 20  HasTypeInfo;.   
20d20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65   pParse = pWalke
20d30 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 70  r->pParse;.    p
20d40 54 61 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  TabList = p->pSr
20d50 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  c;.    for(i=0, 
20d60 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  pFrom=pTabList->
20d70 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
20d80 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72 6f 6d 2b  Src; i++, pFrom+
20d90 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  +){.      Table 
20da0 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pTab = pFrom->p
20db0 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 41  Tab;.      if( A
20dc0 4c 57 41 59 53 28 70 54 61 62 21 3d 30 29 20 26  LWAYS(pTab!=0) &
20dd0 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  & (pTab->tabFlag
20de0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
20df0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
20e00 2f 2a 20 41 20 73 75 62 2d 71 75 65 72 79 20 69  /* A sub-query i
20e10 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
20e20 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 2a 2f  e of a SELECT */
20e30 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
20e40 2a 70 53 65 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSel = pFrom->p
20e50 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
20e60 61 73 73 65 72 74 28 20 70 53 65 6c 20 29 3b 0a  assert( pSel );.
20e70 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
20e80 53 65 6c 2d 3e 70 50 72 69 6f 72 20 29 20 70 53  Sel->pPrior ) pS
20e90 65 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f  el = pSel->pPrio
20ea0 72 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63  r;.        selec
20eb0 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e  tAddColumnTypeAn
20ec0 64 43 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73  dCollation(pPars
20ed0 65 2c 20 70 54 61 62 2c 20 70 53 65 6c 29 3b 0a  e, pTab, pSel);.
20ee0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20ef0 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
20f00 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69  ontinue;.}.#endi
20f10 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
20f20 6f 75 74 69 6e 65 20 61 64 64 73 20 64 61 74 61  outine adds data
20f30 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69  type and collati
20f40 6e 67 20 73 65 71 75 65 6e 63 65 20 69 6e 66 6f  ng sequence info
20f50 72 6d 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68  rmation to.** th
20f60 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
20f70 65 73 20 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63  es of all FROM-c
20f80 6c 61 75 73 65 20 73 75 62 71 75 65 72 69 65 73  lause subqueries
20f90 20 69 6e 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20   in a.** SELECT 
20fa0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
20fb0 20 55 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   Use this routin
20fc0 65 20 61 66 74 65 72 20 6e 61 6d 65 20 72 65 73  e after name res
20fd0 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  olution..*/.stat
20fe0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53  ic void sqlite3S
20ff0 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f  electAddTypeInfo
21000 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21010 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29  Select *pSelect)
21020 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
21030 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
21040 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d 65 6d   Walker w;.  mem
21050 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
21060 66 28 77 29 29 3b 0a 20 20 77 2e 78 53 65 6c 65  f(w));.  w.xSele
21070 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c  ctCallback = sel
21080 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79  ectAddSubqueryTy
21090 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70  peInfo;.  w.xExp
210a0 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
210b0 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50  WalkNoop;.  w.pP
210c0 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
210d0 20 77 2e 62 53 65 6c 65 63 74 44 65 70 74 68 46   w.bSelectDepthF
210e0 69 72 73 74 20 3d 20 31 3b 0a 20 20 73 71 6c 69  irst = 1;.  sqli
210f0 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
21100 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65 6e 64  , pSelect);.#end
21110 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  if.}.../*.** Thi
21120 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
21130 70 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  p a SELECT state
21140 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65 73 73  ment for process
21150 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66 6f 6c  ing.  The.** fol
21160 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f 6d 70  lowing is accomp
21170 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  lished:.**.**   
21180 20 20 2a 20 20 56 44 42 45 20 43 75 72 73 6f 72    *  VDBE Cursor
21190 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 73 73   numbers are ass
211a0 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46 52 4f  igned to all FRO
211b0 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73 2e 0a  M-clause terms..
211c0 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65 6d 65  **     *  Epheme
211d0 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
211e0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 66 6f  s are created fo
211f0 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  r all FROM-claus
21200 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a  e subqueries..**
21210 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64 20 55       *  ON and U
21220 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65  SING clauses are
21230 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20 57 48   shifted into WH
21240 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  ERE statements.*
21250 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63 61 72  *     *  Wildcar
21260 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41 42 4c  ds "*" and "TABL
21270 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74 20 73  E.*" in result s
21280 65 74 73 20 61 72 65 20 65 78 70 61 6e 64 65 64  ets are expanded
21290 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64 65 6e  ..**     *  Iden
212a0 74 69 66 69 65 72 73 20 69 6e 20 65 78 70 72 65  tifiers in expre
212b0 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63 68 65  ssion are matche
212c0 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a 2a 0a  d to tables..**.
212d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
212e0 61 63 74 73 20 72 65 63 75 72 73 69 76 65 6c 79  acts recursively
212f0 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   on all subqueri
21300 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 53 45  es within the SE
21310 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
21320 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
21330 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
21340 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
21350 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
21360 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
21370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21380 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
21390 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e  ent being coded.
213a0 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
213b0 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20  t *pOuterNC  /* 
213c0 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
213d0 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a 29 7b   container */.){
213e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
213f0 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30    if( NEVER(p==0
21400 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62  ) ) return;.  db
21410 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
21420 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
21430 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
21440 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
21450 73 20 26 20 53 46 5f 48 61 73 54 79 70 65 49 6e  s & SF_HasTypeIn
21460 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  fo ) return;.  s
21470 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
21480 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  nd(pParse, p);. 
21490 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
214a0 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
214b0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
214c0 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
214d0 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
214e0 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
214f0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
21500 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
21510 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
21520 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  n;.  sqlite3Sele
21530 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 70 50  ctAddTypeInfo(pP
21540 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  arse, p);.}../*.
21550 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61 67 67  ** Reset the agg
21560 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
21570 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 67  or..**.** The ag
21580 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61  gregate accumula
21590 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f 66 20  tor is a set of 
215a0 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74 68 61  memory cells tha
215b0 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65 72 6d  t hold.** interm
215c0 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 20 77  ediate results w
215d0 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69 6e 67  hile calculating
215e0 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e 20 20   an aggregate.  
215f0 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
21600 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
21610 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c 4c 73  hat stores NULLs
21620 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f 73 65   in all of those
21630 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c 6c 73   memory.** cells
21640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
21650 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
21660 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
21670 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e   AggInfo *pAggIn
21680 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  fo){.  Vdbe *v =
21690 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
216a0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
216b0 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
216c0 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e 52 65  pFunc;.  int nRe
216d0 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  g = pAggInfo->nF
216e0 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f 2d 3e  unc + pAggInfo->
216f0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 6e  nColumn;.  if( n
21700 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Reg==0 ) return;
21710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
21720 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69 66 79  EBUG.  /* Verify
21730 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49 6e 66   that all AggInf
21740 6f 20 72 65 67 69 73 74 65 72 73 20 61 72 65 20  o registers are 
21750 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e 67 65  within the range
21760 20 73 70 65 63 69 66 69 65 64 20 62 79 0a 20 20   specified by.  
21770 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67  ** AggInfo.mnReg
21780 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20  ..AggInfo.mxReg 
21790 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  */.  assert( nRe
217a0 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 78 52  g==pAggInfo->mxR
217b0 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52  eg-pAggInfo->mnR
217c0 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  eg+1 );.  for(i=
217d0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
217e0 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
217f0 20 20 61 73 73 65 72 74 28 20 70 41 67 67 49 6e    assert( pAggIn
21800 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d 65 6d  fo->aCol[i].iMem
21810 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65  >=pAggInfo->mnRe
21820 67 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 41  g.         && pA
21830 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e  ggInfo->aCol[i].
21840 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem<=pAggInfo->
21850 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20 20 66  mxReg );.  }.  f
21860 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e  or(i=0; i<pAggIn
21870 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b  fo->nFunc; i++){
21880 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67  .    assert( pAg
21890 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 2e  gInfo->aFunc[i].
218a0 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  iMem>=pAggInfo->
218b0 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20 20 26  mnReg.         &
218c0 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e  & pAggInfo->aFun
218d0 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49  c[i].iMem<=pAggI
218e0 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20  nfo->mxReg );.  
218f0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
21900 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
21910 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41 67 67  OP_Null, 0, pAgg
21920 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70 41 67  Info->mnReg, pAg
21930 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b 0a 20  gInfo->mxReg);. 
21940 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67 67 49   for(pFunc=pAggI
21950 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d 30 3b  nfo->aFunc, i=0;
21960 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
21970 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63 2b 2b  nc; i++, pFunc++
21980 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75 6e 63  ){.    if( pFunc
21990 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30 20 29  ->iDistinct>=0 )
219a0 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  {.      Expr *pE
219b0 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70 72 3b   = pFunc->pExpr;
219c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
219d0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
219e0 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pE, EP_xIsSelect
219f0 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ) );.      if( p
21a00 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 7c 7c  E->x.pList==0 ||
21a10 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45   pE->x.pList->nE
21a20 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
21a30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
21a40 67 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49  g(pParse, "DISTI
21a50 4e 43 54 20 61 67 67 72 65 67 61 74 65 73 20 6d  NCT aggregates m
21a60 75 73 74 20 68 61 76 65 20 65 78 61 63 74 6c 79  ust have exactly
21a70 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20 20 20   one ".         
21a80 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20    "argument");. 
21a90 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e 69 44         pFunc->iD
21aa0 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a 20 20  istinct = -1;.  
21ab0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21ac0 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79     KeyInfo *pKey
21ad0 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72  Info = keyInfoFr
21ae0 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
21af0 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 29 3b  e, pE->x.pList);
21b00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21b10 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
21b20 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
21b30 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74  pFunc->iDistinct
21b40 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
21b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b60 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66    (char*)pKeyInf
21b70 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P4_KEYINFO);.
21b80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21b90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
21ba0 65 20 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61  e the OP_AggFina
21bb0 6c 69 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20  lize opcode for 
21bc0 65 76 65 72 79 20 61 67 67 72 65 67 61 74 65 20  every aggregate 
21bd0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  function.** in t
21be0 68 65 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63  he AggInfo struc
21bf0 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
21c00 76 6f 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67  void finalizeAgg
21c10 46 75 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20  Functions(Parse 
21c20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f  *pParse, AggInfo
21c30 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56   *pAggInfo){.  V
21c40 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
21c50 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
21c60 0a 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66  .  struct AggInf
21c70 6f 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f  o_func *pF;.  fo
21c80 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
21c90 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
21ca0 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
21cb0 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78  +, pF++){.    Ex
21cc0 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
21cd0 70 46 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69  pF->pExpr->x.pLi
21ce0 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
21cf0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
21d00 28 70 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78  (pF->pExpr, EP_x
21d10 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
21d20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
21d30 70 34 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61  p4(v, OP_AggFina
21d40 6c 2c 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69  l, pF->iMem, pLi
21d50 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
21d60 72 20 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  r : 0, 0,.      
21d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d80 28 76 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63  (void*)pF->pFunc
21d90 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
21da0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61   }.}../*.** Upda
21db0 74 65 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74  te the accumulat
21dc0 6f 72 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  or memory cells 
21dd0 66 6f 72 20 61 6e 20 61 67 67 72 65 67 61 74 65  for an aggregate
21de0 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
21df0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
21e00 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  position..*/.sta
21e10 74 69 63 20 76 6f 69 64 20 75 70 64 61 74 65 41  tic void updateA
21e20 63 63 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65  ccumulator(Parse
21e30 20 2a 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66   *pParse, AggInf
21e40 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20  o *pAggInfo){.  
21e50 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
21e60 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
21e70 3b 0a 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d  ;.  int regHit =
21e80 20 30 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69   0;.  int addrHi
21e90 74 54 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72  tTest = 0;.  str
21ea0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
21eb0 20 2a 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41   *pF;.  struct A
21ec0 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a  ggInfo_col *pC;.
21ed0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
21ee0 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 66  ectMode = 1;.  f
21ef0 6f 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49  or(i=0, pF=pAggI
21f00 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41  nfo->aFunc; i<pA
21f10 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
21f20 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69  ++, pF++){.    i
21f30 6e 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74  nt nArg;.    int
21f40 20 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20   addrNext = 0;. 
21f50 20 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20     int regAgg;. 
21f60 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
21f70 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
21f80 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
21f90 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
21fa0 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
21fb0 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
21fc0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
21fd0 29 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  ){.      nArg = 
21fe0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
21ff0 20 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c      regAgg = sql
22000 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65  ite3GetTempRange
22010 28 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a  (pParse, nArg);.
22020 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
22030 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
22040 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67  arse, pList, reg
22050 41 67 67 2c 20 53 51 4c 49 54 45 5f 45 43 45 4c  Agg, SQLITE_ECEL
22060 5f 44 55 50 29 3b 0a 20 20 20 20 7d 65 6c 73 65  _DUP);.    }else
22070 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 30  {.      nArg = 0
22080 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20 3d  ;.      regAgg =
22090 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
220a0 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74 3e  ( pF->iDistinct>
220b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64 72  =0 ){.      addr
220c0 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Next = sqlite3Vd
220d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
220e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
220f0 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 63  rg==1 );.      c
22100 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61 72  odeDistinct(pPar
22110 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e 63  se, pF->iDistinc
22120 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c 20  t, addrNext, 1, 
22130 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a 20  regAgg);.    }. 
22140 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e 63     if( pF->pFunc
22150 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
22160 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f  LITE_FUNC_NEEDCO
22170 4c 4c 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  LL ){.      Coll
22180 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
22190 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
221a0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
221b0 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  m;.      int j;.
221c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
221d0 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c  ist!=0 );  /* pL
221e0 69 73 74 21 3d 30 20 69 66 20 70 46 2d 3e 70 46  ist!=0 if pF->pF
221f0 75 6e 63 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c  unc has NEEDCOLL
22200 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   */.      for(j=
22210 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
22220 61 3b 20 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e  a; !pColl && j<n
22230 41 72 67 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  Arg; j++, pItem+
22240 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  +){.        pCol
22250 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
22260 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
22270 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
22280 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22290 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
222a0 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65    pColl = pParse
222b0 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
222c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
222d0 66 28 20 72 65 67 48 69 74 3d 3d 30 20 26 26 20  f( regHit==0 && 
222e0 70 41 67 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d  pAggInfo->nAccum
222f0 75 6c 61 74 6f 72 20 29 20 72 65 67 48 69 74 20  ulator ) regHit 
22300 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
22310 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22320 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
22330 43 6f 6c 6c 53 65 71 2c 20 72 65 67 48 69 74 2c  CollSeq, regHit,
22340 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
22350 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51  Coll, P4_COLLSEQ
22360 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22370 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
22380 2c 20 4f 50 5f 41 67 67 53 74 65 70 2c 20 30 2c  , OP_AggStep, 0,
22390 20 72 65 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65   regAgg, pF->iMe
223a0 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
223b0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
223c0 70 46 2d 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55  pF->pFunc, P4_FU
223d0 4e 43 44 45 46 29 3b 0a 20 20 20 20 73 71 6c 69  NCDEF);.    sqli
223e0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
223f0 76 2c 20 28 75 38 29 6e 41 72 67 29 3b 0a 20 20  v, (u8)nArg);.  
22400 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
22410 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
22420 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
22430 20 6e 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69   nArg);.    sqli
22440 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
22450 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 41  nge(pParse, regA
22460 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20 20 69  gg, nArg);.    i
22470 66 28 20 61 64 64 72 4e 65 78 74 20 29 7b 0a 20  f( addrNext ){. 
22480 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22490 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
224a0 61 64 64 72 4e 65 78 74 29 3b 0a 20 20 20 20 20  addrNext);.     
224b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
224c0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
224d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
224e0 42 65 66 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e  Before populatin
224f0 67 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f  g the accumulato
22500 72 20 72 65 67 69 73 74 65 72 73 2c 20 63 6c 65  r registers, cle
22510 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61  ar the column ca
22520 63 68 65 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  che..  ** Otherw
22530 69 73 65 2c 20 69 66 20 61 6e 79 20 6f 66 20 74  ise, if any of t
22540 68 65 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75  he required colu
22550 6d 6e 20 76 61 6c 75 65 73 20 61 72 65 20 61 6c  mn values are al
22560 72 65 61 64 79 20 70 72 65 73 65 6e 74 20 0a 20  ready present . 
22570 20 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 73   ** in registers
22580 2c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  , sqlite3ExprCod
22590 65 28 29 20 6d 61 79 20 75 73 65 20 4f 50 5f 53  e() may use OP_S
225a0 43 6f 70 79 20 74 6f 20 63 6f 70 79 20 74 68 65  Copy to copy the
225b0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70   value.  ** to p
225c0 43 2d 3e 69 4d 65 6d 2e 20 42 75 74 20 62 79 20  C->iMem. But by 
225d0 74 68 65 20 74 69 6d 65 20 74 68 65 20 76 61 6c  the time the val
225e0 75 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20  ue is used, the 
225f0 6f 72 69 67 69 6e 61 6c 20 72 65 67 69 73 74 65  original registe
22600 72 0a 20 20 2a 2a 20 6d 61 79 20 68 61 76 65 20  r.  ** may have 
22610 62 65 65 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c  been used, inval
22620 69 64 61 74 69 6e 67 20 74 68 65 20 75 6e 64 65  idating the unde
22630 72 6c 79 69 6e 67 20 62 75 66 66 65 72 20 68 6f  rlying buffer ho
22640 6c 64 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74  lding the.  ** t
22650 65 78 74 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75  ext or blob valu
22660 65 2e 20 53 65 65 20 74 69 63 6b 65 74 20 5b 38  e. See ticket [8
22670 38 33 30 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a  83034dcb5]..  **
22680 0a 20 20 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f  .  ** Another so
22690 6c 75 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  lution would be 
226a0 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 4f 50  to change the OP
226b0 5f 53 43 6f 70 79 20 75 73 65 64 20 74 6f 20 63  _SCopy used to c
226c0 6f 70 79 20 63 61 63 68 65 64 0a 20 20 2a 2a 20  opy cached.  ** 
226d0 76 61 6c 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f  values to an OP_
226e0 43 6f 70 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Copy..  */.  if(
226f0 20 72 65 67 48 69 74 20 29 7b 0a 20 20 20 20 61   regHit ){.    a
22700 64 64 72 48 69 74 54 65 73 74 20 3d 20 73 71 6c  ddrHitTest = sql
22710 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
22720 2c 20 4f 50 5f 49 66 2c 20 72 65 67 48 69 74 29  , OP_If, regHit)
22730 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
22740 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
22750 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  arse);.  for(i=0
22760 2c 20 70 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61  , pC=pAggInfo->a
22770 43 6f 6c 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  Col; i<pAggInfo-
22780 3e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69  >nAccumulator; i
22790 2b 2b 2c 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73  ++, pC++){.    s
227a0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
227b0 50 61 72 73 65 2c 20 70 43 2d 3e 70 45 78 70 72  Parse, pC->pExpr
227c0 2c 20 70 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d  , pC->iMem);.  }
227d0 0a 20 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72  .  pAggInfo->dir
227e0 65 63 74 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73  ectMode = 0;.  s
227f0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
22800 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
22810 69 66 28 20 61 64 64 72 48 69 74 54 65 73 74 20  if( addrHitTest 
22820 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
22830 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
22840 64 72 48 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a  drHitTest);.  }.
22850 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73  }../*.** Add a s
22860 69 6e 67 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e  ingle OP_Explain
22870 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
22880 74 68 65 20 56 44 42 45 20 74 6f 20 65 78 70 6c  the VDBE to expl
22890 61 69 6e 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20  ain a simple.** 
228a0 63 6f 75 6e 74 28 2a 29 20 71 75 65 72 79 20 28  count(*) query (
228b0 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
228c0 20 46 52 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f   FROM pTab")..*/
228d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
228e0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61  OMIT_EXPLAIN.sta
228f0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
22900 53 69 6d 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50  SimpleCount(.  P
22910 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22930 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
22940 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
22950 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22960 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
22970 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f 0a 20  ing queried */. 
22980 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229a0 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
229b0 6f 20 6f 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c  o optimize scan,
229c0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   or NULL */.){. 
229d0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
229e0 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63  lain==2 ){.    c
229f0 68 61 72 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69  har *zEqp = sqli
22a00 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73  te3MPrintf(pPars
22a10 65 2d 3e 64 62 2c 20 22 53 43 41 4e 20 54 41 42  e->db, "SCAN TAB
22a20 4c 45 20 25 73 25 73 25 73 22 2c 0a 20 20 20 20  LE %s%s%s",.    
22a30 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
22a40 20 0a 20 20 20 20 20 20 20 20 70 49 64 78 20 3f   .        pIdx ?
22a50 20 22 20 55 53 49 4e 47 20 43 4f 56 45 52 49 4e   " USING COVERIN
22a60 47 20 49 4e 44 45 58 20 22 20 3a 20 22 22 2c 0a  G INDEX " : "",.
22a70 20 20 20 20 20 20 20 20 70 49 64 78 20 3f 20 70          pIdx ? p
22a80 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 0a  Idx->zName : "".
22a90 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
22aa0 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
22ab0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56        pParse->pV
22ac0 64 62 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  dbe, OP_Explain,
22ad0 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
22ae0 49 64 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20  Id, 0, 0, zEqp, 
22af0 50 34 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29  P4_DYNAMIC.    )
22b00 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
22b10 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69  define explainSi
22b20 6d 70 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29  mpleCount(a,b,c)
22b30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
22b40 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
22b50 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
22b60 65 6d 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74  ement given in t
22b70 68 65 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20  he p argument.  
22b80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
22b90 74 73 20 61 72 65 20 64 69 73 74 72 69 62 75 74  ts are distribut
22ba0 65 64 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61  ed in various wa
22bb0 79 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ys depending on 
22bc0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
22bd0 6f 66 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  of the SelectDes
22be0 74 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  t structure poin
22bf0 74 65 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65  ted to by argume
22c00 6e 74 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66  nt pDest.** as f
22c10 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
22c20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20    pDest->eDest  
22c30 20 20 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20    Result.**     
22c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
22c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
22c80 20 20 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20     SRT_Output   
22c90 20 20 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f     Generate a ro
22ca0 77 20 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69  w of output (usi
22cb0 6e 67 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74  ng the OP_Result
22cc0 52 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  Row.**          
22cd0 20 20 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64             opcod
22ce0 65 29 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  e) for each row 
22cf0 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
22d00 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54  t..**.**     SRT
22d10 5f 4d 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c  _Mem         Onl
22d20 79 20 76 61 6c 69 64 20 69 66 20 74 68 65 20 72  y valid if the r
22d30 65 73 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c  esult is a singl
22d40 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20  e column..**    
22d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d60 20 53 74 6f 72 65 20 74 68 65 20 66 69 72 73 74   Store the first
22d70 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
22d80 69 72 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a  irst result row.
22d90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
22da0 20 20 20 20 20 20 20 69 6e 20 72 65 67 69 73 74         in regist
22db0 65 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  er pDest->iSDPar
22dc0 6d 20 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74  m then abandon t
22dd0 68 65 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20  he rest.**      
22de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
22df0 66 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68  f the query.  Th
22e00 69 73 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  is destination i
22e10 6d 70 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22  mplies "LIMIT 1"
22e20 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
22e30 53 65 74 20 20 20 20 20 20 20 20 20 54 68 65 20  Set         The 
22e40 72 65 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61  result must be a
22e50 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20   single column. 
22e60 20 53 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20   Store each.**  
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e80 20 20 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74     row of result
22e90 20 61 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74   as the key in t
22ea0 61 62 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50  able pDest->iSDP
22eb0 61 72 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20  arm. .**        
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70               App
22ed0 6c 79 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  ly the affinity 
22ee0 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 62  pDest->affSdst b
22ef0 65 66 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a  efore storing.**
22f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f10 20 20 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55       results.  U
22f20 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
22f30 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
22f40 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  )"..**.**     SR
22f50 54 5f 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74  T_Union       St
22f60 6f 72 65 20 72 65 73 75 6c 74 73 20 61 73 20 61  ore results as a
22f70 20 6b 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72   key in a tempor
22f80 61 72 79 20 74 61 62 6c 65 20 0a 2a 2a 20 20 20  ary table .**   
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fa0 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20    identified by 
22fb0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a  pDest->iSDParm..
22fc0 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78  **.**     SRT_Ex
22fd0 63 65 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65  cept      Remove
22fe0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68   results from th
22ff0 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
23000 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  e pDest->iSDParm
23010 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
23020 54 61 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72  Table       Stor
23030 65 20 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d  e results in tem
23040 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65  porary table pDe
23050 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 20  st->iSDParm..** 
23060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23070 20 20 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65      This is like
23080 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78   SRT_EphemTab ex
23090 63 65 70 74 20 74 68 61 74 20 74 68 65 20 74 61  cept that the ta
230a0 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ble.**          
230b0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 61 73             is as
230c0 73 75 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79  sumed to already
230d0 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20   be open..**.** 
230e0 20 20 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62      SRT_EphemTab
230f0 20 20 20 20 43 72 65 61 74 65 20 61 6e 20 74 65      Create an te
23100 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44  mporary table pD
23110 65 73 74 2d 3e 69 53 44 50 61 72 6d 20 61 6e 64  est->iSDParm and
23120 20 73 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20   store.**       
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
23140 65 20 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20  e result there. 
23150 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
23160 66 74 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a  ft open after.**
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23180 20 20 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20       returning. 
23190 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52   This is like SR
231a0 54 5f 54 61 62 6c 65 20 65 78 63 65 70 74 20 74  T_Table except t
231b0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
231c0 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 20             this 
231d0 64 65 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73  destination uses
231e0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
231f0 6c 20 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20  l to create.**  
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23210 20 20 20 74 68 65 20 74 61 62 6c 65 20 66 69 72     the table fir
23220 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  st..**.**     SR
23230 54 5f 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65  T_Coroutine   Ge
23240 6e 65 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74  nerate a co-rout
23250 69 6e 65 20 74 68 61 74 20 72 65 74 75 72 6e 73  ine that returns
23260 20 61 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a   a new row of.**
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 20 20 20 72 65 73 75 6c 74 73 20 65 61 63       results eac
23290 68 20 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76  h time it is inv
232a0 6f 6b 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79  oked.  The entry
232b0 20 70 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20   point.**       
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
232d0 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20   the co-routine 
232e0 69 73 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67  is stored in reg
232f0 69 73 74 65 72 20 70 44 65 73 74 2d 3e 69 53 44  ister pDest->iSD
23300 50 61 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  Parm..**.**     
23310 53 52 54 5f 45 78 69 73 74 73 20 20 20 20 20 20  SRT_Exists      
23320 53 74 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d  Store a 1 in mem
23330 6f 72 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e  ory cell pDest->
23340 69 53 44 50 61 72 6d 20 69 66 20 74 68 65 20 72  iSDParm if the r
23350 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  esult.**        
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
23370 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a   is not empty..*
23380 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73  *.**     SRT_Dis
23390 63 61 72 64 20 20 20 20 20 54 68 72 6f 77 20 74  card     Throw t
233a0 68 65 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e  he results away.
233b0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62    This is used b
233c0 79 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20  y SELECT.**     
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233e0 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69  statements withi
233f0 6e 20 74 72 69 67 67 65 72 73 20 77 68 6f 73 65  n triggers whose
23400 20 6f 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73   only purpose is
23410 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
23420 20 20 20 20 20 20 20 20 74 68 65 20 73 69 64 65          the side
23430 2d 65 66 66 65 63 74 73 20 6f 66 20 66 75 6e 63  -effects of func
23440 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
23450 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
23460 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
23470 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20  errors.  If any 
23480 65 72 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e  errors are.** en
23490 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20  countered, then 
234a0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
234b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
234c0 6c 65 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73  left in.** pPars
234d0 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
234e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
234f0 6f 65 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65  oes NOT free the
23500 20 53 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   Select structur
23510 65 20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68  e passed in.  Th
23520 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e  e.** calling fun
23530 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64  ction needs to d
23540 6f 20 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73  o that..*/.int s
23550 71 6c 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20  qlite3Select(.  
23560 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
23570 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
23580 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
23590 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
235a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
235b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
235c0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
235d0 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
235e0 44 65 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61  Dest      /* Wha
235f0 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
23600 20 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a   query results *
23610 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23630 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
23640 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
23650 57 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65  WInfo;     /* Re
23660 74 75 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65  turn from sqlite
23670 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f  3WhereBegin() */
23680 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
23690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
236a0 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
236b0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
236c0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41  ion */.  int isA
236d0 67 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gg;             
236e0 2f 2a 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65  /* True for sele
236f0 63 74 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63  ct lists like "c
23700 6f 75 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78  ount(*)" */.  Ex
23710 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
23720 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
23730 63 6f 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61  columns to extra
23740 63 74 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ct. */.  SrcList
23750 20 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20   *pTabList;     
23760 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
23770 73 20 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d  s to select from
23780 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
23790 72 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  re;          /* 
237a0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
237b0 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
237c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
237d0 72 64 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68  rderBy;    /* Th
237e0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
237f0 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
23800 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
23810 47 72 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54  GroupBy;    /* T
23820 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
23830 73 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  se.  May be NULL
23840 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76   */.  Expr *pHav
23850 69 6e 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ing;         /* 
23860 54 68 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73  The HAVING claus
23870 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  e.  May be NULL 
23880 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b  */.  int rc = 1;
23890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
238a0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66  alue to return f
238b0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
238c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53  n */.  int addrS
238d0 6f 72 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a  ortIndex;     /*
238e0 20 41 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f   Address of an O
238f0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
23900 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20  instruction */. 
23910 20 44 69 73 74 69 6e 63 74 43 74 78 20 73 44 69   DistinctCtx sDi
23920 73 74 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20  stinct; /* Info 
23930 6f 6e 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74  on how to code t
23940 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77  he DISTINCT keyw
23950 6f 72 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f  ord */.  AggInfo
23960 20 73 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20   sAggInfo;      
23970 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  /* Information u
23980 73 65 64 20 62 79 20 61 67 67 72 65 67 61 74 65  sed by aggregate
23990 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e   queries */.  in
239a0 74 20 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t iEnd;         
239b0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
239c0 6f 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  of the end of th
239d0 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  e query */.  sql
239e0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
239f0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
23a00 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
23a10 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
23a20 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
23a30 20 69 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c   int iRestoreSel
23a40 65 63 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e  ectId = pParse->
23a50 69 53 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61  iSelectId;.  pPa
23a60 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d  rse->iSelectId =
23a70 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
23a80 6c 65 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  lectId++;.#endif
23a90 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ..  db = pParse-
23aa0 3e 64 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  >db;.  if( p==0 
23ab0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
23ac0 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  led || pParse->n
23ad0 45 72 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Err ){.    retur
23ae0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
23af0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
23b00 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
23b10 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20  ELECT, 0, 0, 0) 
23b20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
23b30 6d 73 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20  mset(&sAggInfo, 
23b40 30 2c 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e  0, sizeof(sAggIn
23b50 66 6f 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e  fo));..  if( Ign
23b60 6f 72 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44  orableOrderby(pD
23b70 65 73 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65  est) ){.    asse
23b80 72 74 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  rt(pDest->eDest=
23b90 3d 53 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70  =SRT_Exists || p
23ba0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
23bb0 5f 55 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20  _Union || .     
23bc0 20 20 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65        pDest->eDe
23bd0 73 74 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c  st==SRT_Except |
23be0 7c 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d  | pDest->eDest==
23bf0 53 52 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20  SRT_Discard);.  
23c00 20 20 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59    /* If ORDER BY
23c10 20 6d 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72   makes no differ
23c20 65 6e 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70  ence in the outp
23c30 75 74 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20  ut then neither 
23c40 64 6f 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54  does.    ** DIST
23c50 49 4e 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62  INCT so it can b
23c60 65 20 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a  e removed too. *
23c70 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  /.    sqlite3Exp
23c80 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
23c90 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
23ca0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
23cb0 30 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  0;.    p->selFla
23cc0 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e  gs &= ~SF_Distin
23cd0 63 74 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ct;.  }.  sqlite
23ce0 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
23cf0 73 65 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72  se, p, 0);.  pOr
23d00 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
23d10 72 42 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20  rBy;.  pTabList 
23d20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c  = p->pSrc;.  pEL
23d30 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
23d40 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
23d50 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
23d60 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
23d70 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
23d80 20 20 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70    }.  isAgg = (p
23d90 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
23da0 41 67 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20  Aggregate)!=0;. 
23db0 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
23dc0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  =0 );..  /* Begi
23dd0 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64  n generating cod
23de0 65 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  e..  */.  v = sq
23df0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
23e00 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30  rse);.  if( v==0
23e10 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
23e20 6e 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69  nd;..  /* If wri
23e30 74 69 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ting to memory o
23e40 72 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73  r generating a s
23e50 65 74 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73  et.  ** only a s
23e60 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79  ingle column may
23e70 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f   be output..  */
23e80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23e90 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
23ea0 69 66 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74  if( checkForMult
23eb0 69 43 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72  iColumnSelectErr
23ec0 6f 72 28 70 50 61 72 73 65 2c 20 70 44 65 73 74  or(pParse, pDest
23ed0 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
23ee0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c   ){.    goto sel
23ef0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e  ect_end;.  }.#en
23f00 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
23f10 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20  te code for all 
23f20 73 75 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74  sub-queries in t
23f30 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  he FROM clause. 
23f40 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
23f50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
23f60 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e  QUERY) || !defin
23f70 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
23f80 49 45 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20  IEW).  for(i=0; 
23f90 21 70 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c  !p->pPrior && i<
23fa0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
23fb0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
23fc0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
23fd0 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
23fe0 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65  ->a[i];.    Sele
23ff0 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20  ctDest dest;.   
24000 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
24010 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a  pItem->pSelect;.
24020 20 20 20 20 69 6e 74 20 69 73 41 67 67 53 75 62      int isAggSub
24030 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d  ;..    if( pSub=
24040 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  =0 ) continue;..
24050 20 20 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73      /* Sometimes
24060 20 74 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20   the code for a 
24070 73 75 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65  subquery will be
24080 20 67 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20   generated more 
24090 74 68 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65  than.    ** once
240a0 2c 20 69 66 20 74 68 65 20 73 75 62 71 75 65 72  , if the subquer
240b0 79 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  y is part of the
240c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e   WHERE clause in
240d0 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20   a LEFT JOIN,.  
240e0 20 20 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65    ** for example
240f0 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
24100 20 64 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61   do not regenera
24110 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d  te the code to m
24120 61 6e 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61  anifest.    ** a
24130 20 76 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d   view or the co-
24140 72 6f 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65  routine to imple
24150 6d 65 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68  ment a view.  Th
24160 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
24170 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69  .    ** is suffi
24180 63 69 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68  cient, though th
24190 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  e subroutine to 
241a0 6d 61 6e 69 66 65 73 74 20 74 68 65 20 76 69 65  manifest the vie
241b0 77 20 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20  w does need.    
241c0 2a 2a 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ** to be invoked
241d0 20 61 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69   again. */.    i
241e0 66 28 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  f( pItem->addrFi
241f0 6c 6c 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69  llSub ){.      i
24200 66 28 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72  f( pItem->viaCor
24210 6f 75 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  outine==0 ){.   
24220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24230 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
24240 75 62 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65  ub, pItem->regRe
24250 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64  turn, pItem->add
24260 72 46 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20  rFillSub);.     
24270 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75   }.      continu
24280 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
24290 20 49 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65   Increment Parse
242a0 2e 6e 48 65 69 67 68 74 20 62 79 20 74 68 65 20  .nHeight by the 
242b0 68 65 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61  height of the la
242c0 72 67 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e  rgest expression
242d0 0a 20 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66  .    ** tree ref
242e0 65 72 72 65 64 20 74 6f 20 62 79 20 74 68 69 73  erred to by this
242f0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c  , the parent sel
24300 65 63 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73  ect. The child s
24310 65 6c 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79  elect.    ** may
24320 20 63 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73   contain express
24330 69 6f 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20  ion trees of at 
24340 6d 6f 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c  most.    ** (SQL
24350 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
24360 54 48 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74  TH-Parse.nHeight
24370 29 20 68 65 69 67 68 74 2e 20 54 68 69 73 20 69  ) height. This i
24380 73 20 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d  s a bit.    ** m
24390 6f 72 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65  ore conservative
243a0 20 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c   than necessary,
243b0 20 62 75 74 20 6d 75 63 68 20 65 61 73 69 65 72   but much easier
243c0 20 74 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a   than enforcing.
243d0 20 20 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20      ** an exact 
243e0 6c 69 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  limit..    */.  
243f0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
24400 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t += sqlite3Sele
24410 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
24420 0a 0a 20 20 20 20 69 73 41 67 67 53 75 62 20 3d  ..    isAggSub =
24430 20 28 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73   (pSub->selFlags
24440 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29   & SF_Aggregate)
24450 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61  !=0;.    if( fla
24460 74 74 65 6e 53 75 62 71 75 65 72 79 28 70 50 61  ttenSubquery(pPa
24470 72 73 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67  rse, p, i, isAgg
24480 2c 20 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20  , isAggSub) ){. 
24490 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62       /* This sub
244a0 71 75 65 72 79 20 63 61 6e 20 62 65 20 61 62 73  query can be abs
244b0 6f 72 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70  orbed into its p
244c0 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
244d0 69 66 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a  if( isAggSub ){.
244e0 20 20 20 20 20 20 20 20 69 73 41 67 67 20 3d 20          isAgg = 
244f0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65  1;.        p->se
24500 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
24510 72 65 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a  regate;.      }.
24520 20 20 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20        i = -1;.  
24530 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62    }else if( pTab
24540 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 26 26  List->nSrc==1 &&
24550 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
24560 53 46 5f 4d 61 74 65 72 69 61 6c 69 7a 65 29 3d  SF_Materialize)=
24570 3d 30 0a 20 20 20 20 20 20 26 26 20 4f 70 74 69  =0.      && Opti
24580 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
24590 64 62 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43  db, SQLITE_SubqC
245a0 6f 72 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b  oroutine).    ){
245b0 0a 20 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d  .      /* Implem
245c0 65 6e 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65  ent a co-routine
245d0 20 74 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72   that will retur
245e0 6e 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  n a single row o
245f0 66 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20  f the result.   
24600 20 20 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63     ** set on eac
24610 68 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20  h invocation..  
24620 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
24630 20 61 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20   addrTop;.      
24640 69 6e 74 20 61 64 64 72 45 6f 66 3b 0a 20 20 20  int addrEof;.   
24650 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74     pItem->regRet
24660 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
24670 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 64 64 72  nMem;.      addr
24680 45 6f 66 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Eof = ++pParse->
24690 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 2f 2a 20 42  nMem;.      /* B
246a0 65 66 6f 72 65 20 63 6f 64 69 6e 67 20 74 68 65  efore coding the
246b0 20 4f 50 5f 47 6f 74 6f 20 74 6f 20 6a 75 6d 70   OP_Goto to jump
246c0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
246d0 20 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e   the main routin
246e0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 65 6e 73 75  e,.      ** ensu
246f0 72 65 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  re that the jump
24700 20 74 6f 20 74 68 65 20 76 65 72 69 66 79 2d 73   to the verify-s
24710 63 68 65 6d 61 20 72 6f 75 74 69 6e 65 20 68 61  chema routine ha
24720 73 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20  s already.      
24730 2a 2a 20 62 65 65 6e 20 63 6f 64 65 64 2e 20 4f  ** been coded. O
24740 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 76 65  therwise, the ve
24750 72 69 66 79 2d 73 63 68 65 6d 61 20 77 6f 75 6c  rify-schema woul
24760 64 20 6c 69 6b 65 6c 79 20 62 65 20 63 6f 64 65  d likely be code
24770 64 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 70  d as .      ** p
24780 61 72 74 20 6f 66 20 74 68 65 20 63 6f 2d 72 6f  art of the co-ro
24790 75 74 69 6e 65 2e 20 49 66 20 74 68 65 20 6d 61  utine. If the ma
247a0 69 6e 20 72 6f 75 74 69 6e 65 20 74 68 65 6e 20  in routine then 
247b0 61 63 63 65 73 73 65 64 20 74 68 65 20 0a 20 20  accessed the .  
247c0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
247d0 62 65 66 6f 72 65 20 69 6e 76 6f 6b 69 6e 67 20  before invoking 
247e0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 66  the co-routine f
247f0 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
24800 65 20 28 66 6f 72 20 0a 20 20 20 20 20 20 2a 2a  e (for .      **
24810 20 65 78 61 6d 70 6c 65 20 74 6f 20 69 6e 69 74   example to init
24820 69 61 6c 69 7a 65 20 61 20 4c 49 4d 49 54 20 72  ialize a LIMIT r
24830 65 67 69 73 74 65 72 20 66 72 6f 6d 20 61 20 73  egister from a s
24840 75 62 2d 73 65 6c 65 63 74 29 2c 20 69 74 20 77  ub-select), it w
24850 6f 75 6c 64 20 0a 20 20 20 20 20 20 2a 2a 20 62  ould .      ** b
24860 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 74 68 6f  e doing so witho
24870 75 74 20 68 61 76 69 6e 67 20 76 65 72 69 66 69  ut having verifi
24880 65 64 20 74 68 65 20 73 63 68 65 6d 61 20 76 65  ed the schema ve
24890 72 73 69 6f 6e 20 61 6e 64 20 6f 62 74 61 69 6e  rsion and obtain
248a0 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ed .      ** the
248b0 20 72 65 71 75 69 72 65 64 20 64 62 20 6c 6f 63   required db loc
248c0 6b 73 2e 20 53 65 65 20 74 69 63 6b 65 74 20 64  ks. See ticket d
248d0 36 62 33 36 62 65 33 38 2e 20 20 2a 2f 0a 20 20  6b36be38.  */.  
248e0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
248f0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
24900 73 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73  se, -1);.      s
24910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
24920 28 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20  (v, OP_Goto);.  
24930 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71      addrTop = sq
24940 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
24950 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f  v, OP_OpenPseudo
24960 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  , pItem->iCursor
24970 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24980 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
24990 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
249a0 6d 6d 65 6e 74 28 28 76 2c 20 22 63 6f 72 6f 75  mment((v, "corou
249b0 74 69 6e 65 20 66 6f 72 20 25 73 22 2c 20 70 49  tine for %s", pI
249c0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
249d0 29 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d  ));.      pItem-
249e0 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20 61  >addrFillSub = a
249f0 64 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 73 71  ddrTop;.      sq
24a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24a10 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
24a20 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20 20 20  , addrEof);.    
24a30 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
24a40 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20  ngeP5(v, 1);.   
24a50 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
24a60 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
24a70 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 70  SRT_Coroutine, p
24a80 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
24a90 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
24aa0 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
24ab0 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
24ac0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
24ad0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
24ae0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
24af0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
24b00 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
24b10 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28  Tab->nRowEst = (
24b20 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e  unsigned)pSub->n
24b30 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
24b40 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
24b50 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  tine = 1;.      
24b60 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
24b70 65 50 32 28 76 2c 20 61 64 64 72 54 6f 70 2c 20  eP2(v, addrTop, 
24b80 64 65 73 74 2e 69 53 64 73 74 29 3b 0a 20 20 20  dest.iSdst);.   
24b90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
24ba0 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 54 6f  angeP3(v, addrTo
24bb0 70 2c 20 64 65 73 74 2e 6e 53 64 73 74 29 3b 0a  p, dest.nSdst);.
24bc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24bd0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
24be0 74 65 67 65 72 2c 20 31 2c 20 61 64 64 72 45 6f  teger, 1, addrEo
24bf0 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
24c00 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
24c10 50 5f 59 69 65 6c 64 2c 20 70 49 74 65 6d 2d 3e  P_Yield, pItem->
24c20 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
24c30 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
24c40 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65  , "end %s", pIte
24c50 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  m->pTab->zName))
24c60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
24c70 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
24c80 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  ddrTop-1);.     
24c90 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
24ca0 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
24cb0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
24cc0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
24cd0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
24ce0 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65  t will fill an e
24cf0 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
24d00 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ith.      ** the
24d10 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
24d20 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65   subquery.  pIte
24d30 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77  m->addrFillSub w
24d40 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20  ill point.      
24d50 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73  ** to the addres
24d60 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  s of the generat
24d70 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ed subroutine.  
24d80 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
24d90 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72  .      ** is a r
24da0 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65  egister allocate
24db0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75  d to hold the su
24dc0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
24dd0 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f  address.      */
24de0 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64  .      int topAd
24df0 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  dr;.      int on
24e00 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  ceAddr = 0;.    
24e10 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20    int retAddr;. 
24e20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
24e30 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
24e40 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
24e50 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
24e60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
24e70 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
24e80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24e90 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
24ea0 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
24eb0 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
24ec0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
24ed0 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
24ee0 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e    VdbeNoopCommen
24ef0 74 28 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69  t((v, "materiali
24f00 7a 65 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  ze %s", pItem->p
24f10 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
24f20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
24f30 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29  sCorrelated==0 )
24f40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
24f50 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73 20  the subquery is 
24f60 6e 6f 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61  not correlated a
24f70 6e 64 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  nd if we are not
24f80 20 69 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20   inside of.     
24f90 20 20 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c     ** a trigger,
24fa0 20 74 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65   then we only ne
24fb0 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
24fc0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  e value of the s
24fd0 75 62 71 75 65 72 79 0a 20 20 20 20 20 20 20 20  ubquery.        
24fe0 2a 2a 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ** once. */.    
24ff0 20 20 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73      onceAddr = s
25000 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
25010 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d 0a  Parse);.      }.
25020 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
25030 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
25040 74 2c 20 53 52 54 5f 45 70 68 65 6d 54 61 62 2c  t, SRT_EphemTab,
25050 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
25060 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
25070 65 74 49 6e 74 65 67 65 72 28 70 49 74 65 6d 2d  etInteger(pItem-
25080 3e 69 53 65 6c 65 63 74 49 64 2c 20 28 75 38 29  >iSelectId, (u8)
25090 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
250a0 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 73 71  ectId);.      sq
250b0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
250c0 73 65 2c 20 70 53 75 62 2c 20 26 64 65 73 74 29  se, pSub, &dest)
250d0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70  ;.      pItem->p
250e0 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 28  Tab->nRowEst = (
250f0 75 6e 73 69 67 6e 65 64 29 70 53 75 62 2d 3e 6e  unsigned)pSub->n
25100 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20  SelectRow;.     
25110 20 69 66 28 20 6f 6e 63 65 41 64 64 72 20 29 20   if( onceAddr ) 
25120 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
25130 65 72 65 28 76 2c 20 6f 6e 63 65 41 64 64 72 29  ere(v, onceAddr)
25140 3b 0a 20 20 20 20 20 20 72 65 74 41 64 64 72 20  ;.      retAddr 
25150 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
25160 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
25170 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
25180 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  rn);.      VdbeC
25190 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
251a0 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  %s", pItem->pTab
251b0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
251c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
251d0 67 65 50 31 28 76 2c 20 74 6f 70 41 64 64 72 2c  geP1(v, topAddr,
251e0 20 72 65 74 41 64 64 72 29 3b 0a 20 20 20 20 20   retAddr);.     
251f0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
25200 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
25210 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
25220 20 2f 2a 70 50 61 72 73 65 2d 3e 6e 45 72 72 20   /*pParse->nErr 
25230 7c 7c 2a 2f 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ||*/ db->mallocF
25240 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 67  ailed ){.      g
25250 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  oto select_end;.
25260 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
25270 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 73 71 6c  ->nHeight -= sql
25280 69 74 65 33 53 65 6c 65 63 74 45 78 70 72 48 65  ite3SelectExprHe
25290 69 67 68 74 28 70 29 3b 0a 20 20 20 20 70 54 61  ight(p);.    pTa
252a0 62 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b  bList = p->pSrc;
252b0 0a 20 20 20 20 69 66 28 20 21 49 67 6e 6f 72 61  .    if( !Ignora
252c0 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
252d0 29 20 29 7b 0a 20 20 20 20 20 20 70 4f 72 64 65  ) ){.      pOrde
252e0 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
252f0 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  y;.    }.  }.  p
25300 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
25310 74 3b 0a 23 65 6e 64 69 66 0a 20 20 70 57 68 65  t;.#endif.  pWhe
25320 72 65 20 3d 20 70 2d 3e 70 57 68 65 72 65 3b 0a  re = p->pWhere;.
25330 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
25340 70 47 72 6f 75 70 42 79 3b 0a 20 20 70 48 61 76  pGroupBy;.  pHav
25350 69 6e 67 20 3d 20 70 2d 3e 70 48 61 76 69 6e 67  ing = p->pHaving
25360 3b 0a 20 20 73 44 69 73 74 69 6e 63 74 2e 69 73  ;.  sDistinct.is
25370 54 6e 63 74 20 3d 20 28 70 2d 3e 73 65 6c 46 6c  Tnct = (p->selFl
25380 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
25390 74 29 21 3d 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t)!=0;..#ifndef 
253a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
253b0 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 2f 2a  OUND_SELECT.  /*
253c0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 72 65   If there is are
253d0 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 71   a sequence of q
253e0 75 65 72 69 65 73 2c 20 64 6f 20 74 68 65 20 65  ueries, do the e
253f0 61 72 6c 69 65 72 20 6f 6e 65 73 20 66 69 72 73  arlier ones firs
25400 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
25410 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69  >pPrior ){.    i
25420 66 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  f( p->pRightmost
25430 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ==0 ){.      Sel
25440 65 63 74 20 2a 70 4c 6f 6f 70 2c 20 2a 70 52 69  ect *pLoop, *pRi
25450 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ght = 0;.      i
25460 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
25470 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 3b 0a    int mxSelect;.
25480 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d        for(pLoop=
25490 70 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  p; pLoop; pLoop=
254a0 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63  pLoop->pPrior, c
254b0 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  nt++){.        p
254c0 4c 6f 6f 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74  Loop->pRightmost
254d0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 70 4c   = p;.        pL
254e0 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 52 69  oop->pNext = pRi
254f0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 70 52 69  ght;.        pRi
25500 67 68 74 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20  ght = pLoop;.   
25510 20 20 20 7d 0a 20 20 20 20 20 20 6d 78 53 65 6c     }.      mxSel
25520 65 63 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  ect = db->aLimit
25530 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
25540 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3b 0a  MPOUND_SELECT];.
25550 20 20 20 20 20 20 69 66 28 20 6d 78 53 65 6c 65        if( mxSele
25560 63 74 20 26 26 20 63 6e 74 3e 6d 78 53 65 6c 65  ct && cnt>mxSele
25570 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
25580 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
25590 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
255a0 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e  terms in compoun
255b0 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20  d SELECT");.    
255c0 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f      goto select_
255d0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
255e0 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74   }.    rc = mult
255f0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
25600 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65  p, pDest);.    e
25610 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
25620 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
25630 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
25640 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ctId);.    retur
25650 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
25660 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
25670 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20  is both a GROUP 
25680 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20  BY and an ORDER 
25690 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
256a0 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e  ey are.  ** iden
256b0 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61  tical, then disa
256c0 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ble the ORDER BY
256d0 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68   clause since th
256e0 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20  e GROUP BY.  ** 
256f0 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
25700 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
25710 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
25720 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20  rder.  This is. 
25730 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   ** an optimizat
25740 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63  ion - the correc
25750 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20  t answer should 
25760 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73  result regardles
25770 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20  s..  ** Use the 
25780 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
25790 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
257a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
257b0 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20  TIMIZER.  ** to 
257c0 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
257d0 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
257e0 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a  sting purposes..
257f0 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
25800 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
25810 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  e(p->pGroupBy, p
25820 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 0a  OrderBy, -1)==0.
25830 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
25840 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
25850 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  db, SQLITE_Group
25860 42 79 4f 72 64 65 72 29 20 29 7b 0a 20 20 20 20  ByOrder) ){.    
25870 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
25880 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71  }..  /* If the q
25890 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54  uery is DISTINCT
258a0 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
258b0 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20  Y but is not an 
258c0 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a  aggregate, and .
258d0 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65    ** if the sele
258e0 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73  ct-list is the s
258f0 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52  ame as the ORDER
25900 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74   BY list, then t
25910 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63  his query.  ** c
25920 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
25930 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49  as a GROUP BY. I
25940 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
25950 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
25960 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
25970 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
25980 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
25990 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66  *.  ** is transf
259a0 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20  ormed to:.  **. 
259b0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
259c0 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55  yz FROM ... GROU
259d0 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  P BY xyz.  **.  
259e0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
259f0 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
25a00 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
25a10 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
25a20 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
25a30 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
25a40 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
25a50 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
25a60 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
25a70 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
25a80 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
25a90 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
25aa0 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
25ab0 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
25ac0 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
25ad0 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
25ae0 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
25af0 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
25b00 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
25b10 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
25b20 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
25b30 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
25b40 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
25b50 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
25b60 43 6f 6d 70 61 72 65 28 70 4f 72 64 65 72 42 79  Compare(pOrderBy
25b70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 29  , p->pEList, -1)
25b80 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  ==0.  ){.    p->
25b90 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
25ba0 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d  Distinct;.    p-
25bb0 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
25bc0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
25bd0 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29  b, p->pEList, 0)
25be0 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
25bf0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
25c00 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
25c10 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
25c20 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
25c30 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
25c40 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
25c50 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
25c60 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
25c70 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
25c80 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
25c90 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
25ca0 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
25cb0 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
25cc0 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
25cd0 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
25ce0 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
25cf0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
25d00 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
25d10 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
25d20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
25d30 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
25d40 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20  n this sorting. 
25d50 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20   ** index might 
25d60 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75  end up being unu
25d70 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
25d80 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74  can be .  ** ext
25d90 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
25da0 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20  rted order.  If 
25db0 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
25dc0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
25dd0 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
25de0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
25df0 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  l be changed to 
25e00 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a  an OP_Noop once.
25e10 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f    ** we figure o
25e20 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
25e30 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  ing index is not
25e40 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64   needed.  The ad
25e50 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a  drSortIndex.  **
25e60 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
25e70 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  d to facilitate 
25e80 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
25e90 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
25ea0 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
25eb0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
25ec0 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
25ed0 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
25ee0 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29 3b  arse, pOrderBy);
25ef0 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 69  .    pOrderBy->i
25f00 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  ECursor = pParse
25f10 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70 2d  ->nTab++;.    p-
25f20 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d  >addrOpenEphm[2]
25f30 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78   = addrSortIndex
25f40 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   =.      sqlite3
25f50 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
25f60 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 0a  _OpenEphemeral,.
25f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f80 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65             pOrde
25f90 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 70  rBy->iECursor, p
25fa0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
25fb0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
25fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fd0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
25fe0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
25ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 53  }else{.    addrS
26000 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20  ortIndex = -1;. 
26010 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
26020 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69 6e  output is destin
26030 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72 61  ed for a tempora
26040 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20 74  ry table, open t
26050 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  hat table..  */.
26060 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44 65    if( pDest->eDe
26070 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62  st==SRT_EphemTab
26080 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
26090 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
260a0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 70  OpenEphemeral, p
260b0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 70  Dest->iSDParm, p
260c0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
260d0 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65   }..  /* Set the
260e0 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a 20   limiter..  */. 
260f0 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56   iEnd = sqlite3V
26100 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
26110 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  .  p->nSelectRow
26120 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   = LARGEST_INT64
26130 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74  ;.  computeLimit
26140 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
26150 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69 66  , p, iEnd);.  if
26160 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20 26  ( p->iLimit==0 &
26170 26 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 3e  & addrSortIndex>
26180 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
26190 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64  3VdbeGetOp(v, ad
261a0 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f 70  drSortIndex)->op
261b0 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65 72  code = OP_Sorter
261c0 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e 73 65 6c  Open;.    p->sel
261d0 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 53  Flags |= SF_UseS
261e0 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  orter;.  }..  /*
261f0 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c 20   Open a virtual 
26200 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
26210 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73 65   the distinct se
26220 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  t..  */.  if( p-
26230 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
26240 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73  istinct ){.    s
26250 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63 74  Distinct.tabTnct
26260 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
26270 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74  +;.    sDistinct
26280 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c 69  .addrTnct = sqli
26290 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
262a0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
262b0 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
262c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262d0 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62     sDistinct.tab
262e0 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20 20  Tnct, 0, 0,.    
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
26310 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78  r*)keyInfoFromEx
26320 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
26330 2d 3e 70 45 4c 69 73 74 29 2c 0a 20 20 20 20 20  ->pEList),.     
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45             P4_KE
26360 59 49 4e 46 4f 29 3b 0a 20 20 20 20 73 71 6c 69  YINFO);.    sqli
26370 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
26380 76 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  v, BTREE_UNORDER
26390 45 44 29 3b 0a 20 20 20 20 73 44 69 73 74 69 6e  ED);.    sDistin
263a0 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 57  ct.eTnctType = W
263b0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
263c0 4f 52 44 45 52 45 44 3b 0a 20 20 7d 65 6c 73 65  ORDERED;.  }else
263d0 7b 0a 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e  {.    sDistinct.
263e0 65 54 6e 63 74 54 79 70 65 20 3d 20 57 48 45 52  eTnctType = WHER
263f0 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
26400 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 69 73 41  .  }..  if( !isA
26410 67 67 20 26 26 20 70 47 72 6f 75 70 42 79 3d 3d  gg && pGroupBy==
26420 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 61  0 ){.    /* No a
26430 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
26440 6e 73 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  ns and no GROUP 
26450 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  BY clause */.   
26460 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
26470 3d 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54  = (sDistinct.isT
26480 6e 63 74 20 3f 20 57 48 45 52 45 5f 57 41 4e 54  nct ? WHERE_WANT
26490 5f 44 49 53 54 49 4e 43 54 20 3a 20 30 29 3b 0a  _DISTINCT : 0);.
264a0 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
264b0 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
264c0 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
264d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
264e0 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
264f0 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4f 72  ist, pWhere, pOr
26500 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74  derBy, p->pEList
26510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26530 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 30 29 3b   wctrlFlags, 0);
26540 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d  .    if( pWInfo=
26550 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74  =0 ) goto select
26560 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 73 71  _end;.    if( sq
26570 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
26580 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
26590 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
265a0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65   ){.      p->nSe
265b0 6c 65 63 74 52 6f 77 20 3d 20 73 71 6c 69 74 65  lectRow = sqlite
265c0 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f 77 43  3WhereOutputRowC
265d0 6f 75 6e 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  ount(pWInfo);.  
265e0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 44 69 73    }.    if( sDis
265f0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26 26 20  tinct.isTnct && 
26600 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44 69  sqlite3WhereIsDi
26610 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29 20 29  stinct(pWInfo) )
26620 7b 0a 20 20 20 20 20 20 73 44 69 73 74 69 6e 63  {.      sDistinc
26630 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20 73 71  t.eTnctType = sq
26640 6c 69 74 65 33 57 68 65 72 65 49 73 44 69 73 74  lite3WhereIsDist
26650 69 6e 63 74 28 70 57 49 6e 66 6f 29 3b 0a 20 20  inct(pWInfo);.  
26660 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 72 64    }.    if( pOrd
26670 65 72 42 79 20 26 26 20 73 71 6c 69 74 65 33 57  erBy && sqlite3W
26680 68 65 72 65 49 73 4f 72 64 65 72 65 64 28 70 57  hereIsOrdered(pW
26690 49 6e 66 6f 29 20 29 20 70 4f 72 64 65 72 42 79  Info) ) pOrderBy
266a0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 0;..    /* If
266b0 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74   sorting index t
266c0 68 61 74 20 77 61 73 20 63 72 65 61 74 65 64 20  hat was created 
266d0 62 79 20 61 20 70 72 69 6f 72 20 4f 50 5f 4f 70  by a prior OP_Op
266e0 65 6e 45 70 68 65 6d 65 72 61 6c 20 0a 20 20 20  enEphemeral .   
266f0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
26700 65 6e 64 65 64 20 75 70 20 6e 6f 74 20 62 65 69  ended up not bei
26710 6e 67 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  ng needed, then 
26720 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70  change the OP_Op
26730 65 6e 45 70 68 65 6d 65 72 61 6c 0a 20 20 20 20  enEphemeral.    
26740 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 4e 6f  ** into an OP_No
26750 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  op..    */.    i
26760 66 28 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  f( addrSortIndex
26770 3e 3d 30 20 26 26 20 70 4f 72 64 65 72 42 79 3d  >=0 && pOrderBy=
26780 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
26790 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
267a0 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 49  oop(v, addrSortI
267b0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
267c0 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32 5d 20  addrOpenEphm[2] 
267d0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  = -1;.    }..   
267e0 20 2f 2a 20 55 73 65 20 74 68 65 20 73 74 61 6e   /* Use the stan
267f0 64 61 72 64 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e  dard inner loop.
26800 20 2a 2f 0a 20 20 20 20 73 65 6c 65 63 74 49 6e   */.    selectIn
26810 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
26820 70 2c 20 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p, pEList, 0, 0,
26830 20 70 4f 72 64 65 72 42 79 2c 20 26 73 44 69 73   pOrderBy, &sDis
26840 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a 20 20  tinct, pDest,.  
26850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26860 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6f    sqlite3WhereCo
26870 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57 49 6e  ntinueLabel(pWIn
26880 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fo),.           
26890 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
268a0 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c 28  WhereBreakLabel(
268b0 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20 20 2f  pWInfo));..    /
268c0 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61 62 61  * End the databa
268d0 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20  se scan loop..  
268e0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
268f0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
26900 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
26910 2a 20 54 68 69 73 20 63 61 73 65 20 77 68 65 6e  * This case when
26920 20 74 68 65 72 65 20 65 78 69 73 74 20 61 67 67   there exist agg
26930 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
26940 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59 20 63   or a GROUP BY c
26950 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f 72 20  lause.    ** or 
26960 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61 6d 65  both */.    Name
26970 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
26980 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
26990 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 61  for processing a
269a0 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61  ggregate informa
269b0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tion */.    int 
269c0 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iAMem;          
269d0 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
269e0 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69 6e 67  ress for storing
269f0 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
26a00 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 4d  Y */.    int iBM
26a10 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  em;          /* 
26a20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72 65 73  First Mem addres
26a30 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73 20 47  s for previous G
26a40 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69  ROUP BY */.    i
26a50 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20 20 20  nt iUseFlag;    
26a60 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
26a70 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67 20 69  s holding flag i
26a80 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61  ndicating that a
26a90 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20  t least.        
26aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ab0 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68  ** one row of th
26ac0 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65 20 61  e input to the a
26ad0 67 67 72 65 67 61 74 6f 72 20 68 61 73 20 62 65  ggregator has be
26ae0 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  en.             
26af0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72             ** pr
26b00 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20 20 69  ocessed */.    i
26b10 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b 20 20  nt iAbortFlag;  
26b20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72 65 73     /* Mem addres
26b30 73 20 77 68 69 63 68 20 63 61 75 73 65 73 20 71  s which causes q
26b40 75 65 72 79 20 61 62 6f 72 74 20 69 66 20 70 6f  uery abort if po
26b50 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20 69 6e  sitive */.    in
26b60 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b 20 20  t groupBySort;  
26b70 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65 20 66    /* Rows come f
26b80 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20 47 52  rom source in GR
26b90 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a 2f 0a  OUP BY order */.
26ba0 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e 64 3b      int addrEnd;
26bb0 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
26bc0 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  f processing for
26bd0 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a   this SELECT */.
26be0 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54 61 62      int sortPTab
26bf0 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65 75 64   = 0;   /* Pseud
26c00 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f 20 64  otable used to d
26c10 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20 72 65  ecode sorting re
26c20 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  sults */.    int
26c30 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20 20 20   sortOut = 0;   
26c40 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67 69 73   /* Output regis
26c50 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 6f 72  ter from the sor
26c60 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52  ter */..    /* R
26c70 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20 61 6c  emove any and al
26c80 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77 65 65  l aliases betwee
26c90 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
26ca0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
26cb0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
26cc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26cd0 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
26ce0 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20 20 20    int k;        
26cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d00 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
26d10 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  */.      struct 
26d20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
26d30 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  Item;  /* For lo
26d40 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70 72 65  oping over expre
26d50 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73 74 20  ssion in a list 
26d60 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  */..      for(k=
26d70 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
26d80 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c 69 73  , pItem=p->pELis
26d90 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20  t->a; k>0; k--, 
26da0 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
26db0 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c    pItem->u.x.iAl
26dc0 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ias = 0;.      }
26dd0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72  .      for(k=pGr
26de0 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49  oupBy->nExpr, pI
26df0 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
26e00 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d   k>0; k--, pItem
26e10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  ++){.        pIt
26e20 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73 20 3d  em->u.x.iAlias =
26e30 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
26e40 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65 63 74    if( p->nSelect
26e50 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e 53 65  Row>100 ) p->nSe
26e60 6c 65 63 74 52 6f 77 20 3d 20 31 30 30 3b 0a 20  lectRow = 100;. 
26e70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26e80 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
26e90 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20 20 20  1;.    }.. .    
26ea0 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61 62 65  /* Create a labe
26eb0 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77 68 65  l to jump to whe
26ec0 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61 62 6f  n we want to abo
26ed0 72 74 20 74 68 65 20 71 75 65 72 79 20 2a 2f 0a  rt the query */.
26ee0 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20 73 71      addrEnd = sq
26ef0 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
26f00 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  el(v);..    /* C
26f10 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55 4d 4e  onvert TK_COLUMN
26f20 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b 5f 41   nodes into TK_A
26f30 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 6d 61  GG_COLUMN and ma
26f40 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 20 20  ke entries in.  
26f50 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20 66 6f    ** sAggInfo fo
26f60 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46 55 4e  r all TK_AGG_FUN
26f70 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e 20 65  CTION nodes in e
26f80 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
26f90 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  e.    ** SELECT 
26fa0 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 2a  statement..    *
26fb0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
26fc0 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
26fd0 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
26fe0 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
26ff0 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
27000 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20 73 4e  pTabList;.    sN
27010 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26 73 41  C.pAggInfo = &sA
27020 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41 67 67  ggInfo;.    sAgg
27030 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70 50 61  Info.mnReg = pPa
27040 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
27050 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69   sAggInfo.nSorti
27060 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75  ngColumn = pGrou
27070 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e  pBy ? pGroupBy->
27080 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20  nExpr+1 : 0;.   
27090 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70   sAggInfo.pGroup
270a0 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20  By = pGroupBy;. 
270b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e     sqlite3ExprAn
270c0 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e  alyzeAggList(&sN
270d0 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  C, pEList);.    
270e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
270f0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
27100 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69  pOrderBy);.    i
27110 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20  f( pHaving ){.  
27120 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
27130 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
27140 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b  (&sNC, pHaving);
27150 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49  .    }.    sAggI
27160 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72  nfo.nAccumulator
27170 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   = sAggInfo.nCol
27180 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  umn;.    for(i=0
27190 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75  ; i<sAggInfo.nFu
271a0 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nc; i++){.      
271b0 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
271c0 50 72 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66  Property(sAggInf
271d0 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72  o.aFunc[i].pExpr
271e0 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
271f0 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
27200 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67  lags |= NC_InAgg
27210 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
27220 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
27230 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67  gList(&sNC, sAgg
27240 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45  Info.aFunc[i].pE
27250 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  xpr->x.pList);. 
27260 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
27270 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e   &= ~NC_InAggFun
27280 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  c;.    }.    sAg
27290 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20 70 50  gInfo.mxReg = pP
272a0 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
272b0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
272c0 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65 6c 65  iled ) goto sele
272d0 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f 2a 20  ct_end;..    /* 
272e0 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 61  Processing for a
272f0 67 67 72 65 67 61 74 65 73 20 77 69 74 68 20 47  ggregates with G
27300 52 4f 55 50 20 42 59 20 69 73 20 76 65 72 79 20  ROUP BY is very 
27310 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a 20 20  different and.  
27320 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65 20 63    ** much more c
27330 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67 67 72  omplex than aggr
27340 65 67 61 74 65 73 20 77 69 74 68 6f 75 74 20 61  egates without a
27350 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20 20 2a   GROUP BY..    *
27360 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  /.    if( pGroup
27370 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49  By ){.      KeyI
27380 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
27390 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f 72 6d  /* Keying inform
273a0 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 67 72  ation for the gr
273b0 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  oup by clause */
273c0 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b 20 20  .      int j1;  
273d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 2d             /* A-
273e0 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69 6f 6e  vs-B comparision
273f0 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20 20 69   jump */.      i
27400 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  nt addrOutputRow
27410 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 73  ;  /* Start of s
27420 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
27430 75 74 70 75 74 73 20 61 20 72 65 73 75 6c 74 20  utputs a result 
27440 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  row */.      int
27450 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b 20 20   regOutputRow;  
27460 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72 65   /* Return addre
27470 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20  ss register for 
27480 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e  output subroutin
27490 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  e */.      int a
274a0 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20 20 2f  ddrSetAbort;   /
274b0 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72 74 20  * Set the abort 
274c0 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72 6e 20  flag and return 
274d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
274e0 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f 2a 20  rTopOfLoop;  /* 
274f0 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70 75 74  Top of the input
27500 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
27510 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64  nt addrSortingId
27520 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f 70 65  x; /* The OP_Ope
27530 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72 20 74  nEphemeral for t
27540 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78  he sorting index
27550 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
27560 64 72 52 65 73 65 74 3b 20 20 20 20 20 20 2f 2a  drReset;      /*
27570 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20   Subroutine for 
27580 72 65 73 65 74 74 69 6e 67 20 74 68 65 20 61 63  resetting the ac
27590 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20 20 20  cumulator */.   
275a0 20 20 20 69 6e 74 20 72 65 67 52 65 73 65 74 3b     int regReset;
275b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
275c0 20 61 64 64 72 65 73 73 20 72 65 67 69 73 74 65   address registe
275d0 72 20 66 6f 72 20 72 65 73 65 74 20 73 75 62 72  r for reset subr
275e0 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20 20 20  outine */..     
275f0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
27600 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
27610 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65 64 20  e we might need 
27620 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
27630 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c  to.      ** impl
27640 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c 6f 63  ement it.  Alloc
27650 61 74 65 20 74 68 61 74 20 73 6f 72 74 69 6e 67  ate that sorting
27660 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49 66 20   index now.  If 
27670 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20 20 20  it turns out.   
27680 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
27690 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61 66 74   not need it aft
276a0 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50 5f 53  er all, the OP_S
276b0 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74 72 75  orterOpen instru
276c0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 77  ction.      ** w
276d0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
276e0 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20 20 0a   into a Noop.  .
276f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
27700 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49  AggInfo.sortingI
27710 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
27720 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  b++;.      pKeyI
27730 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46 72 6f  nfo = keyInfoFro
27740 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
27750 2c 20 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  , pGroupBy);.   
27760 20 20 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64     addrSortingId
27770 78 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  x = sqlite3VdbeA
27780 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp4(v, OP_Sort
27790 65 72 4f 70 65 6e 2c 20 0a 20 20 20 20 20 20 20  erOpen, .       
277a0 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
277b0 69 6e 67 49 64 78 2c 20 73 41 67 67 49 6e 66 6f  ingIdx, sAggInfo
277c0 2e 6e 53 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 2c  .nSortingColumn,
277d0 20 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 28   .          0, (
277e0 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c 20  char*)pKeyInfo, 
277f0 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P4_KEYINFO);..  
27800 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
27810 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  e memory locatio
27820 6e 73 20 75 73 65 64 20 62 79 20 47 52 4f 55 50  ns used by GROUP
27830 20 42 59 20 61 67 67 72 65 67 61 74 65 20 70 72   BY aggregate pr
27840 6f 63 65 73 73 69 6e 67 0a 20 20 20 20 20 20 2a  ocessing.      *
27850 2f 0a 20 20 20 20 20 20 69 55 73 65 46 6c 61 67  /.      iUseFlag
27860 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
27870 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f 72 74 46  m;.      iAbortF
27880 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
27890 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 4f  nMem;.      regO
278a0 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b 70 50 61  utputRow = ++pPa
278b0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
278c0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 20 3d   addrOutputRow =
278d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
278e0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
278f0 72 65 67 52 65 73 65 74 20 3d 20 2b 2b 70 50 61  regReset = ++pPa
27900 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
27910 20 61 64 64 72 52 65 73 65 74 20 3d 20 73 71 6c   addrReset = sql
27920 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
27930 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 41 4d 65  l(v);.      iAMe
27940 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
27950 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72   + 1;.      pPar
27960 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f  se->nMem += pGro
27970 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  upBy->nExpr;.   
27980 20 20 20 69 42 4d 65 6d 20 3d 20 70 50 61 72 73     iBMem = pPars
27990 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
279a0 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
279b0 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
279c0 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
279d0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
279e0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 41  P_Integer, 0, iA
279f0 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20 20 20  bortFlag);.     
27a00 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27a10 20 22 63 6c 65 61 72 20 61 62 6f 72 74 20 66 6c   "clear abort fl
27a20 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
27a30 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
27a40 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
27a50 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
27a60 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
27a70 2c 20 22 69 6e 64 69 63 61 74 65 20 61 63 63 75  , "indicate accu
27a80 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79 22 29 29  mulator empty"))
27a90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27aa0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
27ab0 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65 6d 2c 20  Null, 0, iAMem, 
27ac0 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42 79 2d 3e  iAMem+pGroupBy->
27ad0 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20 20 20 20  nExpr-1);..     
27ae0 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c 6f 6f 70   /* Begin a loop
27af0 20 74 68 61 74 20 77 69 6c 6c 20 65 78 74 72 61   that will extra
27b00 63 74 20 61 6c 6c 20 73 6f 75 72 63 65 20 72 6f  ct all source ro
27b10 77 73 20 69 6e 20 47 52 4f 55 50 20 42 59 20 6f  ws in GROUP BY o
27b20 72 64 65 72 2e 0a 20 20 20 20 20 20 2a 2a 20 54  rder..      ** T
27b30 68 69 73 20 6d 69 67 68 74 20 69 6e 76 6f 6c 76  his might involv
27b40 65 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 6c  e two separate l
27b50 6f 6f 70 73 20 77 69 74 68 20 61 6e 20 4f 50 5f  oops with an OP_
27b60 53 6f 72 74 20 69 6e 20 62 65 74 77 65 65 6e 2c  Sort in between,
27b70 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 74 20   or.      ** it 
27b80 6d 69 67 68 74 20 62 65 20 61 20 73 69 6e 67 6c  might be a singl
27b90 65 20 6c 6f 6f 70 20 74 68 61 74 20 75 73 65 73  e loop that uses
27ba0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 65 78 74   an index to ext
27bb0 72 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ract information
27bc0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  .      ** in the
27bd0 20 72 69 67 68 74 20 6f 72 64 65 72 20 74 6f 20   right order to 
27be0 62 65 67 69 6e 20 77 69 74 68 2e 0a 20 20 20 20  begin with..    
27bf0 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
27c00 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27c10 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
27c20 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
27c30 20 20 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73        pWInfo = s
27c40 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
27c50 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
27c60 74 2c 20 70 57 68 65 72 65 2c 20 70 47 72 6f 75  t, pWhere, pGrou
27c70 70 42 79 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  pBy, 0, .       
27c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c90 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 5f            WHERE_
27ca0 47 52 4f 55 50 42 59 2c 20 30 29 3b 0a 20 20 20  GROUPBY, 0);.   
27cb0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
27cc0 20 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65   ) goto select_e
27cd0 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  nd;.      if( sq
27ce0 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
27cf0 72 65 64 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  red(pWInfo) ){. 
27d00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70         /* The op
27d10 74 69 6d 69 7a 65 72 20 69 73 20 61 62 6c 65 20  timizer is able 
27d20 74 6f 20 64 65 6c 69 76 65 72 20 72 6f 77 73 20  to deliver rows 
27d30 69 6e 20 67 72 6f 75 70 20 62 79 20 6f 72 64 65  in group by orde
27d40 72 20 73 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  r so.        ** 
27d50 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  we do not have t
27d60 6f 20 73 6f 72 74 2e 20 20 54 68 65 20 4f 50 5f  o sort.  The OP_
27d70 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 74 61  OpenEphemeral ta
27d80 62 6c 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ble will be.    
27d90 20 20 20 20 2a 2a 20 63 61 6e 63 65 6c 6c 65 64      ** cancelled
27da0 20 6c 61 74 65 72 20 62 65 63 61 75 73 65 20 77   later because w
27db0 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
27dc0 75 73 65 20 74 68 65 20 70 4b 65 79 49 6e 66 6f  use the pKeyInfo
27dd0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
27de0 20 20 20 20 67 72 6f 75 70 42 79 53 6f 72 74 20      groupBySort 
27df0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
27e00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  {.        /* Row
27e10 73 20 61 72 65 20 63 6f 6d 69 6e 67 20 6f 75 74  s are coming out
27e20 20 69 6e 20 75 6e 64 65 74 65 72 6d 69 6e 65 64   in undetermined
27e30 20 6f 72 64 65 72 2e 20 20 57 65 20 68 61 76 65   order.  We have
27e40 20 74 6f 20 70 75 73 68 0a 20 20 20 20 20 20 20   to push.       
27e50 20 2a 2a 20 65 61 63 68 20 72 6f 77 20 69 6e 74   ** each row int
27e60 6f 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  o a sorting inde
27e70 78 2c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  x, terminate the
27e80 20 66 69 72 73 74 20 6c 6f 6f 70 2c 0a 20 20 20   first loop,.   
27e90 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 6c 6f 6f       ** then loo
27ea0 70 20 6f 76 65 72 20 74 68 65 20 73 6f 72 74 69  p over the sorti
27eb0 6e 67 20 69 6e 64 65 78 20 69 6e 20 6f 72 64 65  ng index in orde
27ec0 72 20 74 6f 20 67 65 74 20 74 68 65 20 6f 75 74  r to get the out
27ed0 70 75 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  put.        ** i
27ee0 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 0a 20  n sorted order. 
27ef0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
27f00 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 0a 20    int regBase;. 
27f10 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65         int regRe
27f20 63 6f 72 64 3b 0a 20 20 20 20 20 20 20 20 69 6e  cord;.        in
27f30 74 20 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t nCol;.        
27f40 69 6e 74 20 6e 47 72 6f 75 70 42 79 3b 0a 0a 20  int nGroupBy;.. 
27f50 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 54 65         explainTe
27f60 6d 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  mpTable(pParse, 
27f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 73 44  .            (sD
27f80 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 26  istinct.isTnct &
27f90 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 26 53  & (p->selFlags&S
27fa0 46 5f 44 69 73 74 69 6e 63 74 29 3d 3d 30 29 20  F_Distinct)==0) 
27fb0 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
27fc0 20 20 20 20 20 20 22 44 49 53 54 49 4e 43 54 22        "DISTINCT"
27fd0 20 3a 20 22 47 52 4f 55 50 20 42 59 22 29 3b 0a   : "GROUP BY");.
27fe0 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
27ff0 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
28000 20 20 6e 47 72 6f 75 70 42 79 20 3d 20 70 47 72    nGroupBy = pGr
28010 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  oupBy->nExpr;.  
28020 20 20 20 20 20 20 6e 43 6f 6c 20 3d 20 6e 47 72        nCol = nGr
28030 6f 75 70 42 79 20 2b 20 31 3b 0a 20 20 20 20 20  oupBy + 1;.     
28040 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b     j = nGroupBy+
28050 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  1;.        for(i
28060 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
28070 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
28080 20 20 20 20 20 20 20 20 69 66 28 20 73 41 67 67          if( sAgg
28090 49 6e 66 6f 2e 61 43 6f 6c 5b 69 5d 2e 69 53 6f  Info.aCol[i].iSo
280a0 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b  rterColumn>=j ){
280b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f  .            nCo
280c0 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l++;.           
280d0 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   j++;.          
280e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
280f0 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 73 71      regBase = sq
28100 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
28110 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6c 29 3b  e(pParse, nCol);
28120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28130 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70  ExprCacheClear(p
28140 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
28150 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45  sqlite3ExprCodeE
28160 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
28170 70 47 72 6f 75 70 42 79 2c 20 72 65 67 42 61 73  pGroupBy, regBas
28180 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
28190 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
281a0 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c  (v, OP_Sequence,
281b0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
281c0 67 49 64 78 2c 72 65 67 42 61 73 65 2b 6e 47 72  gIdx,regBase+nGr
281d0 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 20 20  oupBy);.        
281e0 6a 20 3d 20 6e 47 72 6f 75 70 42 79 2b 31 3b 0a  j = nGroupBy+1;.
281f0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
28200 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c   i<sAggInfo.nCol
28210 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
28220 20 20 20 20 20 73 74 72 75 63 74 20 41 67 67 49       struct AggI
28230 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f 6c 20 3d 20  nfo_col *pCol = 
28240 26 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69  &sAggInfo.aCol[i
28250 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
28260 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43 6f   pCol->iSorterCo
28270 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20  lumn>=j ){.     
28280 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
28290 6a 20 2b 20 72 65 67 42 61 73 65 3b 0a 20 20 20  j + regBase;.   
282a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 32 3b           int r2;
282b0 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 32  ..            r2
282c0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
282d0 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72  deGetColumn(pPar
282e0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
282f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28300 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61 62 2c 20      pCol->pTab, 
28310 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 70  pCol->iColumn, p
28320 43 6f 6c 2d 3e 69 54 61 62 6c 65 2c 20 72 31 2c  Col->iTable, r1,
28330 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
28340 20 69 66 28 20 72 31 21 3d 72 32 20 29 7b 0a 20   if( r1!=r2 ){. 
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
28360 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28370 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 32 2c 20  , OP_SCopy, r2, 
28380 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r1);.           
28390 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a   }.            j
283a0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ++;.          }.
283b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
283c0 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
283d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
283e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
283f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28400 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
28410 6f 72 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  ord, regBase, nC
28420 6f 6c 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ol, regRecord);.
28430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28440 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
28450 53 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 73 41  SorterInsert, sA
28460 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
28470 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
28480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
28490 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
284a0 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  rse, regRecord);
284b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
284c0 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
284d0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
284e0 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , nCol);.       
284f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
28500 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
28510 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69    sAggInfo.sorti
28520 6e 67 49 64 78 50 54 61 62 20 3d 20 73 6f 72 74  ngIdxPTab = sort
28530 50 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  PTab = pParse->n
28540 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Tab++;.        s
28550 6f 72 74 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ortOut = sqlite3
28560 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
28570 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
28580 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
28590 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20   OP_OpenPseudo, 
285a0 73 6f 72 74 50 54 61 62 2c 20 73 6f 72 74 4f 75  sortPTab, sortOu
285b0 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, nCol);.      
285c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
285d0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
285e0 53 6f 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Sort, sAggInfo.s
285f0 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 45  ortingIdx, addrE
28600 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  nd);.        Vdb
28610 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 47 52  eComment((v, "GR
28620 4f 55 50 20 42 59 20 73 6f 72 74 22 29 29 3b 0a  OUP BY sort"));.
28630 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
28640 2e 75 73 65 53 6f 72 74 69 6e 67 49 64 78 20 3d  .useSortingIdx =
28650 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
28660 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
28670 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  r(pParse);.     
28680 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76 61   }..      /* Eva
28690 6c 75 61 74 65 20 74 68 65 20 63 75 72 72 65 6e  luate the curren
286a0 74 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 73  t GROUP BY terms
286b0 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 62 30   and store in b0
286c0 2c 20 62 31 2c 20 62 32 2e 2e 2e 0a 20 20 20 20  , b1, b2....    
286d0 20 20 2a 2a 20 28 62 30 20 69 73 20 6d 65 6d 6f    ** (b0 is memo
286e0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 69 42 4d 65  ry location iBMe
286f0 6d 2b 30 2c 20 62 31 20 69 73 20 69 42 4d 65 6d  m+0, b1 is iBMem
28700 2b 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  +1, and so forth
28710 29 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ).      ** Then 
28720 63 6f 6d 70 61 72 65 20 74 68 65 20 63 75 72 72  compare the curr
28730 65 6e 74 20 47 52 4f 55 50 20 42 59 20 74 65 72  ent GROUP BY ter
28740 6d 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 47  ms against the G
28750 52 4f 55 50 20 42 59 20 74 65 72 6d 73 0a 20 20  ROUP BY terms.  
28760 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
28770 70 72 65 76 69 6f 75 73 20 72 6f 77 20 63 75 72  previous row cur
28780 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
28790 20 61 30 2c 20 61 31 2c 20 61 32 2e 2e 2e 0a 20   a0, a1, a2.... 
287a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64       */.      ad
287b0 64 72 54 6f 70 4f 66 4c 6f 6f 70 20 3d 20 73 71  drTopOfLoop = sq
287c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
287d0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
287e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
287f0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
28800 20 20 20 20 69 66 28 20 67 72 6f 75 70 42 79 53      if( groupByS
28810 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ort ){.        s
28820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
28830 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74  (v, OP_SorterDat
28840 61 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  a, sAggInfo.sort
28850 69 6e 67 49 64 78 2c 20 73 6f 72 74 4f 75 74 29  ingIdx, sortOut)
28860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28870 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 47 72 6f 75  for(j=0; j<pGrou
28880 70 42 79 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  pBy->nExpr; j++)
28890 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 72  {.        if( gr
288a0 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20  oupBySort ){.   
288b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
288c0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
288d0 6f 6c 75 6d 6e 2c 20 73 6f 72 74 50 54 61 62 2c  olumn, sortPTab,
288e0 20 6a 2c 20 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20   j, iBMem+j);.  
288f0 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30          if( j==0
28900 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
28910 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
28920 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a 20 20  _CLEARCACHE);.  
28930 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28940 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
28950 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31 3b 0a  directMode = 1;.
28960 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
28970 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
28980 2c 20 70 47 72 6f 75 70 42 79 2d 3e 61 5b 6a 5d  , pGroupBy->a[j]
28990 2e 70 45 78 70 72 2c 20 69 42 4d 65 6d 2b 6a 29  .pExpr, iBMem+j)
289a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
289b0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
289c0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
289d0 50 5f 43 6f 6d 70 61 72 65 2c 20 69 41 4d 65 6d  P_Compare, iAMem
289e0 2c 20 69 42 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iBMem, pGroupB
289f0 79 2d 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20  y->nExpr,.      
28a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a10 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74      (char*)sqlit
28a20 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65  e3KeyInfoRef(pKe
28a30 79 49 6e 66 6f 29 2c 20 50 34 5f 4b 45 59 49 4e  yInfo), P4_KEYIN
28a40 46 4f 29 3b 0a 20 20 20 20 20 20 6a 31 20 3d 20  FO);.      j1 = 
28a50 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
28a60 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
28a70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28a80 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a  p3(v, OP_Jump, j
28a90 31 2b 31 2c 20 30 2c 20 6a 31 2b 31 29 3b 0a 0a  1+1, 0, j1+1);..
28aa0 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
28ab0 65 20 63 6f 64 65 20 74 68 61 74 20 72 75 6e 73  e code that runs
28ac0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 47 52   whenever the GR
28ad0 4f 55 50 20 42 59 20 63 68 61 6e 67 65 73 2e 0a  OUP BY changes..
28ae0 20 20 20 20 20 20 2a 2a 20 43 68 61 6e 67 65 73        ** Changes
28af0 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42 59   in the GROUP BY
28b00 20 61 72 65 20 64 65 74 65 63 74 65 64 20 62 79   are detected by
28b10 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f   the previous co
28b20 64 65 0a 20 20 20 20 20 20 2a 2a 20 62 6c 6f 63  de.      ** bloc
28b30 6b 2e 20 20 49 66 20 74 68 65 72 65 20 77 65 72  k.  If there wer
28b40 65 20 6e 6f 20 63 68 61 6e 67 65 73 2c 20 74 68  e no changes, th
28b50 69 73 20 62 6c 6f 63 6b 20 69 73 20 73 6b 69 70  is block is skip
28b60 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ped..      **.  
28b70 20 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 64 65      ** This code
28b80 20 63 6f 70 69 65 73 20 63 75 72 72 65 6e 74 20   copies current 
28b90 67 72 6f 75 70 20 62 79 20 74 65 72 6d 73 20 69  group by terms i
28ba0 6e 20 62 30 2c 62 31 2c 62 32 2c 2e 2e 2e 0a 20  n b0,b1,b2,.... 
28bb0 20 20 20 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20       ** over to 
28bc0 61 30 2c 61 31 2c 61 32 2e 20 20 49 74 20 74 68  a0,a1,a2.  It th
28bd0 65 6e 20 63 61 6c 6c 73 20 74 68 65 20 6f 75 74  en calls the out
28be0 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 0a 20  put subroutine. 
28bf0 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65       ** and rese
28c00 74 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  ts the aggregate
28c10 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72 65 67   accumulator reg
28c20 69 73 74 65 72 73 20 69 6e 20 70 72 65 70 61 72  isters in prepar
28c30 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 66  ation.      ** f
28c40 6f 72 20 74 68 65 20 6e 65 78 74 20 47 52 4f 55  or the next GROU
28c50 50 20 42 59 20 62 61 74 63 68 2e 0a 20 20 20 20  P BY batch..    
28c60 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
28c70 65 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70  e3ExprCodeMove(p
28c80 50 61 72 73 65 2c 20 69 42 4d 65 6d 2c 20 69 41  Parse, iBMem, iA
28c90 4d 65 6d 2c 20 70 47 72 6f 75 70 42 79 2d 3e 6e  Mem, pGroupBy->n
28ca0 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  Expr);.      sql
28cb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28cc0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f  , OP_Gosub, regO
28cd0 75 74 70 75 74 52 6f 77 2c 20 61 64 64 72 4f 75  utputRow, addrOu
28ce0 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  tputRow);.      
28cf0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
28d00 22 6f 75 74 70 75 74 20 6f 6e 65 20 72 6f 77 22  "output one row"
28d10 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
28d20 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
28d30 50 5f 49 66 50 6f 73 2c 20 69 41 62 6f 72 74 46  P_IfPos, iAbortF
28d40 6c 61 67 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  lag, addrEnd);. 
28d50 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
28d60 28 28 76 2c 20 22 63 68 65 63 6b 20 61 62 6f 72  ((v, "check abor
28d70 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
28d80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28d90 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
28da0 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65  regReset, addrRe
28db0 73 65 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65  set);.      Vdbe
28dc0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 73  Comment((v, "res
28dd0 65 74 20 61 63 63 75 6d 75 6c 61 74 6f 72 22 29  et accumulator")
28de0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
28df0 61 74 65 20 74 68 65 20 61 67 67 72 65 67 61 74  ate the aggregat
28e00 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 73 20 62  e accumulators b
28e10 61 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74  ased on the cont
28e20 65 6e 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ent of.      ** 
28e30 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 0a  the current row.
28e40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
28e50 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
28e60 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 20  re(v, j1);.     
28e70 20 75 70 64 61 74 65 41 63 63 75 6d 75 6c 61 74   updateAccumulat
28e80 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
28e90 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
28ea0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
28eb0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
28ec0 20 69 55 73 65 46 6c 61 67 29 3b 0a 20 20 20 20   iUseFlag);.    
28ed0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
28ee0 2c 20 22 69 6e 64 69 63 61 74 65 20 64 61 74 61  , "indicate data
28ef0 20 69 6e 20 61 63 63 75 6d 75 6c 61 74 6f 72 22   in accumulator"
28f00 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 6e  ));..      /* En
28f10 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
28f20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
28f30 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a   groupBySort ){.
28f40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
28f50 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
28f60 53 6f 72 74 65 72 4e 65 78 74 2c 20 73 41 67 67  SorterNext, sAgg
28f70 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c  Info.sortingIdx,
28f80 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 29 3b   addrTopOfLoop);
28f90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
28fb0 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
28fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
28fd0 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
28fe0 2c 20 61 64 64 72 53 6f 72 74 69 6e 67 49 64 78  , addrSortingIdx
28ff0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
29000 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
29010 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20 72 65 73  final row of res
29020 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ult.      */.   
29030 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
29040 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
29050 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20  , regOutputRow, 
29060 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
29070 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
29080 74 28 28 76 2c 20 22 6f 75 74 70 75 74 20 66 69  t((v, "output fi
29090 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a 20 20 20  nal row"));..   
290a0 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76 65 72 20     /* Jump over 
290b0 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 73 0a  the subroutines.
290c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
290d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
290e0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
290f0 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20 20 20 20  addrEnd);..     
29100 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
29110 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6f  ubroutine that o
29120 75 74 70 75 74 73 20 61 20 73 69 6e 67 6c 65 20  utputs a single 
29130 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c  row of the resul
29140 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
29150 20 54 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   This subroutine
29160 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20 61 74 20   first looks at 
29170 74 68 65 20 69 55 73 65 46 6c 61 67 2e 20 20 49  the iUseFlag.  I
29180 66 20 69 55 73 65 46 6c 61 67 0a 20 20 20 20 20  f iUseFlag.     
29190 20 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e   ** is less than
291a0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
291b0 6f 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  o, the subroutin
291c0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
291d0 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70  f.      ** the p
291e0 72 6f 63 65 73 73 69 6e 67 20 63 61 6c 6c 73 20  rocessing calls 
291f0 66 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f  for the query to
29200 20 61 62 6f 72 74 2c 20 74 68 69 73 20 73 75 62   abort, this sub
29210 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
29220 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
29230 69 41 62 6f 72 74 46 6c 61 67 20 6d 65 6d 6f 72  iAbortFlag memor
29240 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  y location befor
29250 65 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 0a 20  e returning in. 
29260 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 6f       ** order to
29270 20 73 69 67 6e 61 6c 20 74 68 65 20 63 61 6c 6c   signal the call
29280 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a 20 20 20  er to abort..   
29290 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 64 64 72     */.      addr
292a0 53 65 74 41 62 6f 72 74 20 3d 20 73 71 6c 69 74  SetAbort = sqlit
292b0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
292c0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
292d0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
292e0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
292f0 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20 20  iAbortFlag);.   
29300 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
29310 76 2c 20 22 73 65 74 20 61 62 6f 72 74 20 66 6c  v, "set abort fl
29320 61 67 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ag"));.      sql
29330 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
29340 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
29350 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20 20  OutputRow);.    
29360 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
29370 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
29380 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20 20  rOutputRow);.   
29390 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77     addrOutputRow
293a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
293b0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
293c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
293d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp2(v, OP_IfPo
293e0 73 2c 20 69 55 73 65 46 6c 61 67 2c 20 61 64 64  s, iUseFlag, add
293f0 72 4f 75 74 70 75 74 52 6f 77 2b 32 29 3b 0a 20  rOutputRow+2);. 
29400 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
29410 28 28 76 2c 20 22 47 72 6f 75 70 62 79 20 72 65  ((v, "Groupby re
29420 73 75 6c 74 20 67 65 6e 65 72 61 74 6f 72 20 65  sult generator e
29430 6e 74 72 79 20 70 6f 69 6e 74 22 29 29 3b 0a 20  ntry point"));. 
29440 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
29450 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
29460 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
29470 77 29 3b 0a 20 20 20 20 20 20 66 69 6e 61 6c 69  w);.      finali
29480 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70  zeAggFunctions(p
29490 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
294a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
294b0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
294c0 73 65 2c 20 70 48 61 76 69 6e 67 2c 20 61 64 64  se, pHaving, add
294d0 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 53 51  rOutputRow+1, SQ
294e0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
294f0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
29500 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
29510 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c  p, p->pEList, 0,
29520 20 30 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20   0, pOrderBy,.  
29530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29540 20 20 20 20 26 73 44 69 73 74 69 6e 63 74 2c 20      &sDistinct, 
29550 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20  pDest,.         
29560 20 20 20 20 20 20 20 20 20 20 20 20 20 61 64 64               add
29570 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20 61 64  rOutputRow+1, ad
29580 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20 20 20  drSetAbort);.   
29590 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
295a0 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72  dOp1(v, OP_Retur
295b0 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29  n, regOutputRow)
295c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
295d0 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67 72 6f  ent((v, "end gro
295e0 75 70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65  upby result gene
295f0 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20  rator"));..     
29600 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 73   /* Generate a s
29610 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  ubroutine that w
29620 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20 67 72  ill reset the gr
29630 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c 61 74  oup-by accumulat
29640 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  or.      */.    
29650 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
29660 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
29670 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72  rReset);.      r
29680 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f 72 28  esetAccumulator(
29690 70 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66  pParse, &sAggInf
296a0 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
296b0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
296c0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 73  P_Return, regRes
296d0 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20 20 7d  et);.     .    }
296e0 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f 75 70   /* endif pGroup
296f0 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67 72 65  By.  Begin aggre
29700 67 61 74 65 20 71 75 65 72 69 65 73 20 77 69 74  gate queries wit
29710 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a 20 2a  hout GROUP BY: *
29720 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20  /.    else {.   
29730 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 65     ExprList *pDe
29740 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  l = 0;.#ifndef S
29750 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45  QLITE_OMIT_BTREE
29760 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61 62 6c  COUNT.      Tabl
29770 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 69  e *pTab;.      i
29780 66 28 20 28 70 54 61 62 20 3d 20 69 73 53 69 6d  f( (pTab = isSim
29790 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73 41 67  pleCount(p, &sAg
297a0 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a 20 20  gInfo))!=0 ){.  
297b0 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73 53 69        /* If isSi
297c0 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65 74 75  mpleCount() retu
297d0 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
297e0 20 61 20 54 61 62 6c 65 20 73 74 72 75 63 74 75   a Table structu
297f0 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  re, then.       
29800 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74   ** the SQL stat
29810 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  ement is of the 
29820 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20 2a 2a  form:.        **
29830 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45  .        **   SE
29840 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
29850 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20 20 20  OM <tbl>.       
29860 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77   **.        ** w
29870 68 65 72 65 20 74 68 65 20 54 61 62 6c 65 20 73  here the Table s
29880 74 72 75 63 74 75 72 65 20 72 65 74 75 72 6e 65  tructure returne
29890 64 20 72 65 70 72 65 73 65 6e 74 73 20 74 61 62  d represents tab
298a0 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20 20 20  le <tbl>..      
298b0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
298c0 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
298d0 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68 61 74  s so common that
298e0 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a 65 64   it is optimized
298f0 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68 65 0a   specially. The.
29900 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f 43 6f          ** OP_Co
29910 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  unt instruction 
29920 69 73 20 65 78 65 63 75 74 65 64 20 65 69 74 68  is executed eith
29930 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b 65 79  er on the intkey
29940 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20 20 20   table that.    
29950 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
29960 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 61 62  the data for tab
29970 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e 20 6f  le <tbl> or on o
29980 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65 78 65  ne of its indexe
29990 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20 2a 2a  s. It.        **
299a0 20 69 73 20 62 65 74 74 65 72 20 74 6f 20 65 78   is better to ex
299b0 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f 6e 20  ecute the op on 
299c0 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69 6e 64  an index, as ind
299d0 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73 74 0a  exes are almost.
299e0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79          ** alway
299f0 73 20 73 70 72 65 61 64 20 61 63 72 6f 73 73 20  s spread across 
29a00 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 6e 20  less pages than 
29a10 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64  their correspond
29a20 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20 20 20  ing tables..    
29a30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
29a40 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d 20 73  onst int iDb = s
29a50 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
29a60 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
29a70 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
29a80 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e          const in
29a90 74 20 69 43 73 72 20 3d 20 70 50 61 72 73 65 2d  t iCsr = pParse-
29aa0 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20  >nTab++;     /* 
29ab0 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 62  Cursor to scan b
29ac0 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20 20 20  -tree */.       
29ad0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20   Index *pIdx;   
29ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29af0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
29b00 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
29b10 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
29b20 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20  KeyInfo = 0;    
29b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65             /* Ke
29b40 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e 6e 65  yinfo for scanne
29b50 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  d index */.     
29b60 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74 20     Index *pBest 
29b70 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
29b80 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
29b90 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f 20 66  index found so f
29ba0 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ar */.        in
29bb0 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62 2d 3e  t iRoot = pTab->
29bc0 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  tnum;           
29bd0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
29be0 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74 72 65  of scanned b-tre
29bf0 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 73 71  e */..        sq
29c00 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
29c10 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
29c20 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
29c30 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
29c40 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
29c50 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
29c60 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  Name);..        
29c70 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
29c80 65 20 69 6e 64 65 78 20 74 68 61 74 20 68 61 73  e index that has
29c90 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63 61 6e   the lowest scan
29ca0 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20 20 2a   cost..        *
29cb0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
29cc0 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e 6f 74  11-04-15) Do not
29cd0 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61 6e 20   do a full scan 
29ce0 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65 64 20  of an unordered 
29cf0 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
29d00 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 32 30  *.        ** (20
29d10 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e 6f 74  13-10-03) Do not
29d20 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74 72 69   count the entri
29d30 65 73 20 69 6e 20 61 20 70 61 72 74 69 61 6c 20  es in a partial 
29d40 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
29d50 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20  *.        ** In 
29d60 70 72 61 63 74 69 63 65 20 74 68 65 20 4b 65 79  practice the Key
29d70 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 77  Info structure w
29d80 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65 64 2e  ill not be used.
29d90 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20 20 20   It is only .   
29da0 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64 20 74       ** passed t
29db0 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e 52 65  o keep OP_OpenRe
29dc0 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20 20 20  ad happy..      
29dd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
29de0 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
29df0 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c 69 74   ) pBest = sqlit
29e00 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
29e10 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
29e20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
29e30 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
29e40 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
29e50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
29e60 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d  Idx->bUnordered=
29e70 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
29e80 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c   pIdx->szIdxRow<
29e90 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 0a 20  pTab->szTabRow. 
29ea0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 49 64            && pId
29eb0 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
29ec0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26  ==0.           &
29ed0 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70 49 64  & (!pBest || pId
29ee0 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42 65 73  x->szIdxRow<pBes
29ef0 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20 20 20  t->szIdxRow).   
29f00 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
29f10 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 49        pBest = pI
29f20 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  dx;.          }.
29f30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29f40 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a 20    if( pBest ){. 
29f50 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74 20 3d           iRoot =
29f60 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a 20 20   pBest->tnum;.  
29f70 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f          pKeyInfo
29f80 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
29f90 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
29fa0 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20 20   pBest);.       
29fb0 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   }..        /* O
29fc0 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  pen a read-only 
29fd0 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74 65 20  cursor, execute 
29fe0 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20 63 6c  the OP_Count, cl
29ff0 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e 20  ose the cursor. 
2a000 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
2a010 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
2a020 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20  v, OP_OpenRead, 
2a030 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69 44 62  iCsr, iRoot, iDb
2a040 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
2a050 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20  ( pKeyInfo ){.  
2a060 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2a070 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
2a080 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65 79 49  1, (char *)pKeyI
2a090 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2a0a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2a0b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2a0c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 75 6e  ddOp2(v, OP_Coun
2a0d0 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49 6e 66  t, iCsr, sAggInf
2a0e0 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65 6d 29  o.aFunc[0].iMem)
2a0f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2a100 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2a110 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29 3b 0a  P_Close, iCsr);.
2a120 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53          explainS
2a130 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61 72 73  impleCount(pPars
2a140 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74 29 3b  e, pTab, pBest);
2a150 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
2a160 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2a170 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20 2a 2f  IT_BTREECOUNT */
2a180 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
2a190 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
2a1a0 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f 6e 65   query is of one
2a1b0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2a1c0 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20 20 20  g forms:.       
2a1d0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2a1e0 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 46   SELECT min(x) F
2a1f0 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20  ROM ....        
2a200 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61 78 28  **   SELECT max(
2a210 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20  x) FROM ....    
2a220 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2a230 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e  * If it is, then
2a240 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20 69 6e   ask the code in
2a250 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74 74 65   where.c to atte
2a260 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65 73 75  mpt to sort resu
2a270 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  lts.        ** a
2a280 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
2a290 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22 20 6f  n "ORDER ON x" o
2a2a0 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20 44 45  r "ORDER ON x DE
2a2b0 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20 20 20  SC" clause. .   
2a2c0 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65 72 65       ** If where
2a2d0 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20 70 72  .c is able to pr
2a2e0 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20 73 6f  oduce results so
2a2f0 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f 72 64  rted in this ord
2a300 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20  er, then.       
2a310 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63 6f 64   ** add vdbe cod
2a320 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  e to break out o
2a330 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67  f the processing
2a340 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68 65 20   loop after the 
2a350 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69 72 73  .        ** firs
2a360 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73 69 6e  t iteration (sin
2a370 63 65 20 74 68 65 20 66 69 72 73 74 20 69 74 65  ce the first ite
2a380 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f  ration of the lo
2a390 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  op is .        *
2a3a0 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
2a3b0 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 72  operate on the r
2a3c0 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69 6e 69  ow with the mini
2a3d0 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d 20 0a  mum or maximum .
2a3e0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
2a3f0 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c 79 20   of x, the only 
2a400 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e 0a 20  row required).. 
2a410 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2a420 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 66    ** A special f
2a430 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61 73 73  lag must be pass
2a440 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
2a450 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73 6c 69  reBegin() to sli
2a460 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20 2a 2a  ghtly.        **
2a470 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69 6f 72   modify behavior
2a480 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   as follows:.   
2a490 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2a4a0 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20 71 75  **   + If the qu
2a4b0 65 72 79 20 69 73 20 61 20 22 53 45 4c 45 43 54  ery is a "SELECT
2a4c0 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e 20 74   min(x)", then t
2a4d0 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20 62 79  he loop coded by
2a4e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2a4f0 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64 20 6e  where.c should n
2a500 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ot iterate over 
2a510 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74 68 20  any values with 
2a520 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20 20 20  a NULL value.   
2a530 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f 72 20       **     for 
2a540 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  x..        **.  
2a550 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54 68 65        **   + The
2a560 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64 65 20   optimizer code 
2a570 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68 65 20  in where.c (the 
2a580 74 68 69 6e 67 20 74 68 61 74 20 64 65 63 69 64  thing that decid
2a590 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 20  es which.       
2a5a0 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20 6f 72   **     index or
2a5b0 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73 65 29   indices to use)
2a5c0 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20 61 20   should place a 
2a5d0 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f 72 69  different priori
2a5e0 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20 20 2a  ty on .        *
2a5f0 2a 20 20 20 20 20 73 61 74 69 73 66 79 69 6e 67  *     satisfying
2a600 20 74 68 65 20 27 4f 52 44 45 52 20 42 59 27 20   the 'ORDER BY' 
2a610 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74 20 64  clause than it d
2a620 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63 61 73  oes in other cas
2a630 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  es..        **  
2a640 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f 64 65     Refer to code
2a650 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20 69 6e   and comments in
2a660 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64 65 74   where.c for det
2a670 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ails..        */
2a680 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
2a690 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a  t *pMinMax = 0;.
2a6a0 20 20 20 20 20 20 20 20 75 38 20 66 6c 61 67 20          u8 flag 
2a6b0 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  = WHERE_ORDERBY_
2a6c0 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 20 20  NORMAL;.        
2a6d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a6e0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20   p->pGroupBy==0 
2a6f0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2a700 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a 20 20  t( flag==0 );.  
2a710 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61        if( p->pHa
2a720 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ving==0 ){.     
2a730 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69 6e 4d       flag = minM
2a740 61 78 51 75 65 72 79 28 26 73 41 67 67 49 6e 66  axQuery(&sAggInf
2a750 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a 20 20  o, &pMinMax);.  
2a760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a770 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20  assert( flag==0 
2a780 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30 20 26  || (pMinMax!=0 &
2a790 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72  & pMinMax->nExpr
2a7a0 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20 20 20  ==1) );..       
2a7b0 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20 20 20   if( flag ){.   
2a7c0 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d         pMinMax =
2a7d0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2a7e0 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61 78 2c  Dup(db, pMinMax,
2a7f0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
2a800 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b 0a 20  Del = pMinMax;. 
2a810 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 69           if( pMi
2a820 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d 61 6c  nMax && !db->mal
2a830 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
2a840 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
2a850 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
2a860 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45 5f 4f   = flag!=WHERE_O
2a870 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a 30 3b  RDERBY_MIN ?1:0;
2a880 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
2a890 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  nMax->a[0].pExpr
2a8a0 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
2a8b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a8c0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
2a8d0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
2a8e0 72 75 6e 73 20 69 66 20 74 68 65 20 61 67 67 72  runs if the aggr
2a8f0 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47 52 4f  egate has no GRO
2a900 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  UP BY clause.  T
2a910 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
2a920 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75 63 68  ocessing is much
2a930 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65 20 74   simpler since t
2a940 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 73  here is only a s
2a950 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20 20  ingle row.      
2a960 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74 2e 0a    ** of output..
2a970 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2a980 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
2a990 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
2a9a0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  gInfo);.        
2a9b0 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
2a9c0 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
2a9d0 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68  e, pTabList, pWh
2a9e0 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30 2c 66  ere, pMinMax,0,f
2a9f0 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  lag,0);.        
2aa00 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20 29 7b  if( pWInfo==0 ){
2aa10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2aa20 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
2aa30 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20 20 20  (db, pDel);.    
2aa40 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63        goto selec
2aa50 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  t_end;.        }
2aa60 0a 20 20 20 20 20 20 20 20 75 70 64 61 74 65 41  .        updateA
2aa70 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61 72 73  ccumulator(pPars
2aa80 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20  e, &sAggInfo);. 
2aa90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2aaa0 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70 4d 69  MinMax==0 || pMi
2aab0 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  nMax->nExpr==1 )
2aac0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2aad0 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
2aae0 72 65 64 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  red(pWInfo) ){. 
2aaf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2ab00 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2ab10 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69 74 65  _Goto, 0, sqlite
2ab20 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65 6c  3WhereBreakLabel
2ab30 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  (pWInfo));.     
2ab40 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2ab50 28 28 76 2c 20 22 25 73 28 29 20 62 79 20 69 6e  ((v, "%s() by in
2ab60 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  dex",.          
2ab70 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57 48 45        (flag==WHE
2ab80 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 3f 22  RE_ORDERBY_MIN?"
2ab90 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b 0a 20  min":"max")));. 
2aba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2abb0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2abc0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  (pWInfo);.      
2abd0 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e    finalizeAggFun
2abe0 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c 20 26  ctions(pParse, &
2abf0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2ac00 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64 65 72   }..      pOrder
2ac10 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  By = 0;.      sq
2ac20 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
2ac30 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
2ac40 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c 49 54  , addrEnd, SQLIT
2ac50 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
2ac60 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e 65 72       selectInner
2ac70 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Loop(pParse, p, 
2ac80 70 2d 3e 70 45 4c 69 73 74 2c 20 30 2c 20 30 2c  p->pEList, 0, 0,
2ac90 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
2acb0 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  est, addrEnd, ad
2acc0 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71  drEnd);.      sq
2acd0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2ace0 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
2acf0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2ad00 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2ad10 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
2ad20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
2ad30 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
2ad40 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69  */..  if( sDisti
2ad50 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57  nct.eTnctType==W
2ad60 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2ad70 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65  ORDERED ){.    e
2ad80 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
2ad90 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2ada0 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  T");.  }..  /* I
2adb0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
2adc0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2add0 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
2ade0 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
2adf0 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
2ae00 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
2ae10 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
2ae20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
2ae30 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  By ){.    explai
2ae40 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
2ae50 65 2c 20 22 4f 52 44 45 52 20 42 59 22 29 3b 0a  e, "ORDER BY");.
2ae60 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
2ae70 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
2ae80 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
2ae90 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
2aea0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
2aeb0 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
2aec0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
2aed0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2aee0 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
2aef0 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
2af00 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
2af10 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
2af20 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
2af30 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
2af40 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
2af50 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
2af60 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
2af70 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
2af80 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
2af90 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
2afa0 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
2afb0 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
2afc0 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
2afd0 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53  _end:.  explainS
2afe0 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
2aff0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
2b000 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
2b010 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
2b020 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72  olumn names if r
2b030 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45  esults of the SE
2b040 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f  LECT are to be o
2b050 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  utput..  */.  if
2b060 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b070 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  && pDest->eDest=
2b080 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
2b090 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
2b0a0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
2b0b0 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
2b0c0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2b0d0 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
2b0e0 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
2b0f0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
2b100 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
2b110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b120 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2b130 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
2b140 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65  XPLAIN)./*.** Ge
2b150 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72  nerate a human-r
2b160 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70 74  eadable descript
2b170 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65 6c  ion of a the Sel
2b180 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ect object..*/.s
2b190 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
2b1a0 69 6e 4f 6e 65 53 65 6c 65 63 74 28 56 64 62 65  inOneSelect(Vdbe
2b1b0 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20   *pVdbe, Select 
2b1c0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  *p){.  sqlite3Ex
2b1d0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2b1e0 65 2c 20 22 53 45 4c 45 43 54 20 22 29 3b 0a 20  e, "SELECT ");. 
2b1f0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2b200 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
2b210 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
2b220 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  .    if( p->selF
2b230 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2b240 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
2b250 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2b260 28 70 56 64 62 65 2c 20 22 44 49 53 54 49 4e 43  (pVdbe, "DISTINC
2b270 54 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  T ");.    }.    
2b280 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2b290 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
2b2a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2b2b0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2b2c0 62 65 2c 20 22 61 67 67 5f 66 6c 61 67 20 22 29  be, "agg_flag ")
2b2d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2b2e0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2b2f0 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  be);.    sqlite3
2b300 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2b310 64 62 65 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d  dbe, "   ");.  }
2b320 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2b330 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c  nExprList(pVdbe,
2b340 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73   p->pEList);.  s
2b350 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2b360 70 56 64 62 65 29 3b 0a 20 20 69 66 28 20 70 2d  pVdbe);.  if( p-
2b370 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63  >pSrc && p->pSrc
2b380 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e  ->nSrc ){.    in
2b390 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
2b3a0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2b3b0 64 62 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20  dbe, "FROM ");. 
2b3c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2b3d0 6e 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20  nPush(pVdbe);.  
2b3e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2b3f0 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
2b400 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
2b410 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2b420 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61  em = &p->pSrc->a
2b430 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [i];.      sqlit
2b440 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2b450 70 56 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d  pVdbe, "{%d,*} =
2b460 20 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73   ", pItem->iCurs
2b470 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  or);.      if( p
2b480 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
2b490 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b4a0 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 56  ExplainSelect(pV
2b4b0 64 62 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  dbe, pItem->pSel
2b4c0 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ect);.        if
2b4d0 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b  ( pItem->pTab ){
2b4e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2b4f0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2b500 70 56 64 62 65 2c 20 22 20 28 74 61 62 6e 61 6d  pVdbe, " (tabnam
2b510 65 3d 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70  e=%s)", pItem->p
2b520 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
2b530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2b540 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
2b550 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
2b560 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2b570 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 22 2c  ntf(pVdbe, "%s",
2b580 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
2b590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2b5a0 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
2b5b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2b5c0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2b5d0 70 56 64 62 65 2c 20 22 20 28 41 53 20 25 73 29  pVdbe, " (AS %s)
2b5e0 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
2b5f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2b600 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e   if( pItem->join
2b610 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29  type & JT_LEFT )
2b620 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2b630 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2b640 56 64 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49  Vdbe, " LEFT-JOI
2b650 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  N");.      }.   
2b660 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2b670 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20  nNL(pVdbe);.    
2b680 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
2b690 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a  lainPop(pVdbe);.
2b6a0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68    }.  if( p->pWh
2b6b0 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
2b6c0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2b6d0 70 56 64 62 65 2c 20 22 57 48 45 52 45 20 22 29  pVdbe, "WHERE ")
2b6e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2b6f0 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
2b700 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
2b710 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2b720 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
2b730 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  f( p->pGroupBy )
2b740 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2b750 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2b760 2c 20 22 47 52 4f 55 50 42 59 20 22 29 3b 0a 20  , "GROUPBY ");. 
2b770 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2b780 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c  nExprList(pVdbe,
2b790 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20   p->pGroupBy);. 
2b7a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2b7b0 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2b7c0 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
2b7d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2b7e0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2b7f0 62 65 2c 20 22 48 41 56 49 4e 47 20 22 29 3b 0a  be, "HAVING ");.
2b800 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2b810 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
2b820 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  >pHaving);.    s
2b830 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2b840 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
2b850 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
2b860 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2b870 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2b880 20 22 4f 52 44 45 52 42 59 20 22 29 3b 0a 20 20   "ORDERBY ");.  
2b890 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2b8a0 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20  ExprList(pVdbe, 
2b8b0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
2b8c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2b8d0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
2b8e0 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
2b8f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2b900 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2b910 2c 20 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20  , "LIMIT ");.   
2b920 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
2b930 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c  xpr(pVdbe, p->pL
2b940 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
2b950 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2b960 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2b970 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
2b980 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2b990 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 46 46  intf(pVdbe, "OFF
2b9a0 53 45 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  SET ");.    sqli
2b9b0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2b9c0 56 64 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74  Vdbe, p->pOffset
2b9d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2b9e0 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2b9f0 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
2ba00 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28  e3ExplainSelect(
2ba10 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c  Vdbe *pVdbe, Sel
2ba20 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
2ba30 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2ba40 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2ba50 70 56 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65  pVdbe, "(null-se
2ba60 6c 65 63 74 29 22 29 3b 0a 20 20 20 20 72 65 74  lect)");.    ret
2ba70 75 72 6e 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  urn;.  }.  while
2ba80 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ( p->pPrior ){. 
2ba90 20 20 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e     p->pPrior->pN
2baa0 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d  ext = p;.    p =
2bab0 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a   p->pPrior;.  }.
2bac0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2bad0 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20 77  Push(pVdbe);.  w
2bae0 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 65  hile( p ){.    e
2baf0 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28  xplainOneSelect(
2bb00 70 56 64 62 65 2c 20 70 29 3b 0a 20 20 20 20 70  pVdbe, p);.    p
2bb10 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
2bb20 20 69 66 28 20 70 3d 3d 30 20 29 20 62 72 65 61   if( p==0 ) brea
2bb30 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  k;.    sqlite3Ex
2bb40 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2bb50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2bb60 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2bb70 22 25 73 5c 6e 22 2c 20 73 65 6c 65 63 74 4f 70  "%s\n", selectOp
2bb80 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
2bb90 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  }.  sqlite3Expla
2bba0 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20  inPrintf(pVdbe, 
2bbb0 22 45 4e 44 22 29 3b 0a 20 20 73 71 6c 69 74 65  "END");.  sqlite
2bbc0 33 45 78 70 6c 61 69 6e 50 6f 70 28 70 56 64 62  3ExplainPop(pVdb
2bbd0 65 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e 64 20 6f 66  e);.}../* End of
2bbe0 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 64   the structure d
2bbf0 65 62 75 67 20 70 72 69 6e 74 69 6e 67 20 63 6f  ebug printing co
2bc00 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  de.*************
2bc10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bc20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bc30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bc40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2bc50 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
2bc60 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
2bc70 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 20  E_TREE_EXPLAIN) 
2bc80 2a 2f 0a                                         */.