/ Hex Artifact Content
Login

Artifact 50961f0d0ab8f2d45ff29ec5f91d8db221330ca7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20 74 6f  the parser.** to
01c0: 20 68 61 6e 64 6c 65 20 53 45 4c 45 43 54 20 73   handle SELECT s
01d0: 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 53 51 4c  tatements in SQL
01e0: 69 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ite..*/.#include
01f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0200: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c  ./*.** Delete al
0210: 6c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  l the content of
0220: 20 61 20 53 65 6c 65 63 74 20 73 74 72 75 63 74   a Select struct
0230: 75 72 65 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ure but do not d
0240: 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 74 68 65  eallocate.** the
0250: 20 73 65 6c 65 63 74 20 73 74 72 75 63 74 75 72   select structur
0260: 65 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74 61  e itself..*/.sta
0270: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 53 65  tic void clearSe
0280: 6c 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  lect(sqlite3 *db
0290: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  , Select *p){.  
02a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
02b0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 45 4c  elete(db, p->pEL
02c0: 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
02d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
02e0: 20 70 2d 3e 70 53 72 63 29 3b 0a 20 20 73 71 6c   p->pSrc);.  sql
02f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0300: 62 2c 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20  b, p->pWhere);. 
0310: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
0320: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 47  Delete(db, p->pG
0330: 72 6f 75 70 42 79 29 3b 0a 20 20 73 71 6c 69 74  roupBy);.  sqlit
0340: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
0350: 20 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20   p->pHaving);.  
0360: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
0370: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72  elete(db, p->pOr
0380: 64 65 72 42 79 29 3b 0a 20 20 73 71 6c 69 74 65  derBy);.  sqlite
0390: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
03a0: 2c 20 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  , p->pPrior);.  
03b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
03c0: 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29  e(db, p->pLimit)
03d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
03e0: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66  elete(db, p->pOf
03f0: 66 73 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  fset);.  sqlite3
0400: 57 69 74 68 44 65 6c 65 74 65 28 64 62 2c 20 70  WithDelete(db, p
0410: 2d 3e 70 57 69 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pWith);.}../*.
0420: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** Initialize a 
0430: 53 65 6c 65 63 74 44 65 73 74 20 73 74 72 75 63  SelectDest struc
0440: 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
0450: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
0460: 6e 69 74 28 53 65 6c 65 63 74 44 65 73 74 20 2a  nit(SelectDest *
0470: 70 44 65 73 74 2c 20 69 6e 74 20 65 44 65 73 74  pDest, int eDest
0480: 2c 20 69 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20  , int iParm){.  
0490: 70 44 65 73 74 2d 3e 65 44 65 73 74 20 3d 20 28  pDest->eDest = (
04a0: 75 38 29 65 44 65 73 74 3b 0a 20 20 70 44 65 73  u8)eDest;.  pDes
04b0: 74 2d 3e 69 53 44 50 61 72 6d 20 3d 20 69 50 61  t->iSDParm = iPa
04c0: 72 6d 3b 0a 20 20 70 44 65 73 74 2d 3e 61 66 66  rm;.  pDest->aff
04d0: 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65 73  Sdst = 0;.  pDes
04e0: 74 2d 3e 69 53 64 73 74 20 3d 20 30 3b 0a 20 20  t->iSdst = 0;.  
04f0: 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30  pDest->nSdst = 0
0500: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ;.}.../*.** Allo
0510: 63 61 74 65 20 61 20 6e 65 77 20 53 65 6c 65 63  cate a new Selec
0520: 74 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  t structure and 
0530: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
0540: 20 74 6f 20 74 68 61 74 0a 2a 2a 20 73 74 72 75   to that.** stru
0550: 63 74 75 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74  cture..*/.Select
0560: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e   *sqlite3SelectN
0570: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
0580: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
0590: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
05a0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
05b0: 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 77 68 69  List,     /* whi
05c0: 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e  ch columns to in
05d0: 63 6c 75 64 65 20 69 6e 20 74 68 65 20 72 65 73  clude in the res
05e0: 75 6c 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ult */.  SrcList
05f0: 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 2f   *pSrc,        /
0600: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
0610: 65 20 2d 2d 20 77 68 69 63 68 20 74 61 62 6c 65  e -- which table
0620: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
0630: 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20  xpr *pWhere,    
0640: 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52       /* the WHER
0650: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
0660: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
0670: 2c 20 20 20 2f 2a 20 74 68 65 20 47 52 4f 55 50  ,   /* the GROUP
0680: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
0690: 45 78 70 72 20 2a 70 48 61 76 69 6e 67 2c 20 20  Expr *pHaving,  
06a0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 48 41 56        /* the HAV
06b0: 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ING clause */.  
06c0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
06d0: 42 79 2c 20 20 20 2f 2a 20 74 68 65 20 4f 52 44  By,   /* the ORD
06e0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
06f0: 20 20 75 31 36 20 73 65 6c 46 6c 61 67 73 2c 20    u16 selFlags, 
0700: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20          /* Flag 
0710: 70 61 72 61 6d 65 74 65 72 73 2c 20 73 75 63 68  parameters, such
0720: 20 61 73 20 53 46 5f 44 69 73 74 69 6e 63 74 20   as SF_Distinct 
0730: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0740: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0750: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0760: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0770: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0780: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0790: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
07a0: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
07b0: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07c0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07d0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07f0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
0800: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
0810: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0820: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0830: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0840: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0850: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0860: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0870: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0880: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0890: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
08a0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
08b0: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08c0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08d0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08e0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08f0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
0900: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
0910: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0920: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0930: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0940: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0950: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0960: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0970: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0980: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0990: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
09a0: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
09b0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09c0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09d0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09e0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09f0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
0a00: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
0a10: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a20: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a30: 20 3d 20 73 65 6c 46 6c 61 67 73 3b 0a 20 20 70   = selFlags;.  p
0a40: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 53 45 4c  New->op = TK_SEL
0a50: 45 43 54 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69  ECT;.  pNew->pLi
0a60: 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20  mit = pLimit;.  
0a70: 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20  pNew->pOffset = 
0a80: 70 4f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72  pOffset;.  asser
0a90: 74 28 20 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c  t( pOffset==0 ||
0aa0: 20 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20   pLimit!=0 );.  
0ab0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0ac0: 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e  hm[0] = -1;.  pN
0ad0: 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d  ew->addrOpenEphm
0ae0: 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  [1] = -1;.  pNew
0af0: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
0b00: 5d 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 64 62  ] = -1;.  if( db
0b10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0b20: 20 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65   {.    clearSele
0b30: 63 74 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ct(db, pNew);.  
0b40: 20 20 69 66 28 20 70 4e 65 77 21 3d 26 73 74 61    if( pNew!=&sta
0b50: 6e 64 69 6e 20 29 20 73 71 6c 69 74 65 33 44 62  ndin ) sqlite3Db
0b60: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
0b70: 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
0b80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
0b90: 74 28 20 70 4e 65 77 2d 3e 70 53 72 63 21 3d 30  t( pNew->pSrc!=0
0ba0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
0bb0: 3e 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  >0 );.  }.  asse
0bc0: 72 74 28 20 70 4e 65 77 21 3d 26 73 74 61 6e 64  rt( pNew!=&stand
0bd0: 69 6e 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  in );.  return p
0be0: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
0bf0: 6c 65 74 65 20 74 68 65 20 67 69 76 65 6e 20 53  lete the given S
0c00: 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
0c10: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
0c20: 75 62 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f  ubstructures..*/
0c30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c  .void sqlite3Sel
0c40: 65 63 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  ectDelete(sqlite
0c50: 33 20 2a 64 62 2c 20 53 65 6c 65 63 74 20 2a 70  3 *db, Select *p
0c60: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
0c70: 20 20 63 6c 65 61 72 53 65 6c 65 63 74 28 64 62    clearSelect(db
0c80: 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , p);.    sqlite
0c90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
0ca0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
0cb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0cc0: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
0cd0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
0ce0: 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2e 0a   in a compound..
0cf0: 2a 2f 0a 73 74 61 74 69 63 20 53 65 6c 65 63 74  */.static Select
0d00: 20 2a 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28   *findRightmost(
0d10: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 77 68  Select *p){.  wh
0d20: 69 6c 65 28 20 70 2d 3e 70 4e 65 78 74 20 29 20  ile( p->pNext ) 
0d30: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
0d40: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
0d50: 2a 2a 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20  ** Given 1 to 3 
0d60: 69 64 65 6e 74 69 66 69 65 72 73 20 70 72 65 63  identifiers prec
0d70: 65 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b  eding the JOIN k
0d80: 65 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e  eyword, determin
0d90: 65 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66  e the.** type of
0da0: 20 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61   join.  Return a
0db0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
0dc0: 6e 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65  nt that expresse
0dd0: 73 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69  s that type.** i
0de0: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  n terms of the f
0df0: 6f 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c  ollowing bit val
0e00: 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a  ues:.**.**     J
0e10: 54 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a  T_INNER.**     J
0e20: 54 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a  T_CROSS.**     J
0e30: 54 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a  T_OUTER.**     J
0e40: 54 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20  T_NATURAL.**    
0e50: 20 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20   JT_LEFT.**     
0e60: 4a 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41  JT_RIGHT.**.** A
0e70: 20 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e   full outer join
0e80: 20 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74   is the combinat
0e90: 69 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61  ion of JT_LEFT a
0ea0: 6e 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a  nd JT_RIGHT..**.
0eb0: 2a 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c  ** If an illegal
0ec0: 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20   or unsupported 
0ed0: 6a 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65  join type is see
0ee0: 6e 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65  n, then still re
0ef0: 74 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74  turn.** a join t
0f00: 79 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20  ype, but put an 
0f10: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61  error in the pPa
0f20: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
0f30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69  /.int sqlite3Joi
0f40: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
0f50: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20  rse, Token *pA, 
0f60: 54 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e  Token *pB, Token
0f70: 20 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69   *pC){.  int joi
0f80: 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b  ntype = 0;.  Tok
0f90: 65 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20  en *apAll[3];.  
0fa0: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20  Token *p;.      
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fc0: 20 20 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33         /*   0123
0fd0: 34 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39  456789 123456789
0fe0: 20 31 32 33 34 35 36 37 38 39 20 31 32 33 20 2a   123456789 123 *
0ff0: 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  /.  static const
1000: 20 63 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d   char zKeyText[]
1010: 20 3d 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75   = "naturaleftou
1020: 74 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72  terightfullinner
1030: 63 72 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63  cross";.  static
1040: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
1050: 20 20 20 20 75 38 20 69 3b 20 20 20 20 20 20 20      u8 i;       
1060: 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
1070: 20 6b 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e   keyword text in
1080: 20 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20   zKeyText[] */. 
1090: 20 20 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20     u8 nChar;    
10a0: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65  /* Length of the
10b0: 20 6b 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72   keyword in char
10c0: 61 63 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38  acters */.    u8
10d0: 20 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f   code;     /* Jo
10e0: 69 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a  in type mask */.
10f0: 20 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d    } aKeyword[] =
1100: 20 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61   {.    /* natura
1110: 6c 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54  l */ { 0,  7, JT
1120: 5f 4e 41 54 55 52 41 4c 20 20 20 20 20 20 20 20  _NATURAL        
1130: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
1140: 2a 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36  * left    */ { 6
1150: 2c 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54  ,  4, JT_LEFT|JT
1160: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20  _OUTER          
1170: 7d 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20  },.    /* outer 
1180: 20 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54    */ { 10, 5, JT
1190: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20  _OUTER          
11a0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
11b0: 2a 20 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31  * right   */ { 1
11c0: 34 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a  4, 5, JT_RIGHT|J
11d0: 54 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20  T_OUTER         
11e0: 7d 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20  },.    /* full  
11f0: 20 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54    */ { 19, 4, JT
1200: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a  _LEFT|JT_RIGHT|J
1210: 54 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f  T_OUTER },.    /
1220: 2a 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32  * inner   */ { 2
1230: 33 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20  3, 5, JT_INNER  
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 7d 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20  },.    /* cross 
1260: 20 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54    */ { 28, 5, JT
1270: 5f 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20  _INNER|JT_CROSS 
1280: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
1290: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70    int i, j;.  ap
12a0: 41 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61  All[0] = pA;.  a
12b0: 70 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20  pAll[1] = pB;.  
12c0: 61 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20  apAll[2] = pC;. 
12d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26   for(i=0; i<3 &&
12e0: 20 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   apAll[i]; i++){
12f0: 0a 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69  .    p = apAll[i
1300: 5d 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ];.    for(j=0; 
1310: 6a 3c 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79  j<ArraySize(aKey
1320: 77 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  word); j++){.   
1330: 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65     if( p->n==aKe
1340: 79 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a  yword[j].nChar .
1350: 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
1360: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68  ite3StrNICmp((ch
1370: 61 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54  ar*)p->z, &zKeyT
1380: 65 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e  ext[aKeyword[j].
1390: 69 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a  i], p->n)==0 ){.
13a0: 20 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65          jointype
13b0: 20 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e   |= aKeyword[j].
13c0: 63 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72  code;.        br
13d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
13e0: 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
13f0: 20 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c   j==0 || j==1 ||
1400: 20 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c   j==2 || j==3 ||
1410: 20 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c   j==4 || j==5 ||
1420: 20 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28   j==6 );.    if(
1430: 20 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b   j>=ArraySize(aK
1440: 65 79 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20  eyword) ){.     
1450: 20 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f   jointype |= JT_
1460: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
1470: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
1480: 69 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79  if(.     (jointy
1490: 70 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a  pe & (JT_INNER|J
14a0: 54 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49  T_OUTER))==(JT_I
14b0: 4e 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c  NNER|JT_OUTER) |
14c0: 7c 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65  |.     (jointype
14d0: 20 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a   & JT_ERROR)!=0.
14e0: 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
14f0: 68 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a  har *zSp = " ";.
1500: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 21 3d      assert( pB!=
1510: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d  0 );.    if( pC=
1520: 3d 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20  =0 ){ zSp++; }. 
1530: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1540: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
1550: 6f 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74  own or unsupport
1560: 65 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a  ed join type: ".
1570: 20 20 20 20 20 20 20 22 25 54 20 25 54 25 73 25         "%T %T%s%
1580: 54 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c  T", pA, pB, zSp,
1590: 20 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79   pC);.    jointy
15a0: 70 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20  pe = JT_INNER;. 
15b0: 20 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e   }else if( (join
15c0: 74 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29  type & JT_OUTER)
15d0: 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26  !=0 .         &&
15e0: 20 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54   (jointype & (JT
15f0: 5f 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29  _LEFT|JT_RIGHT))
1600: 21 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  !=JT_LEFT ){.   
1610: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1620: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
1630: 22 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20  "RIGHT and FULL 
1640: 4f 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20  OUTER JOINs are 
1650: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75  not currently su
1660: 70 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a  pported");.    j
1670: 6f 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e  ointype = JT_INN
1680: 45 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ER;.  }.  return
1690: 20 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a   jointype;.}../*
16a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
16b0: 6e 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  ndex of a column
16c0: 20 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65   in a table.  Re
16d0: 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63  turn -1 if the c
16e0: 6f 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20  olumn.** is not 
16f0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65  contained in the
1700: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
1710: 63 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65  c int columnInde
1720: 78 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  x(Table *pTab, c
1730: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
1740: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
1750: 28 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43  (i=0; i<pTab->nC
1760: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
1770: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1780: 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (pTab->aCol[i].z
1790: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
17a0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
17b0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
17c0: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20  *.** Search the 
17d0: 66 69 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69  first N tables i
17e0: 6e 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66  n pSrc, from lef
17f0: 74 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b  t to right, look
1800: 69 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62  ing for a.** tab
1810: 6c 65 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  le that has a co
1820: 6c 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e  lumn named zCol.
1830: 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f    .**.** When fo
1840: 75 6e 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20  und, set *piTab 
1850: 61 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68  and *piCol to th
1860: 65 20 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e  e table index an
1870: 64 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a  d column index.*
1880: 2a 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e  * of the matchin
1890: 67 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74  g column and ret
18a0: 75 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20  urn TRUE..**.** 
18b0: 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65  If not found, re
18c0: 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73  turn FALSE..*/.s
18d0: 74 61 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41  tatic int tableA
18e0: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20  ndColumnIndex(. 
18f0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1900: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
1910: 66 20 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72  f tables to sear
1920: 63 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  ch */.  int N,  
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1940: 4e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  Number of tables
1950: 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f   in pSrc->a[] to
1960: 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e   search */.  con
1970: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1980: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1990: 20 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c   column we are l
19a0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  ooking for */.  
19b0: 69 6e 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20  int *piTab,     
19c0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e       /* Write in
19d0: 64 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d  dex of pSrc->a[]
19e0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   here */.  int *
19f0: 70 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20  piCol           
1a00: 2f 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f  /* Write index o
1a10: 66 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62  f pSrc->a[*piTab
1a20: 5d 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68  ].pTab->aCol[] h
1a30: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
1a40: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1a50: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1a60: 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
1a70: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
1a80: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
1a90: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
1aa0: 20 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a   matching zCol *
1ab0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 69  /..  assert( (pi
1ac0: 54 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d  Tab==0)==(piCol=
1ad0: 3d 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20  =0) );  /* Both 
1ae0: 6f 72 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e  or neither are N
1af0: 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ULL */.  for(i=0
1b00: 3b 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<N; i++){.   
1b10: 20 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e   iCol = columnIn
1b20: 64 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70  dex(pSrc->a[i].p
1b30: 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Tab, zCol);.    
1b40: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
1b50: 20 20 20 20 20 69 66 28 20 70 69 54 61 62 20 29       if( piTab )
1b60: 7b 0a 20 20 20 20 20 20 20 20 2a 70 69 54 61 62  {.        *piTab
1b70: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70   = i;.        *p
1b80: 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  iCol = iCol;.   
1b90: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1ba0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1bb0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1bc0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1bd0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
1be0: 20 74 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62   terms implied b
1bf0: 79 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f  y JOIN syntax to
1c00: 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c   the.** WHERE cl
1c10: 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ause expression 
1c20: 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
1c30: 65 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74  ement. The new t
1c40: 65 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73  erm, which.** is
1c50: 20 41 4e 44 65 64 20 77 69 74 68 20 74 68 65 20   ANDed with the 
1c60: 65 78 69 73 74 69 6e 67 20 57 48 45 52 45 20 63  existing WHERE c
1c70: 6c 61 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65  lause, is of the
1c80: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
1c90: 28 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62  (tab1.col1 = tab
1ca0: 32 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68  2.col2).**.** wh
1cb0: 65 72 65 20 74 61 62 31 20 69 73 20 74 68 65 20  ere tab1 is the 
1cc0: 69 53 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e  iSrc'th table in
1cd0: 20 53 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e   SrcList pSrc an
1ce0: 64 20 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a  d tab2 is the .*
1cf0: 2a 20 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43  * (iSrc+1)'th. C
1d00: 6f 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f  olumn col1 is co
1d10: 6c 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66  lumn iColLeft of
1d20: 20 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20   tab1, and col2 
1d30: 69 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  is.** column iCo
1d40: 6c 52 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a  lRight of tab2..
1d50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
1d60: 64 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50  ddWhereTerm(.  P
1d70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d90: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1da0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1db0: 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20  pSrc,           
1dc0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1dd0: 66 20 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d  f tables in FROM
1de0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
1df0: 20 69 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20   iLeft,         
1e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e10: 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 74  Index of first t
1e20: 61 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20  able to join in 
1e30: 70 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43  pSrc */.  int iC
1e40: 6f 6c 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20  olLeft,         
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1e60: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20  ex of column in 
1e70: 66 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20  first table */. 
1e80: 20 69 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20   int iRight,    
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63   /* Index of sec
1eb0: 6f 6e 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72  ond table in pSr
1ec0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52  c */.  int iColR
1ed0: 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
1ee0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1ef0: 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63  of column in sec
1f00: 6f 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  ond table */.  i
1f10: 6e 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20  nt isOuterJoin, 
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f30: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
1f40: 73 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20  s an OUTER join 
1f50: 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68  */.  Expr **ppWh
1f60: 65 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ere             
1f70: 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1f80: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1f90: 20 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b   to add to */.){
1fa0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1fb0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
1fc0: 78 70 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72  xpr *pE1;.  Expr
1fd0: 20 2a 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70   *pE2;.  Expr *p
1fe0: 45 71 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  Eq;..  assert( i
1ff0: 4c 65 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20  Left<iRight );. 
2000: 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e   assert( pSrc->n
2010: 53 72 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20  Src>iRight );.  
2020: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
2030: 69 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20  iLeft].pTab );. 
2040: 20 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61   assert( pSrc->a
2050: 5b 69 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b  [iRight].pTab );
2060: 0a 0a 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65  ..  pE1 = sqlite
2070: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
2080: 72 28 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66  r(db, pSrc, iLef
2090: 74 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20  t, iColLeft);.  
20a0: 70 45 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65  pE2 = sqlite3Cre
20b0: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62  ateColumnExpr(db
20c0: 2c 20 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20  , pSrc, iRight, 
20d0: 69 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70  iColRight);..  p
20e0: 45 71 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  Eq = sqlite3PExp
20f0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c  r(pParse, TK_EQ,
2100: 20 70 45 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20   pE1, pE2, 0);. 
2110: 20 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75   if( pEq && isOu
2120: 74 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45  terJoin ){.    E
2130: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
2140: 45 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  Eq, EP_FromJoin)
2150: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2160: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2170: 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  Eq, EP_TokenOnly
2180: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2190: 20 20 20 20 45 78 70 72 53 65 74 56 56 41 50 72      ExprSetVVAPr
21a0: 6f 70 65 72 74 79 28 70 45 71 2c 20 45 50 5f 4e  operty(pEq, EP_N
21b0: 6f 52 65 64 75 63 65 29 3b 0a 20 20 20 20 70 45  oReduce);.    pE
21c0: 71 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  q->iRightJoinTab
21d0: 6c 65 20 3d 20 28 69 31 36 29 70 45 32 2d 3e 69  le = (i16)pE2->i
21e0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 2a 70 70  Table;.  }.  *pp
21f0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
2200: 78 70 72 41 6e 64 28 64 62 2c 20 2a 70 70 57 68  xprAnd(db, *ppWh
2210: 65 72 65 2c 20 70 45 71 29 3b 0a 7d 0a 0a 2f 2a  ere, pEq);.}../*
2220: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 50 5f 46  .** Set the EP_F
2230: 72 6f 6d 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79  romJoin property
2240: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66   on all terms of
2250: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
2260: 73 73 69 6f 6e 2e 0a 2a 2a 20 41 6e 64 20 73 65  ssion..** And se
2270: 74 20 74 68 65 20 45 78 70 72 2e 69 52 69 67 68  t the Expr.iRigh
2280: 74 4a 6f 69 6e 54 61 62 6c 65 20 74 6f 20 69 54  tJoinTable to iT
2290: 61 62 6c 65 20 66 6f 72 20 65 76 65 72 79 20 74  able for every t
22a0: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 65 78  erm in the.** ex
22b0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  pression..**.** 
22c0: 54 68 65 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20  The EP_FromJoin 
22d0: 70 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64  property is used
22e0: 20 6f 6e 20 74 65 72 6d 73 20 6f 66 20 61 6e 20   on terms of an 
22f0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 74 65  expression to te
2300: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 45 46 54 20 4f  ll.** the LEFT O
2310: 55 54 45 52 20 4a 4f 49 4e 20 70 72 6f 63 65 73  UTER JOIN proces
2320: 73 69 6e 67 20 6c 6f 67 69 63 20 74 68 61 74 20  sing logic that 
2330: 74 68 69 73 20 74 65 72 6d 20 69 73 20 70 61 72  this term is par
2340: 74 20 6f 66 20 74 68 65 0a 2a 2a 20 6a 6f 69 6e  t of the.** join
2350: 20 72 65 73 74 72 69 63 74 69 6f 6e 20 73 70 65   restriction spe
2360: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 4f 4e  cified in the ON
2370: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
2380: 20 61 6e 64 20 6e 6f 74 20 61 20 70 61 72 74 0a   and not a part.
2390: 2a 2a 20 6f 66 20 74 68 65 20 6d 6f 72 65 20 67  ** of the more g
23a0: 65 6e 65 72 61 6c 20 57 48 45 52 45 20 63 6c 61  eneral WHERE cla
23b0: 75 73 65 2e 20 20 54 68 65 73 65 20 74 65 72 6d  use.  These term
23c0: 73 20 61 72 65 20 6d 6f 76 65 64 20 6f 76 65 72  s are moved over
23d0: 20 74 6f 20 74 68 65 0a 2a 2a 20 57 48 45 52 45   to the.** WHERE
23e0: 20 63 6c 61 75 73 65 20 64 75 72 69 6e 67 20 6a   clause during j
23f0: 6f 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 62  oin processing b
2400: 75 74 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  ut we need to re
2410: 6d 65 6d 62 65 72 20 74 68 61 74 20 74 68 65 79  member that they
2420: 0a 2a 2a 20 6f 72 69 67 69 6e 61 74 65 64 20 69  .** originated i
2430: 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e  n the ON or USIN
2440: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
2450: 54 68 65 20 45 78 70 72 2e 69 52 69 67 68 74 4a  The Expr.iRightJ
2460: 6f 69 6e 54 61 62 6c 65 20 74 65 6c 6c 73 20 74  oinTable tells t
2470: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2480: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74 20  processing that 
2490: 74 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  the.** expressio
24a0: 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 61 62  n depends on tab
24b0: 6c 65 20 69 52 69 67 68 74 4a 6f 69 6e 54 61 62  le iRightJoinTab
24c0: 6c 65 20 65 76 65 6e 20 69 66 20 74 68 61 74 20  le even if that 
24d0: 74 61 62 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20  table is not.** 
24e0: 65 78 70 6c 69 63 69 74 6c 79 20 6d 65 6e 74 69  explicitly menti
24f0: 6f 6e 65 64 20 69 6e 20 74 68 65 20 65 78 70 72  oned in the expr
2500: 65 73 73 69 6f 6e 2e 20 20 54 68 61 74 20 69 6e  ession.  That in
2510: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 65  formation is nee
2520: 64 65 64 0a 2a 2a 20 66 6f 72 20 63 61 73 65 73  ded.** for cases
2530: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
2540: 2a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  *    SELECT * FR
2550: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
2560: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 62 20  t2 ON t1.a=t2.b 
2570: 41 4e 44 20 74 31 2e 78 3d 35 0a 2a 2a 0a 2a 2a  AND t1.x=5.**.**
2580: 20 54 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   The where claus
2590: 65 20 6e 65 65 64 73 20 74 6f 20 64 65 66 65 72  e needs to defer
25a0: 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f 66   the handling of
25b0: 20 74 68 65 20 74 31 2e 78 3d 35 0a 2a 2a 20 74   the t1.x=5.** t
25c0: 65 72 6d 20 75 6e 74 69 6c 20 61 66 74 65 72 20  erm until after 
25d0: 74 68 65 20 74 32 20 6c 6f 6f 70 20 6f 66 20 74  the t2 loop of t
25e0: 68 65 20 6a 6f 69 6e 2e 20 20 49 6e 20 74 68 61  he join.  In tha
25f0: 74 20 77 61 79 2c 20 61 0a 2a 2a 20 4e 55 4c 4c  t way, a.** NULL
2600: 20 74 32 20 72 6f 77 20 77 69 6c 6c 20 62 65 20   t2 row will be 
2610: 69 6e 73 65 72 74 65 64 20 77 68 65 6e 65 76 65  inserted wheneve
2620: 72 20 74 31 2e 78 21 3d 35 2e 20 20 49 66 20 77  r t1.x!=5.  If w
2630: 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 64 65 66 65  e do not.** defe
2640: 72 20 74 68 65 20 68 61 6e 64 6c 69 6e 67 20 6f  r the handling o
2650: 66 20 74 31 2e 78 3d 35 2c 20 69 74 20 77 69 6c  f t1.x=5, it wil
2660: 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 69  l be processed i
2670: 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66  mmediately.** af
2680: 74 65 72 20 74 68 65 20 74 31 20 6c 6f 6f 70 20  ter the t1 loop 
2690: 61 6e 64 20 72 6f 77 73 20 77 69 74 68 20 74 31  and rows with t1
26a0: 2e 78 21 3d 35 20 77 69 6c 6c 20 6e 65 76 65 72  .x!=5 will never
26b0: 20 61 70 70 65 61 72 20 69 6e 0a 2a 2a 20 74 68   appear in.** th
26c0: 65 20 6f 75 74 70 75 74 2c 20 77 68 69 63 68 20  e output, which 
26d0: 69 73 20 69 6e 63 6f 72 72 65 63 74 2e 0a 2a 2f  is incorrect..*/
26e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
26f0: 4a 6f 69 6e 45 78 70 72 28 45 78 70 72 20 2a 70  JoinExpr(Expr *p
2700: 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20  , int iTable){. 
2710: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
2720: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2730: 28 70 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  (p, EP_FromJoin)
2740: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
2750: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2760: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2770: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20  P_Reduced) );.  
2780: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2790: 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65 64  erty(p, EP_NoRed
27a0: 75 63 65 29 3b 0a 20 20 20 20 70 2d 3e 69 52 69  uce);.    p->iRi
27b0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 28  ghtJoinTable = (
27c0: 69 31 36 29 69 54 61 62 6c 65 3b 0a 20 20 20 20  i16)iTable;.    
27d0: 73 65 74 4a 6f 69 6e 45 78 70 72 28 70 2d 3e 70  setJoinExpr(p->p
27e0: 4c 65 66 74 2c 20 69 54 61 62 6c 65 29 3b 0a 20  Left, iTable);. 
27f0: 20 20 20 70 20 3d 20 70 2d 3e 70 52 69 67 68 74     p = p->pRight
2800: 3b 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ;.  } .}../*.** 
2810: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 72 6f  This routine pro
2820: 63 65 73 73 65 73 20 74 68 65 20 6a 6f 69 6e 20  cesses the join 
2830: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
2840: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
2850: 6e 74 2e 0a 2a 2a 20 4f 4e 20 61 6e 64 20 55 53  nt..** ON and US
2860: 49 4e 47 20 63 6c 61 75 73 65 73 20 61 72 65 20  ING clauses are 
2870: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 65  converted into e
2880: 78 74 72 61 20 74 65 72 6d 73 20 6f 66 20 74 68  xtra terms of th
2890: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  e WHERE clause..
28a0: 2a 2a 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 73  ** NATURAL joins
28b0: 20 61 6c 73 6f 20 63 72 65 61 74 65 20 65 78 74   also create ext
28c0: 72 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  ra WHERE clause 
28d0: 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  terms..**.** The
28e0: 20 74 65 72 6d 73 20 6f 66 20 61 20 46 52 4f 4d   terms of a FROM
28f0: 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 6e 74   clause are cont
2900: 61 69 6e 65 64 20 69 6e 20 74 68 65 20 53 65 6c  ained in the Sel
2910: 65 63 74 2e 70 53 72 63 20 73 74 72 75 63 74 75  ect.pSrc structu
2920: 72 65 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 20  re..** The left 
2930: 6d 6f 73 74 20 74 61 62 6c 65 20 69 73 20 74 68  most table is th
2940: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2950: 20 53 65 6c 65 63 74 2e 70 53 72 63 2e 20 20 54   Select.pSrc.  T
2960: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 2a 2a  he right-most.**
2970: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 6c 61   table is the la
2980: 73 74 20 65 6e 74 72 79 2e 20 20 54 68 65 20 6a  st entry.  The j
2990: 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20  oin operator is 
29a0: 68 65 6c 64 20 69 6e 20 74 68 65 20 65 6e 74 72  held in the entr
29b0: 79 20 74 6f 0a 2a 2a 20 74 68 65 20 6c 65 66 74  y to.** the left
29c0: 2e 20 20 54 68 75 73 20 65 6e 74 72 79 20 30 20  .  Thus entry 0 
29d0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6a 6f 69  contains the joi
29e0: 6e 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 74  n operator for t
29f0: 68 65 20 6a 6f 69 6e 20 62 65 74 77 65 65 6e 0a  he join between.
2a00: 2a 2a 20 65 6e 74 72 69 65 73 20 30 20 61 6e 64  ** entries 0 and
2a10: 20 31 2e 20 20 41 6e 79 20 4f 4e 20 6f 72 20 55   1.  Any ON or U
2a20: 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61 73 73  SING clauses ass
2a30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
2a40: 20 6a 6f 69 6e 20 61 72 65 0a 2a 2a 20 61 6c 73   join are.** als
2a50: 6f 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  o attached to th
2a60: 65 20 6c 65 66 74 20 65 6e 74 72 79 2e 0a 2a 2a  e left entry..**
2a70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2a80: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
2a90: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
2aa0: 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2f 0a 73 74  countered..*/.st
2ab0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 50  atic int sqliteP
2ac0: 72 6f 63 65 73 73 4a 6f 69 6e 28 50 61 72 73 65  rocessJoin(Parse
2ad0: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
2ae0: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
2af0: 2a 70 53 72 63 3b 20 20 20 20 20 20 20 20 20 20  *pSrc;          
2b00: 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 74          /* All t
2b10: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2b20: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  M clause */.  in
2b30: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b50: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
2b60: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2b70: 73 74 5f 69 74 65 6d 20 2a 70 4c 65 66 74 3b 20  st_item *pLeft; 
2b80: 20 20 20 20 2f 2a 20 4c 65 66 74 20 74 61 62 6c      /* Left tabl
2b90: 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20 2a  e being joined *
2ba0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
2bb0: 73 74 5f 69 74 65 6d 20 2a 70 52 69 67 68 74 3b  st_item *pRight;
2bc0: 20 20 20 20 2f 2a 20 52 69 67 68 74 20 74 61 62      /* Right tab
2bd0: 6c 65 20 62 65 69 6e 67 20 6a 6f 69 6e 65 64 20  le being joined 
2be0: 2a 2f 0a 0a 20 20 70 53 72 63 20 3d 20 70 2d 3e  */..  pSrc = p->
2bf0: 70 53 72 63 3b 0a 20 20 70 4c 65 66 74 20 3d 20  pSrc;.  pLeft = 
2c00: 26 70 53 72 63 2d 3e 61 5b 30 5d 3b 0a 20 20 70  &pSrc->a[0];.  p
2c10: 52 69 67 68 74 20 3d 20 26 70 4c 65 66 74 5b 31  Right = &pLeft[1
2c20: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
2c30: 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 2b  pSrc->nSrc-1; i+
2c40: 2b 2c 20 70 52 69 67 68 74 2b 2b 2c 20 70 4c 65  +, pRight++, pLe
2c50: 66 74 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  ft++){.    Table
2c60: 20 2a 70 4c 65 66 74 54 61 62 20 3d 20 70 4c 65   *pLeftTab = pLe
2c70: 66 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 54 61  ft->pTab;.    Ta
2c80: 62 6c 65 20 2a 70 52 69 67 68 74 54 61 62 20 3d  ble *pRightTab =
2c90: 20 70 52 69 67 68 74 2d 3e 70 54 61 62 3b 0a 20   pRight->pTab;. 
2ca0: 20 20 20 69 6e 74 20 69 73 4f 75 74 65 72 3b 0a     int isOuter;.
2cb0: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70  .    if( NEVER(p
2cc0: 4c 65 66 74 54 61 62 3d 3d 30 20 7c 7c 20 70 52  LeftTab==0 || pR
2cd0: 69 67 68 74 54 61 62 3d 3d 30 29 20 29 20 63 6f  ightTab==0) ) co
2ce0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 73 4f 75  ntinue;.    isOu
2cf0: 74 65 72 20 3d 20 28 70 52 69 67 68 74 2d 3e 6a  ter = (pRight->j
2d00: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55 54  ointype & JT_OUT
2d10: 45 52 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20  ER)!=0;..    /* 
2d20: 57 68 65 6e 20 74 68 65 20 4e 41 54 55 52 41 4c  When the NATURAL
2d30: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
2d40: 65 6e 74 2c 20 61 64 64 20 57 48 45 52 45 20 63  ent, add WHERE c
2d50: 6c 61 75 73 65 20 74 65 72 6d 73 20 66 6f 72 0a  lause terms for.
2d60: 20 20 20 20 2a 2a 20 65 76 65 72 79 20 63 6f 6c      ** every col
2d70: 75 6d 6e 20 74 68 61 74 20 74 68 65 20 74 77 6f  umn that the two
2d80: 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e 20   tables have in 
2d90: 63 6f 6d 6d 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  common..    */. 
2da0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6a     if( pRight->j
2db0: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2dc0: 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  URAL ){.      if
2dd0: 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e 20 7c 7c  ( pRight->pOn ||
2de0: 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20   pRight->pUsing 
2df0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e00: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2e10: 65 2c 20 22 61 20 4e 41 54 55 52 41 4c 20 6a 6f  e, "a NATURAL jo
2e20: 69 6e 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  in may not have 
2e30: 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 61 6e  ".           "an
2e40: 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61   ON or USING cla
2e50: 75 73 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  use", 0);.      
2e60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2e70: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d    }.      for(j=
2e80: 30 3b 20 6a 3c 70 52 69 67 68 74 54 61 62 2d 3e  0; j<pRightTab->
2e90: 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
2ea0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
2eb0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 6f     /* Name of co
2ec0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 69 67 68  lumn in the righ
2ed0: 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  t table */.     
2ee0: 20 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20     int iLeft;   
2ef0: 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6c 65    /* Matching le
2f00: 66 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ft table */.    
2f10: 20 20 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c      int iLeftCol
2f20: 3b 20 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 63  ;  /* Matching c
2f30: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6c 65 66  olumn in the lef
2f40: 74 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20  t table */..    
2f50: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70 52 69 67      zName = pRig
2f60: 68 74 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a  htTab->aCol[j].z
2f70: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
2f80: 28 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  ( tableAndColumn
2f90: 49 6e 64 65 78 28 70 53 72 63 2c 20 69 2b 31 2c  Index(pSrc, i+1,
2fa0: 20 7a 4e 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20   zName, &iLeft, 
2fb0: 26 69 4c 65 66 74 43 6f 6c 29 20 29 7b 0a 20 20  &iLeftCol) ){.  
2fc0: 20 20 20 20 20 20 20 20 61 64 64 57 68 65 72 65          addWhere
2fd0: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 53 72  Term(pParse, pSr
2fe0: 63 2c 20 69 4c 65 66 74 2c 20 69 4c 65 66 74 43  c, iLeft, iLeftC
2ff0: 6f 6c 2c 20 69 2b 31 2c 20 6a 2c 0a 20 20 20 20  ol, i+1, j,.    
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e     isOuter, &p->
3020: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20  pWhere);.       
3030: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
3040: 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 6c 6c 6f  ..    /* Disallo
3050: 77 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55 53  w both ON and US
3060: 49 4e 47 20 63 6c 61 75 73 65 73 20 69 6e 20 74  ING clauses in t
3070: 68 65 20 73 61 6d 65 20 6a 6f 69 6e 0a 20 20 20  he same join.   
3080: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67   */.    if( pRig
3090: 68 74 2d 3e 70 4f 6e 20 26 26 20 70 52 69 67 68  ht->pOn && pRigh
30a0: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
30b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
30c0: 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e 6e  sg(pParse, "cann
30d0: 6f 74 20 68 61 76 65 20 62 6f 74 68 20 4f 4e 20  ot have both ON 
30e0: 61 6e 64 20 55 53 49 4e 47 20 22 0a 20 20 20 20  and USING ".    
30f0: 20 20 20 20 22 63 6c 61 75 73 65 73 20 69 6e 20      "clauses in 
3100: 74 68 65 20 73 61 6d 65 20 6a 6f 69 6e 22 29 3b  the same join");
3110: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
3120: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
3130: 64 64 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  dd the ON clause
3140: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
3150: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c  he WHERE clause,
3160: 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 20 20   connected by.  
3170: 20 20 2a 2a 20 61 6e 20 41 4e 44 20 6f 70 65 72    ** an AND oper
3180: 61 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ator..    */.   
3190: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70 4f 6e   if( pRight->pOn
31a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 73   ){.      if( is
31b0: 4f 75 74 65 72 20 29 20 73 65 74 4a 6f 69 6e 45  Outer ) setJoinE
31c0: 78 70 72 28 70 52 69 67 68 74 2d 3e 70 4f 6e 2c  xpr(pRight->pOn,
31d0: 20 70 52 69 67 68 74 2d 3e 69 43 75 72 73 6f 72   pRight->iCursor
31e0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 57 68 65  );.      p->pWhe
31f0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
3200: 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  And(pParse->db, 
3210: 70 2d 3e 70 57 68 65 72 65 2c 20 70 52 69 67 68  p->pWhere, pRigh
3220: 74 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 70  t->pOn);.      p
3230: 52 69 67 68 74 2d 3e 70 4f 6e 20 3d 20 30 3b 0a  Right->pOn = 0;.
3240: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
3250: 65 61 74 65 20 65 78 74 72 61 20 74 65 72 6d 73  eate extra terms
3260: 20 6f 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   on the WHERE cl
3270: 61 75 73 65 20 66 6f 72 20 65 61 63 68 20 63 6f  ause for each co
3280: 6c 75 6d 6e 20 6e 61 6d 65 64 0a 20 20 20 20 2a  lumn named.    *
3290: 2a 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63  * in the USING c
32a0: 6c 61 75 73 65 2e 20 20 45 78 61 6d 70 6c 65 3a  lause.  Example:
32b0: 20 49 66 20 74 68 65 20 74 77 6f 20 74 61 62 6c   If the two tabl
32c0: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 20  es to be joined 
32d0: 61 72 65 20 0a 20 20 20 20 2a 2a 20 41 20 61 6e  are .    ** A an
32e0: 64 20 42 20 61 6e 64 20 74 68 65 20 55 53 49 4e  d B and the USIN
32f0: 47 20 63 6c 61 75 73 65 20 6e 61 6d 65 73 20 58  G clause names X
3300: 2c 20 59 2c 20 61 6e 64 20 5a 2c 20 74 68 65 6e  , Y, and Z, then
3310: 20 61 64 64 20 74 68 69 73 0a 20 20 20 20 2a 2a   add this.    **
3320: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
3330: 61 75 73 65 3a 20 20 20 20 41 2e 58 3d 42 2e 58  ause:    A.X=B.X
3340: 20 41 4e 44 20 41 2e 59 3d 42 2e 59 20 41 4e 44   AND A.Y=B.Y AND
3350: 20 41 2e 5a 3d 42 2e 5a 0a 20 20 20 20 2a 2a 20   A.Z=B.Z.    ** 
3360: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
3370: 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6d 65  if any column me
3380: 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65 20 55  ntioned in the U
3390: 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 0a 20  SING clause is. 
33a0: 20 20 20 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69     ** not contai
33b0: 6e 65 64 20 69 6e 20 62 6f 74 68 20 74 61 62 6c  ned in both tabl
33c0: 65 73 20 74 6f 20 62 65 20 6a 6f 69 6e 65 64 2e  es to be joined.
33d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33e0: 70 52 69 67 68 74 2d 3e 70 55 73 69 6e 67 20 29  pRight->pUsing )
33f0: 7b 0a 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a  {.      IdList *
3400: 70 4c 69 73 74 20 3d 20 70 52 69 67 68 74 2d 3e  pList = pRight->
3410: 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 66 6f  pUsing;.      fo
3420: 72 28 6a 3d 30 3b 20 6a 3c 70 4c 69 73 74 2d 3e  r(j=0; j<pList->
3430: 6e 49 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nId; j++){.     
3440: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20     char *zName; 
3450: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3460: 68 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20 55  he term in the U
3470: 53 49 4e 47 20 63 6c 61 75 73 65 20 2a 2f 0a 20  SING clause */. 
3480: 20 20 20 20 20 20 20 69 6e 74 20 69 4c 65 66 74         int iLeft
3490: 3b 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ;       /* Table
34a0: 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 77 69 74   on the left wit
34b0: 68 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  h matching colum
34c0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
34d0: 20 20 69 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20    int iLeftCol; 
34e0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
34f0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
3500: 63 6f 6c 75 6d 6e 20 6f 6e 20 74 68 65 20 6c 65  column on the le
3510: 66 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ft */.        in
3520: 74 20 69 52 69 67 68 74 43 6f 6c 3b 20 20 20 2f  t iRightCol;   /
3530: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
3540: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
3550: 6d 6e 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  mn on the right 
3560: 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d  */..        zNam
3570: 65 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  e = pList->a[j].
3580: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
3590: 52 69 67 68 74 43 6f 6c 20 3d 20 63 6f 6c 75 6d  RightCol = colum
35a0: 6e 49 6e 64 65 78 28 70 52 69 67 68 74 54 61 62  nIndex(pRightTab
35b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
35c0: 20 20 69 66 28 20 69 52 69 67 68 74 43 6f 6c 3c    if( iRightCol<
35d0: 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 21 74  0.         || !t
35e0: 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64  ableAndColumnInd
35f0: 65 78 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e  ex(pSrc, i+1, zN
3600: 61 6d 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c  ame, &iLeft, &iL
3610: 65 66 74 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  eftCol).        
3620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
3630: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3640: 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 6a 6f 69  rse, "cannot joi
3650: 6e 20 75 73 69 6e 67 20 63 6f 6c 75 6d 6e 20 25  n using column %
3660: 73 20 2d 20 63 6f 6c 75 6d 6e 20 22 0a 20 20 20  s - column ".   
3670: 20 20 20 20 20 20 20 20 20 22 6e 6f 74 20 70 72           "not pr
3680: 65 73 65 6e 74 20 69 6e 20 62 6f 74 68 20 74 61  esent in both ta
3690: 62 6c 65 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  bles", zName);. 
36a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
36b0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
36c0: 20 20 20 20 20 61 64 64 57 68 65 72 65 54 65 72       addWhereTer
36d0: 6d 28 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20  m(pParse, pSrc, 
36e0: 69 4c 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c  iLeft, iLeftCol,
36f0: 20 69 2b 31 2c 20 69 52 69 67 68 74 43 6f 6c 2c   i+1, iRightCol,
3700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3710: 20 20 20 20 20 20 69 73 4f 75 74 65 72 2c 20 26        isOuter, &
3720: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
3730: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
3740: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3750: 2a 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 69  ** Insert code i
3760: 6e 74 6f 20 22 76 22 20 74 68 61 74 20 77 69 6c  nto "v" that wil
3770: 6c 20 70 75 73 68 20 74 68 65 20 72 65 63 6f 72  l push the recor
3780: 64 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  d on the top of 
3790: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 6e 74  the.** stack int
37a0: 6f 20 74 68 65 20 73 6f 72 74 65 72 2e 0a 2a 2f  o the sorter..*/
37b0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 75 73  .static void pus
37c0: 68 4f 6e 74 6f 53 6f 72 74 65 72 28 0a 20 20 50  hOntoSorter(.  P
37d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
37e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20        /* Parser 
37f0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
3800: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
3810: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
3820: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
3830: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
3840: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
3850: 6f 6c 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  ole SELECT state
3860: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ment */.  int re
3870: 67 44 61 74 61 20 20 20 20 20 20 20 20 20 20 20  gData           
3880: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
3890: 64 69 6e 67 20 64 61 74 61 20 74 6f 20 62 65 20  ding data to be 
38a0: 73 6f 72 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 56  sorted */.){.  V
38b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
38c0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6e 45  >pVdbe;.  int nE
38d0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
38e0: 6e 45 78 70 72 3b 0a 20 20 69 6e 74 20 72 65 67  nExpr;.  int reg
38f0: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
3900: 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  tTempRange(pPars
3910: 65 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69  e, nExpr+2);.  i
3920: 6e 74 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73  nt regRecord = s
3930: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
3940: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
3950: 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  op;.  sqlite3Exp
3960: 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
3970: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  se);.  sqlite3Ex
3980: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
3990: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
39a0: 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20   regBase, 0);.  
39b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
39c0: 32 28 76 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65  2(v, OP_Sequence
39d0: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
39e0: 72 73 6f 72 2c 20 72 65 67 42 61 73 65 2b 6e 45  rsor, regBase+nE
39f0: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  xpr);.  sqlite3E
3a00: 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
3a10: 73 65 2c 20 72 65 67 44 61 74 61 2c 20 72 65 67  se, regData, reg
3a20: 42 61 73 65 2b 6e 45 78 70 72 2b 31 2c 20 31 29  Base+nExpr+1, 1)
3a30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
3a40: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  ddOp3(v, OP_Make
3a50: 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73 65 2c  Record, regBase,
3a60: 20 6e 45 78 70 72 20 2b 20 32 2c 20 72 65 67 52   nExpr + 2, regR
3a70: 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 20 70 53  ecord);.  if( pS
3a80: 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
3a90: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
3aa0: 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53 6f  {.    op = OP_So
3ab0: 72 74 65 72 49 6e 73 65 72 74 3b 0a 20 20 7d 65  rterInsert;.  }e
3ac0: 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 4f 50  lse{.    op = OP
3ad0: 5f 49 64 78 49 6e 73 65 72 74 3b 0a 20 20 7d 0a  _IdxInsert;.  }.
3ae0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
3af0: 4f 70 32 28 76 2c 20 6f 70 2c 20 70 4f 72 64 65  Op2(v, op, pOrde
3b00: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20 72  rBy->iECursor, r
3b10: 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
3b20: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
3b30: 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
3b40: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
3b50: 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
3b60: 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
3b70: 2c 20 6e 45 78 70 72 2b 32 29 3b 0a 20 20 69 66  , nExpr+2);.  if
3b80: 28 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69  ( pSelect->iLimi
3b90: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64  t ){.    int add
3ba0: 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 20 20 69  r1, addr2;.    i
3bb0: 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69  nt iLimit;.    i
3bc0: 66 28 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66  f( pSelect->iOff
3bd0: 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 4c 69  set ){.      iLi
3be0: 6d 69 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69  mit = pSelect->i
3bf0: 4f 66 66 73 65 74 2b 31 3b 0a 20 20 20 20 7d 65  Offset+1;.    }e
3c00: 6c 73 65 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69  lse{.      iLimi
3c10: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 69 4c 69  t = pSelect->iLi
3c20: 6d 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  mit;.    }.    a
3c30: 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr1 = sqlite3Vd
3c40: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
3c50: 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 29 3b 0a  fZero, iLimit);.
3c60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3c70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64 49  ddOp2(v, OP_AddI
3c80: 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29 3b  mm, iLimit, -1);
3c90: 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c  .    addr2 = sql
3ca0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
3cb0: 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20 20  , OP_Goto);.    
3cc0: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
3cd0: 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
3ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
3cf0: 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74 2c  dOp1(v, OP_Last,
3d00: 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72   pOrderBy->iECur
3d10: 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  sor);.    sqlite
3d20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3d30: 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65 72  P_Delete, pOrder
3d40: 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a 20  By->iECursor);. 
3d50: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
3d60: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32 29  mpHere(v, addr2)
3d70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
3d80: 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65  dd code to imple
3d90: 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54 0a  ment the OFFSET.
3da0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3db0: 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64 62  odeOffset(.  Vdb
3dc0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
3dd0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
3de0: 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a  into this VM */.
3df0: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20 20    int iOffset,  
3e00: 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20      /* Register 
3e10: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66 73  holding the offs
3e20: 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  et counter */.  
3e30: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20 20  int iContinue   
3e40: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
3e50: 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72 65  o skip the curre
3e60: 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a  nt record */.){.
3e70: 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30 20    if( iOffset>0 
3e80: 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30 20  && iContinue!=0 
3e90: 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72 3b  ){.    int addr;
3ea0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3eb0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
3ec0: 49 6d 6d 2c 20 69 4f 66 66 73 65 74 2c 20 2d 31  Imm, iOffset, -1
3ed0: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73 71  );.    addr = sq
3ee0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3ef0: 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 69 4f 66  v, OP_IfNeg, iOf
3f00: 66 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  fset);.    sqlit
3f10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3f20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e  OP_Goto, 0, iCon
3f30: 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65  tinue);.    Vdbe
3f40: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69  Comment((v, "ski
3f50: 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73  p OFFSET records
3f60: 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  "));.    sqlite3
3f70: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
3f80: 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  addr);.  }.}../*
3f90: 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61  .** Add code tha
3fa0: 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20  t will check to 
3fb0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20  make sure the N 
3fc0: 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
3fd0: 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f  ng at iMem.** fo
3fe0: 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e  rm a distinct en
3ff0: 74 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20  try.  iTab is a 
4000: 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68  sorting index th
4010: 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75  at holds previou
4020: 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62  sly.** seen comb
4030: 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  inations of the 
4040: 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77  N values.  A new
4050: 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69   entry is made i
4060: 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65  n iTab.** if the
4070: 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65   current N value
4080: 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a  s are new..**.**
4090: 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52   A jump to addrR
40a0: 65 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e  epeat is made an
40b0: 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73  d the N+1 values
40c0: 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d   are popped from
40d0: 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66   the.** stack if
40e0: 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65   the top N eleme
40f0: 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74  nts are not dist
4100: 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inct..*/.static 
4110: 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63  void codeDistinc
4120: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
4130: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
4140: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
4150: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4160: 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20  /.  int iTab,   
4170: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74         /* A sort
4180: 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74  ing index used t
4190: 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69  o test for disti
41a0: 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74  nctness */.  int
41b0: 20 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20   addrRepeat,    
41c0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20  /* Jump to here 
41d0: 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20  if not distinct 
41e0: 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20  */.  int N,     
41f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4200: 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f  r of elements */
4210: 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20  .  int iMem     
4220: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65        /* First e
4230: 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56  lement */.){.  V
4240: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31  dbe *v;.  int r1
4250: 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  ;..  v = pParse-
4260: 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73  >pVdbe;.  r1 = s
4270: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
4280: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
4290: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
42a0: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54  (v, OP_Found, iT
42b0: 61 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20  ab, addrRepeat, 
42c0: 69 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69  iMem, N);.  sqli
42d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
42e0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
42f0: 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20  iMem, N, r1);.  
4300: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4310: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
4320: 74 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20  t, iTab, r1);.  
4330: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
4340: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
4350: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
4360: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4370: 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  RY./*.** Generat
4380: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
4390: 67 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54  ge when a SELECT
43a0: 20 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20   is used within 
43b0: 61 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a  a subexpression.
43c0: 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61  ** (example:  "a
43d0: 20 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52   IN (SELECT * FR
43e0: 4f 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74 20  OM table)") but 
43f0: 69 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e  it has more than
4400: 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c   1 result.** col
4410: 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73  umn.  We do this
4420: 20 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65   in a subroutine
4430: 20 62 65 63 61 75 73 65 20 74 68 65 20 65 72 72   because the err
4440: 6f 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72  or used to occur
4450: 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20  .** in multiple 
4460: 70 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65 72  places.  (The er
4470: 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  ror only occurs 
4480: 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77  in one place now
4490: 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61  , but we.** reta
44a0: 69 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  in the subroutin
44b0: 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f  e to minimize co
44c0: 64 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a  de disruption.).
44d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
44e0: 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d  eckForMultiColum
44f0: 6e 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20  nSelectError(.  
4500: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4510: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
4520: 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65  ntext. */.  Sele
4530: 63 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20  ctDest *pDest,  
4540: 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20   /* Destination 
4550: 6f 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74  of SELECT result
4560: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72  s */.  int nExpr
4570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4580: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
4590: 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
45a0: 20 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b   by SELECT */.){
45b0: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
45c0: 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69  Dest->eDest;.  i
45d0: 66 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65  f( nExpr>1 && (e
45e0: 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c  Dest==SRT_Mem ||
45f0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29   eDest==SRT_Set)
4600: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4610: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4620: 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72  "only a single r
4630: 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f  esult allowed fo
4640: 72 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45  r ".       "a SE
4650: 4c 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72  LECT that is par
4660: 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
4670: 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  on");.    return
4680: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
4690: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
46a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
46b0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
46c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65  e following obje
46d0: 63 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65  ct is used to re
46e0: 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  cord information
46f0: 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f   about.** how to
4700: 20 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53   process the DIS
4710: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74  TINCT keyword, t
4720: 6f 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69  o simplify passi
4730: 6e 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74  ng that informat
4740: 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20  ion.** into the 
4750: 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28  selectInnerLoop(
4760: 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79  ) routine..*/.ty
4770: 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73  pedef struct Dis
4780: 74 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63  tinctCtx Distinc
4790: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73  tCtx;.struct Dis
47a0: 74 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20  tinctCtx {.  u8 
47b0: 69 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  isTnct;      /* 
47c0: 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54  True if the DIST
47d0: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20  INCT keyword is 
47e0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20  present */.  u8 
47f0: 65 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20  eTnctType;   /* 
4800: 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45  One of the WHERE
4810: 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72  _DISTINCT_* oper
4820: 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74  ators */.  int t
4830: 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70  abTnct;    /* Ep
4840: 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73  hemeral table us
4850: 65 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20  ed for DISTINCT 
4860: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
4870: 69 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20  int addrTnct;   
4880: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
4890: 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f  _OpenEphemeral o
48a0: 70 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63  pcode for tabTnc
48b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  t */.};../*.** T
48c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65  his routine gene
48d0: 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
48e0: 6f 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66  or the inside of
48f0: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a   the inner loop.
4900: 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a  ** of a SELECT..
4910: 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20  **.** If srcTab 
4920: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
4930: 6e 20 74 68 65 20 70 45 4c 69 73 74 20 65 78 70  n the pEList exp
4940: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  ressions.** are 
4950: 65 76 61 6c 75 61 74 65 64 20 69 6e 20 6f 72 64  evaluated in ord
4960: 65 72 20 74 6f 20 67 65 74 20 74 68 65 20 64 61  er to get the da
4970: 74 61 20 66 6f 72 20 74 68 69 73 20 72 6f 77 2e  ta for this row.
4980: 20 20 49 66 20 73 72 63 54 61 62 20 69 73 0a 2a    If srcTab is.*
4990: 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 2c 20  * zero or more, 
49a0: 74 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c  then data is pul
49b0: 6c 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20  led from srcTab 
49c0: 61 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73  and pEList is us
49d0: 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74 6f 20 67  ed only .** to g
49e0: 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c 75 6d 6e  et number column
49f0: 73 20 61 6e 64 20 74 68 65 20 64 61 74 61 74 79  s and the dataty
4a00: 70 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  pe for each colu
4a10: 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
4a20: 69 64 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  id selectInnerLo
4a30: 6f 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  op(.  Parse *pPa
4a40: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
4a50: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
4a60: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
4a70: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
4a80: 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 74 65   /* The complete
4a90: 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e   select statemen
4aa0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f  t being coded */
4ab0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4ac0: 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 4c 69  ist,       /* Li
4ad0: 73 74 20 6f 66 20 76 61 6c 75 65 73 20 62 65 69  st of values bei
4ae0: 6e 67 20 65 78 74 72 61 63 74 65 64 20 2a 2f 0a  ng extracted */.
4af0: 20 20 69 6e 74 20 73 72 63 54 61 62 2c 20 20 20    int srcTab,   
4b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 75 6c            /* Pul
4b10: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  l data from this
4b20: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72   table */.  Expr
4b30: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
4b40: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55      /* If not NU
4b50: 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c 74 73  LL, sort results
4b60: 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65 79 20   using this key 
4b70: 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43 74 78  */.  DistinctCtx
4b80: 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f 2a 20   *pDistinct, /* 
4b90: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 6e 66  If not NULL, inf
4ba0: 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72 6f 63  o on how to proc
4bb0: 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a  ess DISTINCT */.
4bc0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
4bd0: 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48 6f 77  est,      /* How
4be0: 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66 20 74   to dispose of t
4bf0: 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20  he results */.  
4c00: 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c 20 20  int iContinue,  
4c10: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
4c20: 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65  here to continue
4c30: 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77 20 2a   with next row *
4c40: 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b 20 20  /.  int iBreak  
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
4c60: 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
4c70: 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69 6e 6e  k out of the inn
4c80: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20  er loop */.){.  
4c90: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
4ca0: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
4cb0: 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73 74 69  ;.  int hasDisti
4cc0: 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  nct;        /* T
4cd0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4ce0: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4cf0: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  resent */.  int 
4d00: 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20 20 20  regResult;      
4d10: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
4d20: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c 64 69   of memory holdi
4d30: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  ng result set */
4d40: 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70  .  int eDest = p
4d50: 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20 20 2f  Dest->eDest;   /
4d60: 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65  * How to dispose
4d70: 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20   of results */. 
4d80: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 44 65   int iParm = pDe
4d90: 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f 2a 20  st->iSDParm; /* 
4da0: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  First argument t
4db0: 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74 68 6f  o disposal metho
4dc0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  d */.  int nResu
4dd0: 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  ltCol;          
4de0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4df0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
4e00: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 29  /..  assert( v )
4e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
4e20: 73 74 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69  st!=0 );.  hasDi
4e30: 73 74 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e  stinct = pDistin
4e40: 63 74 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e  ct ? pDistinct->
4e50: 65 54 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52  eTnctType : WHER
4e60: 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b  E_DISTINCT_NOOP;
4e70: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
4e80: 3d 30 20 26 26 20 21 68 61 73 44 69 73 74 69 6e  =0 && !hasDistin
4e90: 63 74 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66  ct ){.    codeOf
4ea0: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
4eb0: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
4ec0: 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c 6c 20 74    }..  /* Pull t
4ed0: 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
4ee0: 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20 6e 52 65  umns..  */.  nRe
4ef0: 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74  sultCol = pEList
4f00: 2d 3e 6e 45 78 70 72 3b 0a 20 20 69 66 28 20 70  ->nExpr;.  if( p
4f10: 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
4f20: 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53 64  {.    pDest->iSd
4f30: 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  st = pParse->nMe
4f40: 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d 3e  m+1;.    pDest->
4f50: 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43  nSdst = nResultC
4f60: 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  ol;.    pParse->
4f70: 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43  nMem += nResultC
4f80: 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20  ol;.  }else{ .  
4f90: 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
4fa0: 3e 6e 53 64 73 74 3d 3d 6e 52 65 73 75 6c 74 43  >nSdst==nResultC
4fb0: 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67 52  ol );.  }.  regR
4fc0: 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e 69  esult = pDest->i
4fd0: 53 64 73 74 3b 0a 20 20 69 66 28 20 73 72 63 54  Sdst;.  if( srcT
4fe0: 61 62 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  ab>=0 ){.    for
4ff0: 28 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43  (i=0; i<nResultC
5000: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
5010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5020: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
5030: 73 72 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65  srcTab, i, regRe
5040: 73 75 6c 74 2b 69 29 3b 0a 20 20 20 20 20 20 56  sult+i);.      V
5050: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
5060: 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69  %s", pEList->a[i
5070: 5d 2e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ].zName));.    }
5080: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44 65  .  }else if( eDe
5090: 73 74 21 3d 53 52 54 5f 45 78 69 73 74 73 20 29  st!=SRT_Exists )
50a0: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
50b0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 61  destination is a
50c0: 6e 20 45 58 49 53 54 53 28 2e 2e 2e 29 20 65 78  n EXISTS(...) ex
50d0: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 20 61 63  pression, the ac
50e0: 74 75 61 6c 0a 20 20 20 20 2a 2a 20 76 61 6c 75  tual.    ** valu
50f0: 65 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  es returned by t
5100: 68 65 20 53 45 4c 45 43 54 20 61 72 65 20 6e 6f  he SELECT are no
5110: 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  t required..    
5120: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  */.    sqlite3Ex
5130: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
5140: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72  Parse, pEList, r
5150: 65 67 52 65 73 75 6c 74 2c 0a 20 20 20 20 20 20  egResult,.      
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 20 20 20 20 20 20 28 65 44 65 73 74 3d 3d 53 52        (eDest==SR
5180: 54 5f 4f 75 74 70 75 74 29 3f 53 51 4c 49 54 45  T_Output)?SQLITE
5190: 5f 45 43 45 4c 5f 44 55 50 3a 30 29 3b 0a 20 20  _ECEL_DUP:0);.  
51a0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 44  }..  /* If the D
51b0: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
51c0: 77 61 73 20 70 72 65 73 65 6e 74 20 6f 6e 20 74  was present on t
51d0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
51e0: 65 6e 74 0a 20 20 2a 2a 20 61 6e 64 20 74 68 69  ent.  ** and thi
51f0: 73 20 72 6f 77 20 68 61 73 20 62 65 65 6e 20 73  s row has been s
5200: 65 65 6e 20 62 65 66 6f 72 65 2c 20 74 68 65 6e  een before, then
5210: 20 64 6f 20 6e 6f 74 20 6d 61 6b 65 20 74 68 69   do not make thi
5220: 73 20 72 6f 77 0a 20 20 2a 2a 20 70 61 72 74 20  s row.  ** part 
5230: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 20  of the result.. 
5240: 20 2a 2f 0a 20 20 69 66 28 20 68 61 73 44 69 73   */.  if( hasDis
5250: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 73 77 69  tinct ){.    swi
5260: 74 63 68 28 20 70 44 69 73 74 69 6e 63 74 2d 3e  tch( pDistinct->
5270: 65 54 6e 63 74 54 79 70 65 20 29 7b 0a 20 20 20  eTnctType ){.   
5280: 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44 49     case WHERE_DI
5290: 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44 3a 20  STINCT_ORDERED: 
52a0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 4f 70  {.        VdbeOp
52b0: 20 2a 70 4f 70 3b 20 20 20 20 20 20 20 20 20 20   *pOp;          
52c0: 20 20 2f 2a 20 4e 6f 20 6c 6f 6e 67 65 72 20 72    /* No longer r
52d0: 65 71 75 69 72 65 64 20 4f 70 65 6e 45 70 68 65  equired OpenEphe
52e0: 6d 65 72 61 6c 20 69 6e 73 74 72 2e 20 2a 2f 0a  meral instr. */.
52f0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 4a 75 6d          int iJum
5300: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
5310: 2f 2a 20 4a 75 6d 70 20 64 65 73 74 69 6e 61 74  /* Jump destinat
5320: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ion */.        i
5330: 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
5340: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f         /* Previo
5350: 75 73 20 72 6f 77 20 63 6f 6e 74 65 6e 74 20 2a  us row content *
5360: 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  /..        /* Al
5370: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
5380: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
5390: 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 67  w */.        reg
53a0: 50 72 65 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Prev = pParse->n
53b0: 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20 70  Mem+1;.        p
53c0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
53d0: 52 65 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 20 20  ResultCol;..    
53e0: 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68      /* Change th
53f0: 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
5400: 61 6c 20 63 6f 64 65 64 20 65 61 72 6c 69 65 72  al coded earlier
5410: 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c 6c 0a 20   to an OP_Null. 
5420: 20 20 20 20 20 20 20 2a 2a 20 73 65 74 73 20 74         ** sets t
5430: 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65 64 20 62  he MEM_Cleared b
5440: 69 74 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  it on the first 
5450: 72 65 67 69 73 74 65 72 20 6f 66 20 74 68 65 0a  register of the.
5460: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
5470: 6f 75 73 20 76 61 6c 75 65 2e 20 20 54 68 69 73  ous value.  This
5480: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
5490: 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74 6f 20 61  OP_Ne below to a
54a0: 6c 77 61 79 73 0a 20 20 20 20 20 20 20 20 2a 2a  lways.        **
54b0: 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 66 69 72   fail on the fir
54c0: 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
54d0: 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e 20 69 66  the loop even if
54e0: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
54f0: 20 20 20 2a 2a 20 72 6f 77 20 69 73 20 61 6c 6c     ** row is all
5500: 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20 20 20 20   NULLs..        
5510: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
5520: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
5530: 6f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  op(v, pDistinct-
5540: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
5550: 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65      pOp = sqlite
5560: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 44  3VdbeGetOp(v, pD
5570: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
5580: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  t);.        pOp-
5590: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 75 6c  >opcode = OP_Nul
55a0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  l;.        pOp->
55b0: 70 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  p1 = 1;.        
55c0: 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67 50 72 65  pOp->p2 = regPre
55d0: 76 3b 0a 0a 20 20 20 20 20 20 20 20 69 4a 75 6d  v;..        iJum
55e0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
55f0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
5600: 6e 52 65 73 75 6c 74 43 6f 6c 3b 0a 20 20 20 20  nResultCol;.    
5610: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
5620: 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29 7b  ResultCol; i++){
5630: 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  .          CollS
5640: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *pColl = sqli
5650: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
5660: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61  Parse, pEList->a
5670: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
5680: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 52 65 73        if( i<nRes
5690: 75 6c 74 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20  ultCol-1 ){.    
56a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
56b0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
56c0: 4e 65 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c  Ne, regResult+i,
56d0: 20 69 4a 75 6d 70 2c 20 72 65 67 50 72 65 76 2b   iJump, regPrev+
56e0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  i);.          }e
56f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
5700: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5710: 70 33 28 76 2c 20 4f 50 5f 45 71 2c 20 72 65 67  p3(v, OP_Eq, reg
5720: 52 65 73 75 6c 74 2b 69 2c 20 69 43 6f 6e 74 69  Result+i, iConti
5730: 6e 75 65 2c 20 72 65 67 50 72 65 76 2b 69 29 3b  nue, regPrev+i);
5740: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5750: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5760: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
5770: 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  , (const char *)
5780: 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
5790: 51 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Q);.          sq
57a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
57b0: 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  5(v, SQLITE_NULL
57c0: 45 51 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  EQ);.        }. 
57d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
57e0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
57f0: 74 41 64 64 72 28 76 29 3d 3d 69 4a 75 6d 70 20  tAddr(v)==iJump 
5800: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5810: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5820: 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52 65 73 75  OP_Copy, regResu
5830: 6c 74 2c 20 72 65 67 50 72 65 76 2c 20 6e 52 65  lt, regPrev, nRe
5840: 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20 20 20 20  sultCol-1);.    
5850: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5860: 20 7d 0a 0a 20 20 20 20 20 20 63 61 73 65 20 57   }..      case W
5870: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
5880: 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
5890: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
58a0: 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74  eToNoop(v, pDist
58b0: 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b  inct->addrTnct);
58c0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
58d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 64        }..      d
58e0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
58f0: 20 20 61 73 73 65 72 74 28 20 70 44 69 73 74 69    assert( pDisti
5900: 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 3d 3d  nct->eTnctType==
5910: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
5920: 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20 20 20 20  NORDERED );.    
5930: 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
5940: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
5950: 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20 69 43 6f  ct->tabTnct, iCo
5960: 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75 6c 74 43  ntinue, nResultC
5970: 6f 6c 2c 20 72 65 67 52 65 73 75 6c 74 29 3b 0a  ol, regResult);.
5980: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5990: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
59a0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
59b0: 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 4f 66   ){.      codeOf
59c0: 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73  fset(v, p->iOffs
59d0: 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a  et, iContinue);.
59e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 77 69      }.  }..  swi
59f0: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
5a00: 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 6d 6f 64    /* In this mod
5a10: 65 2c 20 77 72 69 74 65 20 65 61 63 68 20 71 75  e, write each qu
5a20: 65 72 79 20 72 65 73 75 6c 74 20 74 6f 20 74 68  ery result to th
5a30: 65 20 6b 65 79 20 6f 66 20 74 68 65 20 74 65 6d  e key of the tem
5a40: 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a 20 74 61  porary.    ** ta
5a50: 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20 20 2a  ble iParm..    *
5a60: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
5a70: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
5a80: 45 4c 45 43 54 0a 20 20 20 20 63 61 73 65 20 53  ELECT.    case S
5a90: 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20 20 20 20  RT_Union: {.    
5aa0: 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20    int r1;.      
5ab0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
5ac0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
5ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5ae0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
5af0: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
5b00: 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c  ult, nResultCol,
5b10: 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
5b20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
5b30: 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
5b40: 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20  Parm, r1);.     
5b50: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
5b60: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
5b70: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
5b80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
5b90: 6f 6e 73 74 72 75 63 74 20 61 20 72 65 63 6f 72  onstruct a recor
5ba0: 64 20 66 72 6f 6d 20 74 68 65 20 71 75 65 72 79  d from the query
5bb0: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 69 6e 73   result, but ins
5bc0: 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 73  tead of.    ** s
5bd0: 61 76 69 6e 67 20 74 68 61 74 20 72 65 63 6f 72  aving that recor
5be0: 64 2c 20 75 73 65 20 69 74 20 61 73 20 61 20 6b  d, use it as a k
5bf0: 65 79 20 74 6f 20 64 65 6c 65 74 65 20 65 6c 65  ey to delete ele
5c00: 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20 20 20 2a  ments from.    *
5c10: 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  * the temporary 
5c20: 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20 20  table iParm..   
5c30: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
5c40: 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20 20 20 20  _Except: {.     
5c50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5c60: 70 33 28 76 2c 20 4f 50 5f 49 64 78 44 65 6c 65  p3(v, OP_IdxDele
5c70: 74 65 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 65  te, iParm, regRe
5c80: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
5c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5ca0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
5cb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
5cc0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
5cd0: 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
5ce0: 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
5cf0: 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
5d00: 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
5d10: 61 73 65 20 53 52 54 5f 44 69 73 74 54 61 62 6c  ase SRT_DistTabl
5d20: 65 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  e:.    case SRT_
5d30: 54 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20  Table:.    case 
5d40: 53 52 54 5f 45 70 68 65 6d 54 61 62 3a 20 7b 0a  SRT_EphemTab: {.
5d50: 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73        int r1 = s
5d60: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
5d70: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
5d80: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
5d90: 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20  =SRT_Table );.  
5da0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
5db0: 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
5dc0: 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
5dd0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
5de0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
5df0: 65 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c  egResult, nResul
5e00: 74 43 6f 6c 2c 20 72 31 29 3b 0a 23 69 66 6e 64  tCol, r1);.#ifnd
5e10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
5e20: 54 45 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  TE.      if( eDe
5e30: 73 74 3d 3d 53 52 54 5f 44 69 73 74 54 61 62 6c  st==SRT_DistTabl
5e40: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
5e50: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
5e60: 6f 6e 20 69 73 20 44 69 73 74 54 61 62 6c 65 2c  on is DistTable,
5e70: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
5e80: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
5e90: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 6e 20         ** on an 
5ea0: 65 70 68 65 6d 65 72 61 6c 20 69 6e 64 65 78 2e  ephemeral index.
5eb0: 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
5ec0: 72 6f 77 20 69 73 20 61 6c 72 65 61 64 79 20 70  row is already p
5ed0: 72 65 73 65 6e 74 0a 20 20 20 20 20 20 20 20 2a  resent.        *
5ee0: 2a 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 20  * in the index, 
5ef0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 20  do not write it 
5f00: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20 49  to the output. I
5f10: 66 20 6e 6f 74 2c 20 61 64 64 20 74 68 65 0a 20  f not, add the. 
5f20: 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e         ** curren
5f30: 74 20 72 6f 77 20 74 6f 20 74 68 65 20 69 6e 64  t row to the ind
5f40: 65 78 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77  ex and proceed w
5f50: 69 74 68 20 77 72 69 74 69 6e 67 20 69 74 20 74  ith writing it t
5f60: 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
5f70: 20 6f 75 74 70 75 74 20 74 61 62 6c 65 20 61 73   output table as
5f80: 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   well.  */.     
5f90: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
5fa0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
5fb0: 41 64 64 72 28 76 29 20 2b 20 34 3b 0a 20 20 20  Addr(v) + 4;.   
5fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5fd0: 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
5fe0: 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b 31 2c 20  Found, iParm+1, 
5ff0: 61 64 64 72 2c 20 72 31 2c 20 30 29 3b 0a 20 20  addr, r1, 0);.  
6000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6010: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
6020: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
6030: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 61  , r1);.        a
6040: 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 3d  ssert( pOrderBy=
6050: 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  =0 );.      }.#e
6060: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
6070: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
6080: 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65     pushOntoSorte
6090: 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72  r(pParse, pOrder
60a0: 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20  By, p, r1);.    
60b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
60c0: 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65   int r2 = sqlite
60d0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
60e0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  se);.        sql
60f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6100: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69  , OP_NewRowid, i
6110: 50 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20  Parm, r2);.     
6120: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6130: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
6140: 74 2c 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32  t, iParm, r1, r2
6150: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6160: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
6170: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
6180: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6190: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
61a0: 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20  pParse, r2);.   
61b0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
61c0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
61d0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
61e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
61f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6200: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
6210: 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
6220: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 66  creating a set f
6230: 6f 72 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28  or an "expr IN (
6240: 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e  SELECT ...)" con
6250: 73 74 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74  struct,.    ** t
6260: 68 65 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64  hen there should
6270: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65   be a single ite
6280: 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  m on the stack. 
6290: 20 57 72 69 74 65 20 74 68 69 73 0a 20 20 20 20   Write this.    
62a0: 2a 2a 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65  ** item into the
62b0: 20 73 65 74 20 74 61 62 6c 65 20 77 69 74 68 20   set table with 
62c0: 62 6f 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20  bogus data..    
62d0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f  */.    case SRT_
62e0: 53 65 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  Set: {.      ass
62f0: 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d  ert( nResultCol=
6300: 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 44 65 73  =1 );.      pDes
6310: 74 2d 3e 61 66 66 53 64 73 74 20 3d 0a 20 20 20  t->affSdst =.   
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6330: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
6340: 69 6e 69 74 79 28 70 45 4c 69 73 74 2d 3e 61 5b  inity(pEList->a[
6350: 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
6360: 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  >affSdst);.     
6370: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
6380: 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 66  .        /* At f
6390: 69 72 73 74 20 67 6c 61 6e 63 65 20 79 6f 75 20  irst glance you 
63a0: 77 6f 75 6c 64 20 74 68 69 6e 6b 20 77 65 20 63  would think we c
63b0: 6f 75 6c 64 20 6f 70 74 69 6d 69 7a 65 20 6f 75  ould optimize ou
63c0: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
63d0: 20 4f 52 44 45 52 20 42 59 20 69 6e 20 74 68 69   ORDER BY in thi
63e0: 73 20 63 61 73 65 20 73 69 6e 63 65 20 74 68 65  s case since the
63f0: 20 6f 72 64 65 72 20 6f 66 20 65 6e 74 72 69 65   order of entrie
6400: 73 20 69 6e 20 74 68 65 20 73 65 74 0a 20 20 20  s in the set.   
6410: 20 20 20 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74       ** does not
6420: 20 6d 61 74 74 65 72 2e 20 20 42 75 74 20 74 68   matter.  But th
6430: 65 72 65 20 6d 69 67 68 74 20 62 65 20 61 20 4c  ere might be a L
6440: 49 4d 49 54 20 63 6c 61 75 73 65 2c 20 69 6e 20  IMIT clause, in 
6450: 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a  which.        **
6460: 20 63 61 73 65 20 74 68 65 20 6f 72 64 65 72 20   case the order 
6470: 64 6f 65 73 20 6d 61 74 74 65 72 20 2a 2f 0a 20  does matter */. 
6480: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
6490: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
64a0: 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65  rderBy, p, regRe
64b0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  sult);.      }el
64c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
64d0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
64e0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
64f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6500: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
6510: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52  MakeRecord, regR
6520: 65 73 75 6c 74 2c 31 2c 72 31 2c 20 26 70 44 65  esult,1,r1, &pDe
6530: 73 74 2d 3e 61 66 66 53 64 73 74 2c 20 31 29 3b  st->affSdst, 1);
6540: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6550: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
6560: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
6570: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
6580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6590: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
65a0: 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c  dxInsert, iParm,
65b0: 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
65c0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
65d0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
65e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
65f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
6600: 20 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65   /* If any row e
6610: 78 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75  xist in the resu
6620: 6c 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74  lt set, record t
6630: 68 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f  hat fact and abo
6640: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  rt..    */.    c
6650: 61 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20  ase SRT_Exists: 
6660: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
6670: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6680: 49 6e 74 65 67 65 72 2c 20 31 2c 20 69 50 61 72  Integer, 1, iPar
6690: 6d 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  m);.      /* The
66a0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
66b0: 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
66c0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
66d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
66e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
66f0: 69 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73  is is a scalar s
6700: 65 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61  elect that is pa
6710: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
6720: 69 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ion, then.    **
6730: 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
6740: 74 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70  ts in the approp
6750: 72 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c  riate memory cel
6760: 6c 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a  l and break out.
6770: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63      ** of the sc
6780: 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  an loop..    */.
6790: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
67a0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
67b0: 28 20 6e 52 65 73 75 6c 74 43 6f 6c 3d 3d 31 20  ( nResultCol==1 
67c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
67d0: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
67e0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
67f0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
6800: 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29 3b  , p, regResult);
6810: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6830: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
6840: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 69 50 61  , regResult, iPa
6850: 72 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  rm, 1);.        
6860: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61  /* The LIMIT cla
6870: 75 73 65 20 77 69 6c 6c 20 6a 75 6d 70 20 6f 75  use will jump ou
6880: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f  t of the loop fo
6890: 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r us */.      }.
68a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
68b0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   }.#endif /* #if
68c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
68d0: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20  _SUBQUERY */..  
68e0: 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
68f0: 74 69 6e 65 3a 20 20 20 20 20 20 20 2f 2a 20 53  tine:       /* S
6900: 65 6e 64 20 64 61 74 61 20 74 6f 20 61 20 63 6f  end data to a co
6910: 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20  -routine */.    
6920: 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74 3a  case SRT_Output:
6930: 20 7b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74   {        /* Ret
6940: 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20  urn the results 
6950: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
6960: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
6970: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
6980: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
6990: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b 0a  ==SRT_Output );.
69a0: 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72        if( pOrder
69b0: 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  By ){.        in
69c0: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
69d0: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
69e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
69f0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6a00: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65  P_MakeRecord, re
6a10: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
6a20: 43 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Col, r1);.      
6a30: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
6a40: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
6a50: 79 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  y, p, r1);.     
6a60: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
6a70: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
6a80: 20 72 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73   r1);.      }els
6a90: 65 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54  e if( eDest==SRT
6aa0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
6ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6ac0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
6ad0: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
6ae0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  arm);.      }els
6af0: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
6b00: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6b10: 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65  OP_ResultRow, re
6b20: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
6b30: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
6b40: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
6b50: 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
6b60: 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  rse, regResult, 
6b70: 6e 52 65 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20  nResultCol);.   
6b80: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6b90: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
6ba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
6bb0: 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
6bc0: 65 20 72 65 73 75 6c 74 73 20 69 6e 74 6f 20 61  e results into a
6bd0: 20 70 72 69 6f 72 69 74 79 20 71 75 65 75 65 20   priority queue 
6be0: 74 68 61 74 20 69 73 20 6f 72 64 65 72 20 61 63  that is order ac
6bf0: 63 6f 72 64 69 6e 67 20 74 6f 0a 20 20 20 20 2a  cording to.    *
6c00: 2a 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  * pDest->pOrderB
6c10: 79 20 28 69 6e 20 70 53 4f 29 2e 20 20 70 44 65  y (in pSO).  pDe
6c20: 73 74 2d 3e 69 53 44 50 61 72 6d 20 28 69 6e 20  st->iSDParm (in 
6c30: 69 50 61 72 6d 29 20 69 73 20 74 68 65 20 63 75  iParm) is the cu
6c40: 72 73 6f 72 20 66 6f 72 20 61 6e 0a 20 20 20 20  rsor for an.    
6c50: 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 70 53  ** index with pS
6c60: 4f 2d 3e 6e 45 78 70 72 2b 32 20 63 6f 6c 75 6d  O->nExpr+2 colum
6c70: 6e 73 2e 20 20 42 75 69 6c 64 20 61 20 6b 65 79  ns.  Build a key
6c80: 20 75 73 69 6e 67 20 70 53 4f 20 66 6f 72 20 74   using pSO for t
6c90: 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  he first.    ** 
6ca0: 70 53 4f 2d 3e 6e 45 78 70 72 20 63 6f 6c 75 6d  pSO->nExpr colum
6cb0: 6e 73 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ns, then make su
6cc0: 72 65 20 61 6c 6c 20 6b 65 79 73 20 61 72 65 20  re all keys are 
6cd0: 75 6e 69 71 75 65 20 62 79 20 61 64 64 69 6e 67  unique by adding
6ce0: 20 61 0a 20 20 20 20 2a 2a 20 66 69 6e 61 6c 20   a.    ** final 
6cf0: 4f 50 5f 53 65 71 75 65 6e 63 65 20 63 6f 6c 75  OP_Sequence colu
6d00: 6d 6e 2e 20 20 54 68 65 20 6c 61 73 74 20 63 6f  mn.  The last co
6d10: 6c 75 6d 6e 20 69 73 20 74 68 65 20 72 65 63 6f  lumn is the reco
6d20: 72 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20 20  rd as a blob..  
6d30: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
6d40: 54 5f 44 69 73 74 51 75 65 75 65 3a 0a 20 20 20  T_DistQueue:.   
6d50: 20 63 61 73 65 20 53 52 54 5f 51 75 65 75 65 3a   case SRT_Queue:
6d60: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65   {.      int nKe
6d70: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c  y;.      int r1,
6d80: 20 72 32 2c 20 72 33 3b 0a 20 20 20 20 20 20 69   r2, r3;.      i
6d90: 6e 74 20 61 64 64 72 54 65 73 74 20 3d 20 30 3b  nt addrTest = 0;
6da0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
6db0: 2a 70 53 4f 3b 0a 20 20 20 20 20 20 70 53 4f 20  *pSO;.      pSO 
6dc0: 3d 20 70 44 65 73 74 2d 3e 70 4f 72 64 65 72 42  = pDest->pOrderB
6dd0: 79 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  y;.      assert(
6de0: 20 70 53 4f 20 29 3b 0a 20 20 20 20 20 20 6e 4b   pSO );.      nK
6df0: 65 79 20 3d 20 70 53 4f 2d 3e 6e 45 78 70 72 3b  ey = pSO->nExpr;
6e00: 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
6e10: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
6e20: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 72 32 20  arse);.      r2 
6e30: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
6e40: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 4b  Range(pParse, nK
6e50: 65 79 2b 32 29 3b 0a 20 20 20 20 20 20 72 33 20  ey+2);.      r3 
6e60: 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b 0a 20 20 20  = r2+nKey+1;.   
6e70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6e80: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
6e90: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
6ea0: 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 2c 20 72 33  , nResultCol, r3
6eb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 44 65  );.      if( eDe
6ec0: 73 74 3d 3d 53 52 54 5f 44 69 73 74 51 75 65 75  st==SRT_DistQueu
6ed0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
6ee0: 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74 69  If the destinati
6ef0: 6f 6e 20 69 73 20 44 69 73 74 51 75 65 75 65 2c  on is DistQueue,
6f00: 20 74 68 65 6e 20 63 75 72 73 6f 72 20 28 69 50   then cursor (iP
6f10: 61 72 6d 2b 31 29 20 69 73 20 6f 70 65 6e 0a 20  arm+1) is open. 
6f20: 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 61 20 73         ** on a s
6f30: 65 63 6f 6e 64 20 65 70 68 65 6d 65 72 61 6c 20  econd ephemeral 
6f40: 69 6e 64 65 78 20 74 68 61 74 20 68 6f 6c 64 73  index that holds
6f50: 20 61 6c 6c 20 76 61 6c 75 65 73 20 65 76 65 72   all values ever
6f60: 79 20 70 72 65 76 69 6f 75 73 6c 79 0a 20 20 20  y previously.   
6f70: 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f       ** added to
6f80: 20 74 68 65 20 71 75 65 75 65 2e 20 20 4f 6e 6c   the queue.  Onl
6f90: 79 20 61 64 64 20 74 68 69 73 20 6e 65 77 20 76  y add this new v
6fa0: 61 6c 75 65 20 69 66 20 69 74 20 68 61 73 20 6e  alue if it has n
6fb0: 65 76 65 72 20 62 65 66 6f 72 65 0a 20 20 20 20  ever before.    
6fc0: 20 20 20 20 2a 2a 20 62 65 65 6e 20 61 64 64 65      ** been adde
6fd0: 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 64 64  d */.        add
6fe0: 72 54 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56  rTest = sqlite3V
6ff0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
7000: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
7010: 31 2c 20 30 2c 20 72 33 2c 20 30 29 3b 0a 20 20  1, 0, r3, 0);.  
7020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7030: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
7040: 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d 2b 31  xInsert, iParm+1
7050: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 20 20 73  , r3);.        s
7060: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7070: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45  P5(v, OPFLAG_USE
7080: 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20  SEEKRESULT);.   
7090: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
70a0: 3d 30 3b 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29  =0; i<nKey; i++)
70b0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
70c0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
70d0: 50 5f 53 43 6f 70 79 2c 0a 20 20 20 20 20 20 20  P_SCopy,.       
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 72 65 67 52 65 73 75 6c 74 20 2b 20 70     regResult + p
7100: 53 4f 2d 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72  SO->a[i].u.x.iOr
7110: 64 65 72 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20  derByCol - 1,.  
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 20 20 20 20 20 20 20 72 32 2b 69 29 3b 0a 20          r2+i);. 
7140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7150: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7160: 2c 20 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 69  , OP_Sequence, i
7170: 50 61 72 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a  Parm, r2+nKey);.
7180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
7190: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
71a0: 6b 65 52 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b  keRecord, r2, nK
71b0: 65 79 2b 32 2c 20 72 31 29 3b 0a 20 20 20 20 20  ey+2, r1);.     
71c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
71d0: 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
71e0: 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a  rt, iParm, r1);.
71f0: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 54 65        if( addrTe
7200: 73 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  st ) sqlite3Vdbe
7210: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
7220: 54 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Test);.      sql
7230: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
7240: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
7250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
7260: 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
7270: 61 72 73 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32  arse, r2, nKey+2
7280: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7290: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
72a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
72b0: 2a 2f 0a 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e  */....#if !defin
72c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
72d0: 52 49 47 47 45 52 29 0a 20 20 20 20 2f 2a 20 44  RIGGER).    /* D
72e0: 69 73 63 61 72 64 20 74 68 65 20 72 65 73 75 6c  iscard the resul
72f0: 74 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ts.  This is use
7300: 64 20 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61  d for SELECT sta
7310: 74 65 6d 65 6e 74 73 20 69 6e 73 69 64 65 0a 20  tements inside. 
7320: 20 20 20 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f     ** the body o
7330: 66 20 61 20 54 52 49 47 47 45 52 2e 20 20 54 68  f a TRIGGER.  Th
7340: 65 20 70 75 72 70 6f 73 65 20 6f 66 20 73 75 63  e purpose of suc
7350: 68 20 73 65 6c 65 63 74 73 20 69 73 20 74 6f 20  h selects is to 
7360: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72  call.    ** user
7370: 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f  -defined functio
7380: 6e 73 20 74 68 61 74 20 68 61 76 65 20 73 69 64  ns that have sid
7390: 65 20 65 66 66 65 63 74 73 2e 20 20 57 65 20 64  e effects.  We d
73a0: 6f 20 6e 6f 74 20 63 61 72 65 0a 20 20 20 20 2a  o not care.    *
73b0: 2a 20 61 62 6f 75 74 20 74 68 65 20 61 63 74 75  * about the actu
73c0: 61 6c 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  al results of th
73d0: 65 20 73 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f  e select..    */
73e0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
73f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 44        assert( eD
7400: 65 73 74 3d 3d 53 52 54 5f 44 69 73 63 61 72 64  est==SRT_Discard
7410: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
7420: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
7430: 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
7440: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
7450: 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
7460: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 45 78   is reached.  Ex
7470: 63 65 70 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68  cept, if.  ** th
7480: 65 72 65 20 69 73 20 61 20 73 6f 72 74 65 72 2c  ere is a sorter,
7490: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
74a0: 68 65 20 73 6f 72 74 65 72 20 68 61 73 20 61 6c  he sorter has al
74b0: 72 65 61 64 79 20 6c 69 6d 69 74 65 64 0a 20 20  ready limited.  
74c0: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 20 66 6f  ** the output fo
74d0: 72 20 75 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  r us..  */.  if(
74e0: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20   pOrderBy==0 && 
74f0: 70 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->iLimit ){.   
7500: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7510: 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p3(v, OP_IfZero,
7520: 20 70 2d 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65   p->iLimit, iBre
7530: 61 6b 2c 20 2d 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  ak, -1);.  }.}..
7540: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
7550: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20   KeyInfo object 
7560: 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61  sufficient for a
7570: 6e 20 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79  n index of N key
7580: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20   columns and.** 
7590: 58 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e  X extra columns.
75a0: 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
75b0: 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
75c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
75d0: 74 20 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b  t N, int X){.  K
75e0: 65 79 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69  eyInfo *p = sqli
75f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7600: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  0, .            
7610: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4b 65         sizeof(Ke
7620: 79 49 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28  yInfo) + (N+X)*(
7630: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
7640: 2b 31 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  +1));.  if( p ){
7650: 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
7660: 65 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43  er = (u8*)&p->aC
7670: 6f 6c 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d  oll[N+X];.    p-
7680: 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e  >nField = (u16)N
7690: 3b 0a 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64  ;.    p->nXField
76a0: 20 3d 20 28 75 31 36 29 58 3b 0a 20 20 20 20 70   = (u16)X;.    p
76b0: 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  ->enc = ENC(db);
76c0: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  .    p->db = db;
76d0: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31  .    p->nRef = 1
76e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
76f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7700: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
7710: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  n p;.}../*.** De
7720: 61 6c 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e  allocate a KeyIn
7730: 66 6f 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69  fo object.*/.voi
7740: 64 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  d sqlite3KeyInfo
7750: 55 6e 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70  Unref(KeyInfo *p
7760: 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
7770: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65    assert( p->nRe
7780: 66 3e 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52  f>0 );.    p->nR
7790: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  ef--;.    if( p-
77a0: 3e 6e 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74  >nRef==0 ) sqlit
77b0: 65 33 44 62 46 72 65 65 28 30 2c 20 70 29 3b 0a  e3DbFree(0, p);.
77c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
77d0: 65 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20  e a new pointer 
77e0: 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a  to a KeyInfo obj
77f0: 65 63 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  ect.*/.KeyInfo *
7800: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
7810: 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20  f(KeyInfo *p){. 
7820: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73   if( p ){.    as
7830: 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20  sert( p->nRef>0 
7840: 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b  );.    p->nRef++
7850: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
7860: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
7870: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  TE_DEBUG./*.** R
7880: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
7890: 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63  KeyInfo object c
78a0: 61 6e 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54  an be change.  T
78b0: 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63  he KeyInfo objec
78c0: 74 0a 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65  t.** can only be
78d0: 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 69 73   changed if this
78e0: 20 69 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c   is just a singl
78f0: 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
7900: 68 65 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  he object..**.**
7910: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7920: 20 75 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64   used only insid
7930: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
7940: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
7950: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
7960: 73 57 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e  sWriteable(KeyIn
7970: 66 6f 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70  fo *p){ return p
7980: 2d 3e 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e  ->nRef==1; }.#en
7990: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
79a0: 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69  BUG */../*.** Gi
79b0: 76 65 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ven an expressio
79c0: 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65  n list, generate
79d0: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
79e0: 74 75 72 65 20 74 68 61 74 20 72 65 63 6f 72 64  ture that record
79f0: 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69  s.** the collati
7a00: 6e 67 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  ng sequence for 
7a10: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
7a20: 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69  in that expressi
7a30: 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  on list..**.** I
7a40: 66 20 74 68 65 20 45 78 70 72 4c 69 73 74 20 69  f the ExprList i
7a50: 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  s an ORDER BY or
7a60: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
7a70: 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
7a80: 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73  ing.** KeyInfo s
7a90: 74 72 75 63 74 75 72 65 20 69 73 20 61 70 70 72  tructure is appr
7aa0: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74  opriate for init
7ab0: 69 61 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75  ializing a virtu
7ac0: 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69  al index to.** i
7ad0: 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c  mplement that cl
7ae0: 61 75 73 65 2e 20 20 49 66 20 74 68 65 20 45 78  ause.  If the Ex
7af0: 70 72 4c 69 73 74 20 69 73 20 74 68 65 20 72 65  prList is the re
7b00: 73 75 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45  sult set of a SE
7b10: 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65  LECT.** then the
7b20: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
7b30: 72 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  re is appropriat
7b40: 65 20 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69  e for initializi
7b50: 6e 67 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20  ng a virtual.** 
7b60: 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65  index to impleme
7b70: 6e 74 20 61 20 44 49 53 54 49 4e 43 54 20 74 65  nt a DISTINCT te
7b80: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  st..**.** Space 
7b90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49  to hold the KeyI
7ba0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73  nfo structure is
7bb0: 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c   obtain from mal
7bc0: 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  loc.  The callin
7bd0: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
7be0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
7bf0: 20 73 65 65 69 6e 67 20 74 68 61 74 20 74 68 69   seeing that thi
7c00: 73 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  s structure is e
7c10: 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65  ventually.** fre
7c20: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65  ed..*/.static Ke
7c30: 79 49 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72  yInfo *keyInfoFr
7c40: 6f 6d 45 78 70 72 4c 69 73 74 28 50 61 72 73 65  omExprList(Parse
7c50: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69   *pParse, ExprLi
7c60: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6e  st *pList, int n
7c70: 45 78 74 72 61 29 7b 0a 20 20 69 6e 74 20 6e 45  Extra){.  int nE
7c80: 78 70 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  xpr;.  KeyInfo *
7c90: 70 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20  pInfo;.  struct 
7ca0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
7cb0: 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20  Item;.  sqlite3 
7cc0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7cd0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45  ;.  int i;..  nE
7ce0: 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  xpr = pList->nEx
7cf0: 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71  pr;.  pInfo = sq
7d00: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
7d10: 63 28 64 62 2c 20 6e 45 78 70 72 2b 6e 45 78 74  c(db, nExpr+nExt
7d20: 72 61 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 49  ra, 1);.  if( pI
7d30: 6e 66 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nfo ){.    asser
7d40: 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
7d50: 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e  oIsWriteable(pIn
7d60: 66 6f 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  fo) );.    for(i
7d70: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
7d80: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
7d90: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
7da0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7db0: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
7dc0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
7dd0: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
7de0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
7df0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
7e00: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
7e10: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
7e20: 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c  >aColl[i] = pCol
7e30: 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  l;.      pInfo->
7e40: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
7e50: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
7e60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7e70: 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23  turn pInfo;.}..#
7e80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7e90: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
7ea0: 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66  CT./*.** Name of
7eb0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
7ec0: 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66  operator, used f
7ed0: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
7ee0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  s..*/.static con
7ef0: 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f  st char *selectO
7f00: 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20  pName(int id){. 
7f10: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74   char *z;.  swit
7f20: 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61  ch( id ){.    ca
7f30: 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20  se TK_ALL:      
7f40: 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22   z = "UNION ALL"
7f50: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
7f60: 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  ase TK_INTERSECT
7f70: 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54  : z = "INTERSECT
7f80: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
7f90: 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20  case TK_EXCEPT: 
7fa0: 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b     z = "EXCEPT";
7fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7fc0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
7fd0: 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b      z = "UNION";
7fe0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7ff0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  }.  return z;.}.
8000: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8010: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
8020: 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65  ELECT */..#ifnde
8030: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
8040: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65  PLAIN./*.** Unle
8050: 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51  ss an "EXPLAIN Q
8060: 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61  UERY PLAN" comma
8070: 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63  nd is being proc
8080: 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63  essed, this func
8090: 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tion.** is a no-
80a0: 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  op. Otherwise, i
80b0: 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20  t adds a single 
80c0: 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f  row of output to
80d0: 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c   the EQP result,
80e0: 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63 61  .** where the ca
80f0: 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ption is of the 
8100: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55  form:.**.**   "U
8110: 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46  SE TEMP B-TREE F
8120: 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68  OR xxx".**.** wh
8130: 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f  ere xxx is one o
8140: 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f  f "DISTINCT", "O
8150: 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f  RDER BY" or "GRO
8160: 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20  UP BY". Exactly 
8170: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65  which.** is dete
8180: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55  rmined by the zU
8190: 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  sage argument..*
81a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
81b0: 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50  plainTempTable(P
81c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
81d0: 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65  nst char *zUsage
81e0: 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
81f0: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20  >explain==2 ){. 
8200: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
8210: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20  rse->pVdbe;.    
8220: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c  char *zMsg = sql
8230: 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
8240: 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d  se->db, "USE TEM
8250: 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22  P B-TREE FOR %s"
8260: 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73  , zUsage);.    s
8270: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
8280: 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20  (v, OP_Explain, 
8290: 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
82a0: 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50  d, 0, 0, zMsg, P
82b0: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
82c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
82d0: 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20  expression b to 
82e0: 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f  lvalue a. A seco
82f0: 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69  nd, no-op, versi
8300: 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  on of this macro
8310: 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20  .** is provided 
8320: 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54  when SQLITE_OMIT
8330: 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69  _EXPLAIN is defi
8340: 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ned. This allows
8350: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20   the code.** in 
8360: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20  sqlite3Select() 
8370: 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73  to assign values
8380: 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65   to structure me
8390: 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20 74  mber variables t
83a0: 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73  hat.** only exis
83b0: 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  t if SQLITE_OMIT
83c0: 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20  _EXPLAIN is not 
83d0: 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20  defined without 
83e0: 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a  polluting the.**
83f0: 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64   code with #ifnd
8400: 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a  ef directives..*
8410: 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61  /.# define expla
8420: 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20  inSetInteger(a, 
8430: 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a  b) a = b..#else.
8440: 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e  /* No-op version
8450: 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e  s of the explain
8460: 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20  XXX() functions 
8470: 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23  and macros. */.#
8480: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54   define explainT
8490: 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20  empTable(y,z).# 
84a0: 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65  define explainSe
84b0: 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65  tInteger(y,z).#e
84c0: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
84d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ed(SQLITE_OMIT_E
84e0: 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69  XPLAIN) && !defi
84f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8500: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29  COMPOUND_SELECT)
8510: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e  ./*.** Unless an
8520: 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20   "EXPLAIN QUERY 
8530: 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73  PLAN" command is
8540: 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64   being processed
8550: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
8560: 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f  ** is a no-op. O
8570: 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64 64  therwise, it add
8580: 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f  s a single row o
8590: 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20  f output to the 
85a0: 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77  EQP result,.** w
85b0: 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e  here the caption
85c0: 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68   is of one of th
85d0: 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a  e two forms:.**.
85e0: 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20  **   "COMPOSITE 
85f0: 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31  SUBQUERIES iSub1
8600: 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22   and iSub2 (op)"
8610: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
8620: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
8630: 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e  1 and iSub2 USIN
8640: 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f  G TEMP B-TREE (o
8650: 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20  p)".**.** where 
8660: 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32 20  iSub1 and iSub2 
8670: 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 73  are the integers
8680: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 63   passed as the c
8690: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
86a0: 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
86b0: 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74  ers, and op is t
86c0: 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e  he text represen
86d0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61  tation of the pa
86e0: 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68  rameter.** of th
86f0: 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65  e same name. The
8700: 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20   parameter "op" 
8710: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54  must be one of T
8720: 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
8730: 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53  PT,.** TK_INTERS
8740: 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54  ECT or TK_ALL. T
8750: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73  he first form is
8760: 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e   used if argumen
8770: 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a  t bUseTmp is .**
8780: 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73   false, or the s
8790: 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74  econd form if it
87a0: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
87b0: 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
87c0: 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72  Composite(.  Par
87d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87f0: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
8800: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20  .  int op,      
8810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8820: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f     /* One of TK_
8830: 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
8840: 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   etc. */.  int i
8850: 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20 20  Sub1,           
8860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
8870: 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20  bquery id 1 */. 
8880: 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20   int iSub2,     
8890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88a0: 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64 20   /* Subquery id 
88b0: 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54  2 */.  int bUseT
88c0: 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mp              
88d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
88e0: 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77  f a temp table w
88f0: 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20  as used */.){.  
8900: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55  assert( op==TK_U
8910: 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45  NION || op==TK_E
8920: 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  XCEPT || op==TK_
8930: 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d  INTERSECT || op=
8940: 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28  =TK_ALL );.  if(
8950: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
8960: 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==2 ){.    Vdbe 
8970: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
8980: 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  be;.    char *zM
8990: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
89a0: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50 61  ntf(.        pPa
89b0: 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55  rse->db, "COMPOU
89c0: 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25 64  ND SUBQUERIES %d
89d0: 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c   AND %d %s(%s)",
89e0: 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20   iSub1, iSub2,. 
89f0: 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22         bUseTmp?"
8a00: 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45  USING TEMP B-TRE
8a10: 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70  E ":"", selectOp
8a20: 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a  Name(op).    );.
8a30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8a40: 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
8a50: 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65  ain, pParse->iSe
8a60: 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d  lectId, 0, 0, zM
8a70: 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  sg, P4_DYNAMIC);
8a80: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20  .  }.}.#else./* 
8a90: 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f  No-op versions o
8aa0: 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58  f the explainXXX
8ab0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  () functions and
8ac0: 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65   macros. */.# de
8ad0: 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70  fine explainComp
8ae0: 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29  osite(v,w,x,y,z)
8af0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
8b00: 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  f the inner loop
8b10: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20 75   was generated u
8b20: 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20  sing a non-null 
8b30: 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e  pOrderBy argumen
8b40: 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72  t,.** then the r
8b50: 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63  esults were plac
8b60: 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20  ed in a sorter. 
8b70: 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20   After the loop 
8b80: 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
8b90: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20   we need to run 
8ba0: 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f  the sorter and o
8bb0: 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c 74  utput the result
8bc0: 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  s.  The followin
8bd0: 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e  g.** routine gen
8be0: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
8bf0: 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61  needed to do tha
8c00: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
8c10: 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61  d generateSortTa
8c20: 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  il(.  Parse *pPa
8c30: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
8c40: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8c50: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
8c60: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
8c70: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56  statement */.  V
8c80: 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20  dbe *v,         
8c90: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
8ca0: 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45  e into this VDBE
8cb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d   */.  int nColum
8cc0: 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  n,      /* Numbe
8cd0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  r of columns of 
8ce0: 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74  data */.  Select
8cf0: 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57  Dest *pDest /* W
8d00: 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64 20  rite the sorted 
8d10: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
8d20: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65  ){.  int addrBre
8d30: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
8d40: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20  MakeLabel(v);   
8d50: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
8d60: 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20  o exit loop */. 
8d70: 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75   int addrContinu
8d80: 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  e = sqlite3VdbeM
8d90: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a  akeLabel(v);  /*
8da0: 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e   Jump here for n
8db0: 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
8dc0: 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69  nt addr;.  int i
8dd0: 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64  Tab;.  int pseud
8de0: 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  oTab = 0;.  Expr
8df0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
8e00: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20   p->pOrderBy;.. 
8e10: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65   int eDest = pDe
8e20: 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74  st->eDest;.  int
8e30: 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e   iParm = pDest->
8e40: 69 53 44 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20  iSDParm;..  int 
8e50: 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65  regRow;.  int re
8e60: 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20  gRowid;..  iTab 
8e70: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  = pOrderBy->iECu
8e80: 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d  rsor;.  regRow =
8e90: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
8ea0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  eg(pParse);.  if
8eb0: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
8ec0: 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52  put || eDest==SR
8ed0: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20  T_Coroutine ){. 
8ee0: 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70     pseudoTab = p
8ef0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
8f00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8f10: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
8f20: 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62  seudo, pseudoTab
8f30: 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d  , regRow, nColum
8f40: 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69 64  n);.    regRowid
8f50: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8f60: 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71     regRowid = sq
8f70: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
8f80: 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69  pParse);.  }.  i
8f90: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
8fa0: 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b   SF_UseSorter ){
8fb0: 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74  .    int regSort
8fc0: 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Out = ++pParse->
8fd0: 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70 74  nMem;.    int pt
8fe0: 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  ab2 = pParse->nT
8ff0: 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  ab++;.    sqlite
9000: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
9010: 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 74  P_OpenPseudo, pt
9020: 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c  ab2, regSortOut,
9030: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
9040: 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20  +2);.    addr = 
9050: 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 + sqlite3VdbeA
9060: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
9070: 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64  erSort, iTab, ad
9080: 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f  drBreak);.    co
9090: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69  deOffset(v, p->i
90a0: 4f 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74  Offset, addrCont
90b0: 69 6e 75 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  inue);.    sqlit
90c0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
90d0: 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
90e0: 54 61 62 2c 20 72 65 67 53 6f 72 74 4f 75 74 29  Tab, regSortOut)
90f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9100: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
9110: 6c 75 6d 6e 2c 20 70 74 61 62 32 2c 20 70 4f 72  lumn, ptab2, pOr
9120: 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20  derBy->nExpr+1, 
9130: 72 65 67 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c  regRow);.    sql
9140: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
9150: 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52  (v, OPFLAG_CLEAR
9160: 43 41 43 48 45 29 3b 0a 20 20 7d 65 6c 73 65 7b  CACHE);.  }else{
9170: 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20 2b 20  .    addr = 1 + 
9180: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9190: 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c 20 69 54  2(v, OP_Sort, iT
91a0: 61 62 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a  ab, addrBreak);.
91b0: 20 20 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76      codeOffset(v
91c0: 2c 20 70 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64  , p->iOffset, ad
91d0: 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20  drContinue);.   
91e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
91f0: 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
9200: 20 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d   iTab, pOrderBy-
9210: 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77  >nExpr+1, regRow
9220: 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  );.  }.  switch(
9230: 20 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61   eDest ){.    ca
9240: 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20  se SRT_Table:.  
9250: 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d    case SRT_Ephem
9260: 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  Tab: {.      tes
9270: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
9280: 54 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  T_Table );.     
9290: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
92a0: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
92b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
92c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
92d0: 4e 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c  NewRowid, iParm,
92e0: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
92f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9300: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74  Op3(v, OP_Insert
9310: 2c 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c  , iParm, regRow,
9320: 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
9330: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
9340: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
9350: 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62  APPEND);.      b
9360: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
9370: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9380: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
9390: 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20  e SRT_Set: {.   
93a0: 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75     assert( nColu
93b0: 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73  mn==1 );.      s
93c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
93d0: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
93e0: 64 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65  d, regRow, 1, re
93f0: 67 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20  gRowid,.        
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9410: 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
9420: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
9430: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
9440: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
9450: 2c 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20  , regRow, 1);.  
9460: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9470: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
9480: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65  nsert, iParm, re
9490: 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62  gRowid);.      b
94a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
94b0: 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
94c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
94d0: 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20  olumn==1 );.    
94e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
94f0: 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65  eMove(pParse, re
9500: 67 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b  gRow, iParm, 1);
9510: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
9520: 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
9530: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
9540: 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20  op for us */.   
9550: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9560: 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75  #endif.    defau
9570: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  lt: {.      int 
9580: 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  i;.      assert(
9590: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
95a0: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
95b0: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20  _Coroutine ); . 
95c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
95d0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
95e0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
95f0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
9600: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
9610: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
9620: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
9630: 20 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52      assert( regR
9640: 6f 77 21 3d 70 44 65 73 74 2d 3e 69 53 64 73 74  ow!=pDest->iSdst
9650: 2b 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  +i );.        sq
9660: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
9670: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73  v, OP_Column, ps
9680: 65 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73  eudoTab, i, pDes
9690: 74 2d 3e 69 53 64 73 74 2b 69 29 3b 0a 20 20 20  t->iSdst+i);.   
96a0: 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b       if( i==0 ){
96b0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
96c0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
96d0: 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41  , OPFLAG_CLEARCA
96e0: 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  CHE);.        }.
96f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9700: 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ( eDest==SRT_Out
9710: 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  put ){.        s
9720: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
9730: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
9740: 2c 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20  , pDest->iSdst, 
9750: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  nColumn);.      
9760: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
9770: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
9780: 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e  (pParse, pDest->
9790: 69 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  iSdst, nColumn);
97a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
97b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
97c0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69  eAddOp1(v, OP_Yi
97d0: 65 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  eld, pDest->iSDP
97e0: 61 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arm);.      }.  
97f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9800: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65  .  }.  sqlite3Re
9810: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
9820: 72 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20  rse, regRow);.  
9830: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
9840: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
9850: 67 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54  gRowid);..  /* T
9860: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
9870: 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c   loop.  */.  sql
9880: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
9890: 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74  abel(v, addrCont
98a0: 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e  inue);.  if( p->
98b0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73  selFlags & SF_Us
98c0: 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73  eSorter ){.    s
98d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
98e0: 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78  (v, OP_SorterNex
98f0: 74 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a  t, iTab, addr);.
9900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
9910: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
9920: 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
9930: 20 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71   addr);.  }.  sq
9940: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
9950: 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65  Label(v, addrBre
9960: 61 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74  ak);.  if( eDest
9970: 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20  ==SRT_Output || 
9980: 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75  eDest==SRT_Corou
9990: 74 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tine ){.    sqli
99a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
99b0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64   OP_Close, pseud
99c0: 6f 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  oTab, 0);.  }.}.
99d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
99e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
99f0: 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ing containing t
9a00: 68 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20  he 'declaration 
9a10: 74 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20  type' of the.** 
9a20: 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
9a30: 2e 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79  . The string may
9a40: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73   be treated as s
9a50: 74 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c  tatic by the cal
9a60: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ler..**.** Also 
9a70: 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74 65 20  try to estimate 
9a80: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
9a90: 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 61  returned value a
9aa0: 6e 64 20 72 65 74 75 72 6e 20 74 68 61 74 0a 2a  nd return that.*
9ab0: 2a 20 72 65 73 75 6c 74 20 69 6e 20 2a 70 45 73  * result in *pEs
9ac0: 74 57 69 64 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68  tWidth..**.** Th
9ad0: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
9ae0: 70 65 20 69 73 20 74 68 65 20 65 78 61 63 74 20  pe is the exact 
9af0: 64 61 74 61 74 79 70 65 20 64 65 66 69 6e 69 74  datatype definit
9b00: 69 6f 6e 20 65 78 74 72 61 63 74 65 64 20 66 72  ion extracted fr
9b10: 6f 6d 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  om the.** origin
9b20: 61 6c 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  al CREATE TABLE 
9b30: 73 74 61 74 65 6d 65 6e 74 20 69 66 20 74 68 65  statement if the
9b40: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
9b50: 20 63 6f 6c 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20   column. The.** 
9b60: 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65  declaration type
9b70: 20 66 6f 72 20 61 20 52 4f 57 49 44 20 66 69 65   for a ROWID fie
9b80: 6c 64 20 69 73 20 49 4e 54 45 47 45 52 2e 20 45  ld is INTEGER. E
9b90: 78 61 63 74 6c 79 20 77 68 65 6e 20 61 6e 20 65  xactly when an e
9ba0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
9bb0: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
9bc0: 75 6d 6e 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  umn can be compl
9bd0: 65 78 20 69 6e 20 74 68 65 20 70 72 65 73 65 6e  ex in the presen
9be0: 63 65 20 6f 66 20 73 75 62 71 75 65 72 69 65 73  ce of subqueries
9bf0: 2e 20 54 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  . The.** result-
9c00: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 69  set expression i
9c10: 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  n all of the fol
9c20: 6c 6f 77 69 6e 67 20 53 45 4c 45 43 54 20 73 74  lowing SELECT st
9c30: 61 74 65 6d 65 6e 74 73 20 69 73 20 0a 2a 2a 20  atements is .** 
9c40: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 63 6f 6c  considered a col
9c50: 75 6d 6e 20 62 79 20 74 68 69 73 20 66 75 6e 63  umn by this func
9c60: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45  tion..**.**   SE
9c70: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
9c80: 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28  l;.**   SELECT (
9c90: 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20  SELECT col FROM 
9ca0: 74 62 6c 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54  tbl;.**   SELECT
9cb0: 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 46 52 4f   (SELECT col FRO
9cc0: 4d 20 74 62 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c  M tbl);.**   SEL
9cd0: 45 43 54 20 61 62 63 20 46 52 4f 4d 20 28 53 45  ECT abc FROM (SE
9ce0: 4c 45 43 54 20 63 6f 6c 20 41 53 20 61 62 63 20  LECT col AS abc 
9cf0: 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a  FROM tbl);.** .*
9d00: 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74 69 6f  * The declaratio
9d10: 6e 20 74 79 70 65 20 66 6f 72 20 61 6e 79 20 65  n type for any e
9d20: 78 70 72 65 73 73 69 6f 6e 20 6f 74 68 65 72 20  xpression other 
9d30: 74 68 61 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 73  than a column is
9d40: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   NULL..**.** Thi
9d50: 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 65 69  s routine has ei
9d60: 74 68 65 72 20 33 20 6f 72 20 36 20 70 61 72 61  ther 3 or 6 para
9d70: 6d 65 74 65 72 73 20 64 65 70 65 6e 64 69 6e 67  meters depending
9d80: 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
9d90: 6f 74 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  ot.** the SQLITE
9da0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
9db0: 45 54 41 44 41 54 41 20 63 6f 6d 70 69 6c 65 2d  ETADATA compile-
9dc0: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 75  time option is u
9dd0: 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  sed..*/.#ifdef S
9de0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
9df0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 23 20 64  UMN_METADATA.# d
9e00: 65 66 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65  efine columnType
9e10: 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f  (A,B,C,D,E,F) co
9e20: 6c 75 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42  lumnTypeImpl(A,B
9e30: 2c 43 2c 44 2c 45 2c 46 29 0a 73 74 61 74 69 63  ,C,D,E,F).static
9e40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c   const char *col
9e50: 75 6d 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e  umnTypeImpl(.  N
9e60: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
9e70: 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c   .  Expr *pExpr,
9e80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  .  const char **
9e90: 70 7a 4f 72 69 67 44 62 2c 0a 20 20 63 6f 6e 73  pzOrigDb,.  cons
9ea0: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 54  t char **pzOrigT
9eb0: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
9ec0: 20 2a 2a 70 7a 4f 72 69 67 43 6f 6c 2c 0a 20 20   **pzOrigCol,.  
9ed0: 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29 7b  u8 *pEstWidth.){
9ee0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
9ef0: 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20 20 63 68  OrigDb = 0;.  ch
9f00: 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69 67 54  ar const *zOrigT
9f10: 61 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63  ab = 0;.  char c
9f20: 6f 6e 73 74 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d  onst *zOrigCol =
9f30: 20 30 3b 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20   0;.#else /* if 
9f40: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9f50: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
9f60: 54 41 44 41 54 41 29 20 2a 2f 0a 23 20 64 65 66  TADATA) */.# def
9f70: 69 6e 65 20 63 6f 6c 75 6d 6e 54 79 70 65 28 41  ine columnType(A
9f80: 2c 42 2c 43 2c 44 2c 45 2c 46 29 20 63 6f 6c 75  ,B,C,D,E,F) colu
9f90: 6d 6e 54 79 70 65 49 6d 70 6c 28 41 2c 42 2c 46  mnTypeImpl(A,B,F
9fa0: 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ).static const c
9fb0: 68 61 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49  har *columnTypeI
9fc0: 6d 70 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  mpl(.  NameConte
9fd0: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
9fe0: 20 2a 70 45 78 70 72 2c 0a 20 20 75 38 20 2a 70   *pExpr,.  u8 *p
9ff0: 45 73 74 57 69 64 74 68 0a 29 7b 0a 23 65 6e 64  EstWidth.){.#end
a000: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
a010: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
a020: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
a030: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
a040: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
a050: 6a 3b 0a 20 20 75 38 20 65 73 74 57 69 64 74 68  j;.  u8 estWidth
a060: 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 4e 45 56   = 1;..  if( NEV
a070: 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c 7c 20  ER(pExpr==0) || 
a080: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d 3d 30  pNC->pSrcList==0
a090: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
a0a0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
a0b0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
a0c0: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
a0d0: 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20  case TK_COLUMN: 
a0e0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  {.      /* The e
a0f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
a100: 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65 20 74 68  olumn. Locate th
a110: 65 20 74 61 62 6c 65 20 74 68 65 20 63 6f 6c 75  e table the colu
a120: 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  mn is being.    
a130: 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 66    ** extracted f
a140: 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f 6e 74 65  rom in NameConte
a150: 78 74 2e 70 53 72 63 4c 69 73 74 2e 20 54 68 69  xt.pSrcList. Thi
a160: 73 20 74 61 62 6c 65 20 6d 61 79 20 62 65 20 72  s table may be r
a170: 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  eal.      ** dat
a180: 61 62 61 73 65 20 74 61 62 6c 65 20 6f 72 20 61  abase table or a
a190: 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 20   subquery..     
a1a0: 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20   */.      Table 
a1b0: 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  *pTab = 0;      
a1c0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 73        /* Table s
a1d0: 74 72 75 63 74 75 72 65 20 63 6f 6c 75 6d 6e 20  tructure column 
a1e0: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
a1f0: 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65 6c 65 63  m */.      Selec
a200: 74 20 2a 70 53 20 3d 20 30 3b 20 20 20 20 20 20  t *pS = 0;      
a210: 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74         /* Select
a220: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 65   the column is e
a230: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 2a 2f  xtracted from */
a240: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
a250: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
a260: 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63  ;  /* Index of c
a270: 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62 20 2a 2f  olumn in pTab */
a280: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
a290: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41   pExpr->op==TK_A
a2a0: 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20  GG_COLUMN );.   
a2b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
a2c0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  pr->op==TK_COLUM
a2d0: 4e 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  N );.      while
a2e0: 28 20 70 4e 43 20 26 26 20 21 70 54 61 62 20 29  ( pNC && !pTab )
a2f0: 7b 0a 20 20 20 20 20 20 20 20 53 72 63 4c 69 73  {.        SrcLis
a300: 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 4e  t *pTabList = pN
a310: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
a320: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 6a 3c 70       for(j=0;j<p
a330: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26  TabList->nSrc &&
a340: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
a350: 69 43 75 72 73 6f 72 21 3d 70 45 78 70 72 2d 3e  iCursor!=pExpr->
a360: 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a 20 20 20  iTable;j++);.   
a370: 20 20 20 20 20 69 66 28 20 6a 3c 70 54 61 62 4c       if( j<pTabL
a380: 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20  ist->nSrc ){.   
a390: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
a3a0: 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61  abList->a[j].pTa
a3b0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 20  b;.          pS 
a3c0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
a3d0: 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  .pSelect;.      
a3e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a3f0: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
a400: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
a410: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
a420: 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
a430: 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e 65 20 74       /* At one t
a440: 69 6d 65 2c 20 63 6f 64 65 20 73 75 63 68 20 61  ime, code such a
a450: 73 20 22 53 45 4c 45 43 54 20 6e 65 77 2e 78 22  s "SELECT new.x"
a460: 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67 65   within a trigge
a470: 72 20 77 6f 75 6c 64 0a 20 20 20 20 20 20 20 20  r would.        
a480: 2a 2a 20 63 61 75 73 65 20 74 68 69 73 20 63 6f  ** cause this co
a490: 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75 6e 2e 20  ndition to run. 
a4a0: 20 53 69 6e 63 65 20 74 68 65 6e 2c 20 77 65 20   Since then, we 
a4b0: 68 61 76 65 20 72 65 73 74 72 75 63 74 75 72 65  have restructure
a4c0: 64 20 68 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  d how.        **
a4d0: 20 74 72 69 67 67 65 72 20 63 6f 64 65 20 69 73   trigger code is
a4e0: 20 67 65 6e 65 72 61 74 65 64 20 61 6e 64 20 73   generated and s
a4f0: 6f 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  o this condition
a500: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 20   is no longer . 
a510: 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69 62         ** possib
a520: 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20 69 74 20  le. However, it 
a530: 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 74 72 75  can still be tru
a540: 65 20 66 6f 72 20 73 74 61 74 65 6d 65 6e 74 73  e for statements
a550: 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 2a 2a   like.        **
a560: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
a570: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
a580: 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54     **   CREATE T
a590: 41 42 4c 45 20 74 31 28 63 6f 6c 20 49 4e 54 45  ABLE t1(col INTE
a5a0: 47 45 52 29 3b 0a 20 20 20 20 20 20 20 20 2a 2a  GER);.        **
a5b0: 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45 43     SELECT (SELEC
a5c0: 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f 4d 20 46  T t1.col) FROM F
a5d0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 20 20  ROM t1;.        
a5e0: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 68  **.        ** wh
a5f0: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
a600: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
a610: 20 65 78 70 72 65 73 73 69 6f 6e 20 22 74 31 2e   expression "t1.
a620: 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a 20 20 20  col" in the .   
a630: 20 20 20 20 20 2a 2a 20 73 75 62 2d 73 65 6c 65       ** sub-sele
a640: 63 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ct. In this case
a650: 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  , set the column
a660: 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c 2c 20 65   type to NULL, e
a670: 76 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ven.        ** t
a680: 68 6f 75 67 68 20 69 74 20 73 68 6f 75 6c 64 20  hough it should 
a690: 72 65 61 6c 6c 79 20 62 65 20 22 49 4e 54 45 47  really be "INTEG
a6a0: 45 52 22 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ER"..        **.
a6b0: 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20          ** This 
a6c0: 69 73 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d  is not a problem
a6d0: 2c 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  , as the column 
a6e0: 74 79 70 65 20 6f 66 20 22 74 31 2e 63 6f 6c 22  type of "t1.col"
a6f0: 20 69 73 20 6e 65 76 65 72 0a 20 20 20 20 20 20   is never.      
a700: 20 20 2a 2a 20 75 73 65 64 2e 20 57 68 65 6e 20    ** used. When 
a710: 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20 69 73 20  columnType() is 
a720: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 65 78  called on the ex
a730: 70 72 65 73 73 69 6f 6e 20 0a 20 20 20 20 20 20  pression .      
a740: 20 20 2a 2a 20 22 28 53 45 4c 45 43 54 20 74 31    ** "(SELECT t1
a750: 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63 6f 72 72  .col)", the corr
a760: 65 63 74 20 74 79 70 65 20 69 73 20 72 65 74 75  ect type is retu
a770: 72 6e 65 64 20 28 73 65 65 20 74 68 65 20 54 4b  rned (see the TK
a780: 5f 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20  _SELECT.        
a790: 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c 6f 77 2e  ** branch below.
a7a0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65    */.        bre
a7b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ak;.      }..   
a7c0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 20     assert( pTab 
a7d0: 26 26 20 70 45 78 70 72 2d 3e 70 54 61 62 3d 3d  && pExpr->pTab==
a7e0: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 69 66  pTab );.      if
a7f0: 28 20 70 53 20 29 7b 0a 20 20 20 20 20 20 20 20  ( pS ){.        
a800: 2f 2a 20 54 68 65 20 22 74 61 62 6c 65 22 20 69  /* The "table" i
a810: 73 20 61 63 74 75 61 6c 6c 79 20 61 20 73 75 62  s actually a sub
a820: 2d 73 65 6c 65 63 74 20 6f 72 20 61 20 76 69 65  -select or a vie
a830: 77 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  w in the FROM cl
a840: 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  ause.        ** 
a850: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
a860: 61 74 65 6d 65 6e 74 2e 20 52 65 74 75 72 6e 20  atement. Return 
a870: 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  the declaration 
a880: 74 79 70 65 20 61 6e 64 20 6f 72 69 67 69 6e 0a  type and origin.
a890: 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
a8a0: 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 2d 73  for the result-s
a8b0: 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  et column of the
a8c0: 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a 20 20 20   sub-select..   
a8d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a8e0: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 41  if( iCol>=0 && A
a8f0: 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53 2d 3e 70  LWAYS(iCol<pS->p
a900: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
a910: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
a920: 20 69 43 6f 6c 20 69 73 20 6c 65 73 73 20 74 68   iCol is less th
a930: 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
a940: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65 71  e expression req
a950: 75 65 73 74 73 20 74 68 65 0a 20 20 20 20 20 20  uests the.      
a960: 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 6f 66 20      ** rowid of 
a970: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20 6f  the sub-select o
a980: 72 20 76 69 65 77 2e 20 54 68 69 73 20 65 78 70  r view. This exp
a990: 72 65 73 73 69 6f 6e 20 69 73 20 6c 65 67 61 6c  ression is legal
a9a0: 20 28 73 65 65 20 0a 20 20 20 20 20 20 20 20 20   (see .         
a9b0: 20 2a 2a 20 74 65 73 74 20 63 61 73 65 20 6d 69   ** test case mi
a9c0: 73 63 32 2e 32 2e 32 29 20 2d 20 69 74 20 61 6c  sc2.2.2) - it al
a9d0: 77 61 79 73 20 65 76 61 6c 75 61 74 65 73 20 74  ways evaluates t
a9e0: 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 20 20  o NULL..        
a9f0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4e    */.          N
aa00: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
aa10: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
aa20: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
aa30: 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20  a[iCol].pExpr;. 
aa40: 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72           sNC.pSr
aa50: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
aa60: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
aa70: 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20 20 20  pNext = pNC;.   
aa80: 20 20 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73         sNC.pPars
aa90: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
aaa0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
aab0: 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73   = columnType(&s
aac0: 4e 43 2c 20 70 2c 26 7a 4f 72 69 67 44 62 2c 26  NC, p,&zOrigDb,&
aad0: 7a 4f 72 69 67 54 61 62 2c 26 7a 4f 72 69 67 43  zOrigTab,&zOrigC
aae0: 6f 6c 2c 20 26 65 73 74 57 69 64 74 68 29 3b 20  ol, &estWidth); 
aaf0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ab00: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 2d   }else if( pTab-
ab10: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
ab20: 20 20 20 20 2f 2a 20 41 20 72 65 61 6c 20 74 61      /* A real ta
ab30: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ble */.        a
ab40: 73 73 65 72 74 28 20 21 70 53 20 29 3b 0a 20 20  ssert( !pS );.  
ab50: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
ab60: 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e   ) iCol = pTab->
ab70: 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 61  iPKey;.        a
ab80: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20  ssert( iCol==-1 
ab90: 7c 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69  || (iCol>=0 && i
aba0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20  Col<pTab->nCol) 
abb0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
abc0: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
abd0: 45 54 41 44 41 54 41 0a 20 20 20 20 20 20 20 20  ETADATA.        
abe0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
abf0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
ac00: 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20  "INTEGER";.     
ac10: 20 20 20 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20       zOrigCol = 
ac20: 22 72 6f 77 69 64 22 3b 0a 20 20 20 20 20 20 20  "rowid";.       
ac30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ac40: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
ac50: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
ac60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69  ;.          zOri
ac70: 67 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  gCol = pTab->aCo
ac80: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 3b 0a 20  l[iCol].zName;. 
ac90: 20 20 20 20 20 20 20 20 20 65 73 74 57 69 64 74           estWidt
aca0: 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  h = pTab->aCol[i
acb0: 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20  Col].szEst;.    
acc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f      }.        zO
acd0: 72 69 67 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a  rigTab = pTab->z
ace0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
acf0: 28 20 70 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b  ( pNC->pParse ){
ad00: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
ad10: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
ad20: 6d 61 54 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70  maToIndex(pNC->p
ad30: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
ad40: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
ad50: 20 20 20 20 20 7a 4f 72 69 67 44 62 20 3d 20 70       zOrigDb = p
ad60: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  NC->pParse->db->
ad70: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
ad80: 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a          }.#else.
ad90: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
ada0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
adb0: 7a 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52  zType = "INTEGER
adc0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
add0: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
ade0: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
adf0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
ae00: 20 20 20 20 20 20 65 73 74 57 69 64 74 68 20 3d        estWidth =
ae10: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ae20: 5d 2e 73 7a 45 73 74 3b 0a 20 20 20 20 20 20 20  ].szEst;.       
ae30: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
ae40: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
ae50: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
ae60: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
ae70: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
ae80: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
ae90: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
aea0: 69 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e  is a sub-select.
aeb0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c   Return the decl
aec0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64  aration type and
aed0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e  .      ** origin
aee0: 20 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69   info for the si
aef0: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ngle column in t
af00: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
af10: 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20   the SELECT.    
af20: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a    ** statement..
af30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e        */.      N
af40: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
af50: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
af60: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   = pExpr->x.pSel
af70: 65 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ect;.      Expr 
af80: 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d  *p = pS->pEList-
af90: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
afa0: 20 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48     assert( ExprH
afb0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
afc0: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
afd0: 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72  );.      sNC.pSr
afe0: 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63  cList = pS->pSrc
aff0: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78  ;.      sNC.pNex
b000: 74 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73  t = pNC;.      s
b010: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  NC.pParse = pNC-
b020: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a  >pParse;.      z
b030: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
b040: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
b050: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
b060: 26 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57  &zOrigCol, &estW
b070: 69 64 74 68 29 3b 20 0a 20 20 20 20 20 20 62 72  idth); .      br
b080: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
b090: 66 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51  f.  }..#ifdef SQ
b0a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
b0b0: 4d 4e 5f 4d 45 54 41 44 41 54 41 20 20 0a 20 20  MN_METADATA  .  
b0c0: 69 66 28 20 70 7a 4f 72 69 67 44 62 20 29 7b 0a  if( pzOrigDb ){.
b0d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 7a 4f 72      assert( pzOr
b0e0: 69 67 54 61 62 20 26 26 20 70 7a 4f 72 69 67 43  igTab && pzOrigC
b0f0: 6f 6c 20 29 3b 0a 20 20 20 20 2a 70 7a 4f 72 69  ol );.    *pzOri
b100: 67 44 62 20 3d 20 7a 4f 72 69 67 44 62 3b 0a 20  gDb = zOrigDb;. 
b110: 20 20 20 2a 70 7a 4f 72 69 67 54 61 62 20 3d 20     *pzOrigTab = 
b120: 7a 4f 72 69 67 54 61 62 3b 0a 20 20 20 20 2a 70  zOrigTab;.    *p
b130: 7a 4f 72 69 67 43 6f 6c 20 3d 20 7a 4f 72 69 67  zOrigCol = zOrig
b140: 43 6f 6c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Col;.  }.#endif.
b150: 20 20 69 66 28 20 70 45 73 74 57 69 64 74 68 20    if( pEstWidth 
b160: 29 20 2a 70 45 73 74 57 69 64 74 68 20 3d 20 65  ) *pEstWidth = e
b170: 73 74 57 69 64 74 68 3b 0a 20 20 72 65 74 75 72  stWidth;.  retur
b180: 6e 20 7a 54 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zType;.}../*.*
b190: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
b1a0: 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20 74  that will tell t
b1b0: 68 65 20 56 44 42 45 20 74 68 65 20 64 65 63 6c  he VDBE the decl
b1c0: 61 72 61 74 69 6f 6e 20 74 79 70 65 73 20 6f 66  aration types of
b1d0: 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
b1e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 2a  he result set..*
b1f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
b200: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
b210: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
b220: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
b230: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
b240: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
b250: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  t,  /* List of t
b260: 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  ables */.  ExprL
b270: 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20 2f  ist *pEList    /
b280: 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64 65  * Expressions de
b290: 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c  fining the resul
b2a0: 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 6e  t set */.){.#ifn
b2b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b2c0: 44 45 43 4c 54 59 50 45 0a 20 20 56 64 62 65 20  DECLTYPE.  Vdbe 
b2d0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
b2e0: 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4e  be;.  int i;.  N
b2f0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
b300: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
b310: 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 4e 43   pTabList;.  sNC
b320: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
b330: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
b340: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
b350: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
b360: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
b370: 45 78 70 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Expr;.    const 
b380: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 23 69 66  char *zType;.#if
b390: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b3a0: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b3b0: 41 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  A.    const char
b3c0: 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30 3b 0a 20   *zOrigDb = 0;. 
b3d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
b3e0: 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20 20  OrigTab = 0;.   
b3f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 72   const char *zOr
b400: 69 67 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7a  igCol = 0;.    z
b410: 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70  Type = columnTyp
b420: 65 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69  e(&sNC, p, &zOri
b430: 67 44 62 2c 20 26 7a 4f 72 69 67 54 61 62 2c 20  gDb, &zOrigTab, 
b440: 26 7a 4f 72 69 67 43 6f 6c 2c 20 30 29 3b 0a 0a  &zOrigCol, 0);..
b450: 20 20 20 20 2f 2a 20 54 68 65 20 76 64 62 65 20      /* The vdbe 
b460: 6d 75 73 74 20 6d 61 6b 65 20 69 74 73 20 6f 77  must make its ow
b470: 6e 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  n copy of the co
b480: 6c 75 6d 6e 2d 74 79 70 65 20 61 6e 64 20 6f 74  lumn-type and ot
b490: 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  her .    ** colu
b4a0: 6d 6e 20 73 70 65 63 69 66 69 63 20 73 74 72 69  mn specific stri
b4b0: 6e 67 73 2c 20 69 6e 20 63 61 73 65 20 74 68 65  ngs, in case the
b4c0: 20 73 63 68 65 6d 61 20 69 73 20 72 65 73 65 74   schema is reset
b4d0: 20 62 65 66 6f 72 65 20 74 68 69 73 0a 20 20 20   before this.   
b4e0: 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68   ** virtual mach
b4f0: 69 6e 65 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  ine is deleted..
b500: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
b510: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
b520: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 44  (v, i, COLNAME_D
b530: 41 54 41 42 41 53 45 2c 20 7a 4f 72 69 67 44 62  ATABASE, zOrigDb
b540: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
b550: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
b560: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
b570: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 54 41 42  , i, COLNAME_TAB
b580: 4c 45 2c 20 7a 4f 72 69 67 54 61 62 2c 20 53 51  LE, zOrigTab, SQ
b590: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
b5a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
b5b0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
b5c0: 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c 55 4d 4e 2c   COLNAME_COLUMN,
b5d0: 20 7a 4f 72 69 67 43 6f 6c 2c 20 53 51 4c 49 54   zOrigCol, SQLIT
b5e0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 23 65  E_TRANSIENT);.#e
b5f0: 6c 73 65 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  lse.    zType = 
b600: 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c  columnType(&sNC,
b610: 20 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   p, 0, 0, 0, 0);
b620: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
b630: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
b640: 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f  e(v, i, COLNAME_
b650: 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65 2c  DECLTYPE, zType,
b660: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
b670: 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  T);.  }.#endif /
b680: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
b690: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 29  E_OMIT_DECLTYPE)
b6a0: 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   */.}../*.** Gen
b6b0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
b6c0: 77 69 6c 6c 20 74 65 6c 6c 20 74 68 65 20 56 44  will tell the VD
b6d0: 42 45 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  BE the names of 
b6e0: 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
b6f0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54  e result set.  T
b700: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
b710: 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 76 69  is used to provi
b720: 64 65 20 74 68 65 0a 2a 2a 20 61 7a 43 6f 6c 5b  de the.** azCol[
b730: 5d 20 76 61 6c 75 65 73 20 69 6e 20 74 68 65 20  ] values in the 
b740: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61  callback..*/.sta
b750: 74 69 63 20 76 6f 69 64 20 67 65 6e 65 72 61 74  tic void generat
b760: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 0a 20 20  eColumnNames(.  
b770: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
b780: 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f      /* Parser co
b790: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
b7a0: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 2f  st *pTabList,  /
b7b0: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
b7c0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
b7d0: 70 45 4c 69 73 74 20 20 20 20 2f 2a 20 45 78 70  pEList    /* Exp
b7e0: 72 65 73 73 69 6f 6e 73 20 64 65 66 69 6e 69 6e  ressions definin
b7f0: 67 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  g the result set
b800: 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76   */.){.  Vdbe *v
b810: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
b820: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
b830: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b840: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
b850: 66 75 6c 6c 4e 61 6d 65 73 2c 20 73 68 6f 72 74  fullNames, short
b860: 4e 61 6d 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20  Names;..#ifndef 
b870: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
b880: 41 49 4e 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  AIN.  /* If this
b890: 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 2c 20   is an EXPLAIN, 
b8a0: 73 6b 69 70 20 74 68 69 73 20 73 74 65 70 20 2a  skip this step *
b8b0: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
b8c0: 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 72  explain ){.    r
b8d0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
b8e0: 66 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  f..  if( pParse-
b8f0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 7c 7c 20  >colNamesSet || 
b900: 4e 45 56 45 52 28 76 3d 3d 30 29 20 7c 7c 20 64  NEVER(v==0) || d
b910: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b920: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 61 72  ) return;.  pPar
b930: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
b940: 3d 20 31 3b 0a 20 20 66 75 6c 6c 4e 61 6d 65 73  = 1;.  fullNames
b950: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
b960: 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
b970: 6d 65 73 29 21 3d 30 3b 0a 20 20 73 68 6f 72 74  mes)!=0;.  short
b980: 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  Names = (db->fla
b990: 67 73 20 26 20 53 51 4c 49 54 45 5f 53 68 6f 72  gs & SQLITE_Shor
b9a0: 74 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  tColNames)!=0;. 
b9b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
b9c0: 75 6d 43 6f 6c 73 28 76 2c 20 70 45 4c 69 73 74  umCols(v, pEList
b9d0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 66 6f 72 28  ->nExpr);.  for(
b9e0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
b9f0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ba00: 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Expr *p;.    p =
ba10: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45   pEList->a[i].pE
ba20: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  xpr;.    if( NEV
ba30: 45 52 28 70 3d 3d 30 29 20 29 20 63 6f 6e 74 69  ER(p==0) ) conti
ba40: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 45 4c  nue;.    if( pEL
ba50: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
ba60: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
ba70: 4e 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Name = pEList->a
ba80: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [i].zName;.     
ba90: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
baa0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
bab0: 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65  NAME_NAME, zName
bac0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
bad0: 4e 54 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  NT);.    }else i
bae0: 66 28 20 28 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  f( (p->op==TK_CO
baf0: 4c 55 4d 4e 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  LUMN || p->op==T
bb00: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29 20 26 26  K_AGG_COLUMN) &&
bb10: 20 70 54 61 62 4c 69 73 74 20 29 7b 0a 20 20 20   pTabList ){.   
bb20: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
bb30: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
bb40: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  ;.      int iCol
bb50: 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20   = p->iColumn;. 
bb60: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 41 4c       for(j=0; AL
bb70: 57 41 59 53 28 6a 3c 70 54 61 62 4c 69 73 74 2d  WAYS(j<pTabList-
bb80: 3e 6e 53 72 63 29 3b 20 6a 2b 2b 29 7b 0a 20 20  >nSrc); j++){.  
bb90: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 4c 69        if( pTabLi
bba0: 73 74 2d 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72  st->a[j].iCursor
bbb0: 3d 3d 70 2d 3e 69 54 61 62 6c 65 20 29 20 62 72  ==p->iTable ) br
bbc0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
bbd0: 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 54 61     assert( j<pTa
bbe0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20  bList->nSrc );. 
bbf0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62       pTab = pTab
bc00: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 54 61 62 3b  List->a[j].pTab;
bc10: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
bc20: 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d  0 ) iCol = pTab-
bc30: 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20 61 73  >iPKey;.      as
bc40: 73 65 72 74 28 20 69 43 6f 6c 3d 3d 2d 31 20 7c  sert( iCol==-1 |
bc50: 7c 20 28 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  | (iCol>=0 && iC
bc60: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29  ol<pTab->nCol) )
bc70: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  ;.      if( iCol
bc80: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43  <0 ){.        zC
bc90: 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20 20  ol = "rowid";.  
bca0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bcb0: 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     zCol = pTab->
bcc0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
bcd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bce0: 69 66 28 20 21 73 68 6f 72 74 4e 61 6d 65 73 20  if( !shortNames 
bcf0: 26 26 20 21 66 75 6c 6c 4e 61 6d 65 73 20 29 7b  && !fullNames ){
bd00: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
bd10: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
bd20: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d  , i, COLNAME_NAM
bd30: 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
bd40: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
bd50: 64 62 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  db, pEList->a[i]
bd60: 2e 7a 53 70 61 6e 29 2c 20 53 51 4c 49 54 45 5f  .zSpan), SQLITE_
bd70: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
bd80: 7d 65 6c 73 65 20 69 66 28 20 66 75 6c 6c 4e 61  }else if( fullNa
bd90: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63  mes ){.        c
bda0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a  har *zName = 0;.
bdb0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
bdc0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
bdd0: 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62  b, "%s.%s", pTab
bde0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3b 0a  ->zName, zCol);.
bdf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
be00: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
be10: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
be20: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
be30: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20  DYNAMIC);.      
be40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
be50: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
be60: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
be70: 4d 45 5f 4e 41 4d 45 2c 20 7a 43 6f 6c 2c 20 53  ME_NAME, zCol, S
be80: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
be90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
bea0: 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  lse{.      const
beb0: 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 4c 69 73   char *z = pELis
bec0: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 3b 0a 20  t->a[i].zSpan;. 
bed0: 20 20 20 20 20 7a 20 3d 20 7a 3d 3d 30 20 3f 20       z = z==0 ? 
bee0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
bef0: 62 2c 20 22 63 6f 6c 75 6d 6e 25 64 22 2c 20 69  b, "column%d", i
bf00: 2b 31 29 20 3a 20 73 71 6c 69 74 65 33 44 62 53  +1) : sqlite3DbS
bf10: 74 72 44 75 70 28 64 62 2c 20 7a 29 3b 0a 20 20  trDup(db, z);.  
bf20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
bf30: 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20  etColName(v, i, 
bf40: 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a 2c  COLNAME_NAME, z,
bf50: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29   SQLITE_DYNAMIC)
bf60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65  ;.    }.  }.  ge
bf70: 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65  nerateColumnType
bf80: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
bf90: 73 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a  st, pEList);.}..
bfa0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e  /*.** Given a an
bfb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
bfc0: 20 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c   (which is reall
bfd0: 79 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78  y the list of ex
bfe0: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61  pressions.** tha
bff0: 74 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c  t form the resul
c000: 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t set of a SELEC
c010: 54 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d  T statement) com
c020: 70 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65  pute appropriate
c030: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  .** column names
c040: 20 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61   for a table tha
c050: 74 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  t would hold the
c060: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
c070: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75  ..**.** All colu
c080: 6d 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65  mn names will be
c090: 20 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f   unique..**.** O
c0a0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
c0b0: 61 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65  ames are compute
c0c0: 64 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65  d.  Column.zType
c0d0: 2c 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a  , Column.zColl,.
c0e0: 2a 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65  ** and other fie
c0f0: 6c 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72  lds of Column ar
c100: 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20  e zeroed..**.** 
c110: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
c120: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
c130: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
c140: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
c150: 73 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c  s,.** store NULL
c160: 20 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30   in *paCol and 0
c170: 20 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72   in *pnCol and r
c180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
c190: 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EM..*/.static in
c1a0: 74 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46  t selectColumnsF
c1b0: 72 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50  romExprList(.  P
c1c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
c1d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
c1e0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
c1f0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
c200: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c         /* Expr l
c210: 69 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74  ist from which t
c220: 6f 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20  o derive column 
c230: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a  names */.  i16 *
c240: 70 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  pnCol,          
c250: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
c260: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
c270: 73 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75  s here */.  Colu
c280: 6d 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20  mn **paCol      
c290: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
c2a0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   new column list
c2b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71   here */.){.  sq
c2c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c2d0: 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74  se->db;   /* Dat
c2e0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
c2f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
c320: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b  rs */.  int cnt;
c330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c340: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64      /* Index add
c350: 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e  ed to make the n
c360: 61 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20  ame unique */.  
c370: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70  Column *aCol, *p
c380: 43 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Col;        /* F
c390: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
c3a0: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a  result columns *
c3b0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20  /.  int nCol;   
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
c3e0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
c3f0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72  lt set */.  Expr
c400: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
c410: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
c420: 73 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67  ssion for a sing
c430: 6c 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  le result column
c440: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d   */.  char *zNam
c450: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c460: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65    /* Column name
c470: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
c480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c490: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d    /* Size of nam
c4a0: 65 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a  e in zName[] */.
c4b0: 0a 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b  .  if( pEList ){
c4c0: 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69  .    nCol = pELi
c4d0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61  st->nExpr;.    a
c4e0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Col = sqlite3DbM
c4f0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
c500: 7a 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43  zeof(aCol[0])*nC
c510: 6f 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ol);.    testcas
c520: 65 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  e( aCol==0 );.  
c530: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
c540: 3d 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20  = 0;.    aCol = 
c550: 30 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20  0;.  }.  *pnCol 
c560: 3d 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c  = nCol;.  *paCol
c570: 20 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28   = aCol;..  for(
c580: 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20  i=0, pCol=aCol; 
c590: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  i<nCol; i++, pCo
c5a0: 6c 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74  l++){.    /* Get
c5b0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
c5c0: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  name for the col
c5d0: 75 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  umn.    */.    p
c5e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
c5f0: 69 70 43 6f 6c 6c 61 74 65 28 70 45 4c 69 73 74  ipCollate(pEList
c600: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
c610: 20 20 20 69 66 28 20 28 7a 4e 61 6d 65 20 3d 20     if( (zName = 
c620: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
c630: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
c640: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
c650: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 22 41 53   contains an "AS
c660: 20 3c 6e 61 6d 65 3e 22 20 70 68 72 61 73 65 2c   <name>" phrase,
c670: 20 75 73 65 20 3c 6e 61 6d 65 3e 20 61 73 20 74   use <name> as t
c680: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  he name */.     
c690: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
c6a0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61  DbStrDup(db, zNa
c6b0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
c6c0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f 6c        Expr *pCol
c6d0: 45 78 70 72 20 3d 20 70 3b 20 20 2f 2a 20 54 68  Expr = p;  /* Th
c6e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
c6f0: 74 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  t is the result 
c700: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20  column name */. 
c710: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
c720: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  ;         /* Tab
c730: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
c740: 74 68 20 74 68 69 73 20 65 78 70 72 65 73 73 69  th this expressi
c750: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  on */.      whil
c760: 65 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d  e( pColExpr->op=
c770: 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20 20  =TK_DOT ){.     
c780: 20 20 20 70 43 6f 6c 45 78 70 72 20 3d 20 70 43     pColExpr = pC
c790: 6f 6c 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  olExpr->pRight;.
c7a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
c7b0: 70 43 6f 6c 45 78 70 72 21 3d 30 20 29 3b 0a 20  pColExpr!=0 );. 
c7c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c7d0: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
c7e0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 41 4c 57 41  K_COLUMN && ALWA
c7f0: 59 53 28 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61  YS(pColExpr->pTa
c800: 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20  b!=0) ){.       
c810: 20 2f 2a 20 46 6f 72 20 63 6f 6c 75 6d 6e 73 20   /* For columns 
c820: 75 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  use the column n
c830: 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ame name */.    
c840: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
c850: 43 6f 6c 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ColExpr->iColumn
c860: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
c870: 20 70 43 6f 6c 45 78 70 72 2d 3e 70 54 61 62 3b   pColExpr->pTab;
c880: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
c890: 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20 70 54 61  l<0 ) iCol = pTa
c8a0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 20 20  b->iPKey;.      
c8b0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
c8c0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
c8d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
c8e0: 20 20 20 20 69 43 6f 6c 3e 3d 30 20 3f 20 70 54      iCol>=0 ? pT
c8f0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
c900: 4e 61 6d 65 20 3a 20 22 72 6f 77 69 64 22 29 3b  Name : "rowid");
c910: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
c920: 20 70 43 6f 6c 45 78 70 72 2d 3e 6f 70 3d 3d 54   pColExpr->op==T
c930: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
c940: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
c950: 50 72 6f 70 65 72 74 79 28 70 43 6f 6c 45 78 70  Property(pColExp
c960: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
c970: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  );.        zName
c980: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
c990: 66 28 64 62 2c 20 22 25 73 22 2c 20 70 43 6f 6c  f(db, "%s", pCol
c9a0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
c9b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c9c0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65        /* Use the
c9d0: 20 6f 72 69 67 69 6e 61 6c 20 74 65 78 74 20 6f   original text o
c9e0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 65 78 70  f the column exp
c9f0: 72 65 73 73 69 6f 6e 20 61 73 20 69 74 73 20 6e  ression as its n
ca00: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ame */.        z
ca10: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
ca20: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
ca30: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70  pEList->a[i].zSp
ca40: 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  an);.      }.   
ca50: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
ca60: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
ca70: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
ca80: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
ca90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
caa0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
cab0: 75 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ure the column n
cac0: 61 6d 65 20 69 73 20 75 6e 69 71 75 65 2e 20 20  ame is unique.  
cad0: 49 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 6e  If the name is n
cae0: 6f 74 20 75 6e 69 71 75 65 2c 0a 20 20 20 20 2a  ot unique,.    *
caf0: 2a 20 61 70 70 65 6e 64 20 61 20 69 6e 74 65 67  * append a integ
cb00: 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 73  er to the name s
cb10: 6f 20 74 68 61 74 20 69 74 20 62 65 63 6f 6d 65  o that it become
cb20: 73 20 75 6e 69 71 75 65 2e 0a 20 20 20 20 2a 2f  s unique..    */
cb30: 0a 20 20 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  .    nName = sql
cb40: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
cb50: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 63  me);.    for(j=c
cb60: 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  nt=0; j<i; j++){
cb70: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
cb80: 65 33 53 74 72 49 43 6d 70 28 61 43 6f 6c 5b 6a  e3StrICmp(aCol[j
cb90: 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
cba0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  =0 ){.        ch
cbb0: 61 72 20 2a 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20  ar *zNewName;.  
cbc0: 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
cbd0: 20 20 20 20 20 66 6f 72 28 6b 3d 6e 4e 61 6d 65       for(k=nName
cbe0: 2d 31 3b 20 6b 3e 31 20 26 26 20 73 71 6c 69 74  -1; k>1 && sqlit
cbf0: 65 33 49 73 64 69 67 69 74 28 7a 4e 61 6d 65 5b  e3Isdigit(zName[
cc00: 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20  k]); k--){}.    
cc10: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 6b 5d      if( zName[k]
cc20: 3d 3d 27 3a 27 20 29 20 6e 4e 61 6d 65 20 3d 20  ==':' ) nName = 
cc30: 6b 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  k;.        zName
cc40: 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20  [nName] = 0;.   
cc50: 20 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20       zNewName = 
cc60: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
cc70: 62 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d  b, "%s:%d", zNam
cc80: 65 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20  e, ++cnt);.     
cc90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
cca0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
ccb0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65       zName = zNe
ccc0: 77 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a  wName;.        j
ccd0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69   = -1;.        i
cce0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72  f( zName==0 ) br
ccf0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
cd00: 20 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61   }.    pCol->zNa
cd10: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  me = zName;.  }.
cd20: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
cd30: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f  Failed ){.    fo
cd40: 72 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29  r(j=0; j<i; j++)
cd50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
cd60: 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a  bFree(db, aCol[j
cd70: 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ].zName);.    }.
cd80: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
cd90: 65 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20  e(db, aCol);.   
cda0: 20 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *paCol = 0;.   
cdb0: 20 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20   *pnCol = 0;.   
cdc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
cdd0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  OMEM;.  }.  retu
cde0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
cdf0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20  ./*.** Add type 
ce00: 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e  and collation in
ce10: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63  formation to a c
ce20: 6f 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64  olumn list based
ce30: 20 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20   on.** a SELECT 
ce40: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a  statement..** .*
ce50: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73  * The column lis
ce60: 74 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d  t presumably cam
ce70: 65 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c  e from selectCol
ce80: 75 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72  umnNamesFromExpr
ce90: 4c 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63  List()..** The c
cea0: 6f 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f  olumn list has o
ceb0: 6e 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74  nly names, not t
cec0: 79 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f  ypes or collatio
ced0: 6e 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  ns.  This.** rou
cee0: 74 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67  tine goes throug
cef0: 68 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74  h and adds the t
cf00: 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
cf10: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
cf20: 72 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73  routine requires
cf30: 20 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69   that all identi
cf40: 66 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c  fiers in the SEL
cf50: 45 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  ECT.** statement
cf60: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f   be resolved..*/
cf70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c  .static void sel
cf80: 65 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  ectAddColumnType
cf90: 41 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  AndCollation(.  
cfa0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
cfb0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
cfc0: 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 54   contexts */.  T
cfd0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
cfe0: 20 20 20 20 20 2f 2a 20 41 64 64 20 63 6f 6c 75       /* Add colu
cff0: 6d 6e 20 74 79 70 65 20 69 6e 66 6f 72 6d 61 74  mn type informat
d000: 69 6f 6e 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ion to this tabl
d010: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
d020: 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
d030: 53 45 4c 45 43 54 20 75 73 65 64 20 74 6f 20 64  SELECT used to d
d040: 65 74 65 72 6d 69 6e 65 20 74 79 70 65 73 20 61  etermine types a
d050: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 2a 2f  nd collations */
d060: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
d070: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
d080: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
d090: 43 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  C;.  Column *pCo
d0a0: 6c 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  l;.  CollSeq *pC
d0b0: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  oll;.  int i;.  
d0c0: 45 78 70 72 20 2a 70 3b 0a 20 20 73 74 72 75 63  Expr *p;.  struc
d0d0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
d0e0: 2a 61 3b 0a 20 20 75 36 34 20 73 7a 41 6c 6c 20  *a;.  u64 szAll 
d0f0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
d100: 70 53 65 6c 65 63 74 21 3d 30 20 29 3b 0a 20 20  pSelect!=0 );.  
d110: 61 73 73 65 72 74 28 20 28 70 53 65 6c 65 63 74  assert( (pSelect
d120: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
d130: 52 65 73 6f 6c 76 65 64 29 21 3d 30 20 29 3b 0a  Resolved)!=0 );.
d140: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
d150: 6e 43 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70  nCol==pSelect->p
d160: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20  EList->nExpr || 
d170: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d180: 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   );.  if( db->ma
d190: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
d1a0: 75 72 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  urn;.  memset(&s
d1b0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
d1c0: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  C));.  sNC.pSrcL
d1d0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
d1e0: 53 72 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65  Src;.  a = pSele
d1f0: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  ct->pEList->a;. 
d200: 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 70   for(i=0, pCol=p
d210: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3c 70 54 61  Tab->aCol; i<pTa
d220: 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  b->nCol; i++, pC
d230: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 61  ol++){.    p = a
d240: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
d250: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
d260: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
d270: 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43   columnType(&sNC
d280: 2c 20 70 2c 30 2c 30 2c 30 2c 20 26 70 43 6f 6c  , p,0,0,0, &pCol
d290: 2d 3e 73 7a 45 73 74 29 29 3b 0a 20 20 20 20 73  ->szEst));.    s
d2a0: 7a 41 6c 6c 20 2b 3d 20 70 43 6f 6c 2d 3e 73 7a  zAll += pCol->sz
d2b0: 45 73 74 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61  Est;.    pCol->a
d2c0: 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65  ffinity = sqlite
d2d0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 29  3ExprAffinity(p)
d2e0: 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e  ;.    if( pCol->
d2f0: 61 66 66 69 6e 69 74 79 3d 3d 30 20 29 20 70 43  affinity==0 ) pC
d300: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
d310: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
d320: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
d330: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
d340: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 69  Parse, p);.    i
d350: 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
d360: 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20    pCol->zColl = 
d370: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
d380: 64 62 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  db, pColl->zName
d390: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
d3a0: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  Tab->szTabRow = 
d3b0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 73 7a  sqlite3LogEst(sz
d3c0: 41 6c 6c 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  All*4);.}../*.**
d3d0: 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43 54 20   Given a SELECT 
d3e0: 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e 65 72  statement, gener
d3f0: 61 74 65 20 61 20 54 61 62 6c 65 20 73 74 72 75  ate a Table stru
d400: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
d410: 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65 73 75  ibes.** the resu
d420: 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74 20 53  lt set of that S
d430: 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ELECT..*/.Table 
d440: 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65  *sqlite3ResultSe
d450: 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73 65 20  tOfSelect(Parse 
d460: 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20  *pParse, Select 
d470: 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54 61 62  *pSelect){.  Tab
d480: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71 6c 69  le *pTab;.  sqli
d490: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d4a0: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61 76 65  ->db;.  int save
d4b0: 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76 65 64  dFlags;..  saved
d4c0: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  Flags = db->flag
d4d0: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  s;.  db->flags &
d4e0: 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f  = ~SQLITE_FullCo
d4f0: 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e 66 6c  lNames;.  db->fl
d500: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
d510: 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 73  ortColNames;.  s
d520: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
d530: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
d540: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50 61 72  , 0);.  if( pPar
d550: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
d560: 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  n 0;.  while( pS
d570: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 20  elect->pPrior ) 
d580: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
d590: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 62 2d  t->pPrior;.  db-
d5a0: 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 46 6c  >flags = savedFl
d5b0: 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ags;.  pTab = sq
d5c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
d5d0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
d5e0: 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70 54 61  le) );.  if( pTa
d5f0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  b==0 ){.    retu
d600: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  rn 0;.  }.  /* T
d610: 68 65 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  he sqlite3Result
d620: 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 69 73  SetOfSelect() is
d630: 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63 6f 6e   only used n con
d640: 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f 6f 6b  texts where look
d650: 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20 64 69  aside.  ** is di
d660: 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73 73 65  sabled */.  asse
d670: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
d680: 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20 29 3b  e.bEnabled==0 );
d690: 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20 3d 20  .  pTab->nRef = 
d6a0: 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  1;.  pTab->zName
d6b0: 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e 6e 52   = 0;.  pTab->nR
d6c0: 6f 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b  owEst = 1048576;
d6d0: 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73  .  selectColumns
d6e0: 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
d6f0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45  rse, pSelect->pE
d700: 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e 43 6f  List, &pTab->nCo
d710: 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c 29 3b  l, &pTab->aCol);
d720: 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75  .  selectAddColu
d730: 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
d740: 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  on(pParse, pTab,
d750: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 54 61   pSelect);.  pTa
d760: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
d770: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
d780: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
d790: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
d7a0: 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 72  db, pTab);.    r
d7b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
d7c0: 65 74 75 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f  eturn pTab;.}../
d7d0: 2a 0a 2a 2a 20 47 65 74 20 61 20 56 44 42 45 20  *.** Get a VDBE 
d7e0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
d7f0: 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 20 43  rser context.  C
d800: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
d810: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
d820: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d830: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
d840: 20 61 6e 64 20 6c 65 61 76 65 20 61 20 6d 65 73   and leave a mes
d850: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2e 0a  sage in pParse..
d860: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33  */.Vdbe *sqlite3
d870: 47 65 74 56 64 62 65 28 50 61 72 73 65 20 2a 70  GetVdbe(Parse *p
d880: 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
d890: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d8a0: 65 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 7b  e;.  if( v==0 ){
d8b0: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d  .    v = pParse-
d8c0: 3e 70 56 64 62 65 20 3d 20 73 71 6c 69 74 65 33  >pVdbe = sqlite3
d8d0: 56 64 62 65 43 72 65 61 74 65 28 70 50 61 72 73  VdbeCreate(pPars
d8e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20  e);.    if( v ) 
d8f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d900: 30 28 76 2c 20 4f 50 5f 49 6e 69 74 29 3b 0a 20  0(v, OP_Init);. 
d910: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70     if( pParse->p
d920: 54 6f 70 6c 65 76 65 6c 3d 3d 30 0a 20 20 20 20  Toplevel==0.    
d930: 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e   && Optimization
d940: 45 6e 61 62 6c 65 64 28 70 50 61 72 73 65 2d 3e  Enabled(pParse->
d950: 64 62 2c 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  db,SQLITE_Factor
d960: 4f 75 74 43 6f 6e 73 74 29 0a 20 20 20 20 29 7b  OutConst).    ){
d970: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f  .      pParse->o
d980: 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 31  kConstFactor = 1
d990: 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 72  ;.    }..  }.  r
d9a0: 65 74 75 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn v;.}.../*.
d9b0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 69  ** Compute the i
d9c0: 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65  Limit and iOffse
d9d0: 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  t fields of the 
d9e0: 53 45 4c 45 43 54 20 62 61 73 65 64 20 6f 6e 20  SELECT based on 
d9f0: 74 68 65 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e  the.** pLimit an
da00: 64 20 70 4f 66 66 73 65 74 20 65 78 70 72 65 73  d pOffset expres
da10: 73 69 6f 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61  sions.  pLimit a
da20: 6e 64 20 70 4f 66 66 73 65 74 20 68 6f 6c 64 20  nd pOffset hold 
da30: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a  the expressions.
da40: 2a 2a 20 74 68 61 74 20 61 70 70 65 61 72 20 69  ** that appear i
da50: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
da60: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 66 74  QL statement aft
da70: 65 72 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  er the LIMIT and
da80: 20 4f 46 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f   OFFSET.** keywo
da90: 72 64 73 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66  rds.  Or NULL if
daa0: 20 74 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   those keywords 
dab0: 61 72 65 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69  are omitted. iLi
dac0: 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20  mit and iOffset 
dad0: 0a 2a 2a 20 61 72 65 20 74 68 65 20 69 6e 74 65  .** are the inte
dae0: 67 65 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73  ger memory regis
daf0: 74 65 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  ter numbers for 
db00: 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20 74 6f  counters used to
db10: 20 63 6f 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65   compute .** the
db20: 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73 65   limit and offse
db30: 74 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  t.  If there is 
db40: 6e 6f 20 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20  no limit and/or 
db50: 6f 66 66 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a  offset, then .**
db60: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
db70: 73 65 74 20 61 72 65 20 6e 65 67 61 74 69 76 65  set are negative
db80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
db90: 74 69 6e 65 20 63 68 61 6e 67 65 73 20 74 68 65  tine changes the
dba0: 20 76 61 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69   values of iLimi
dbb0: 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e  t and iOffset on
dbc0: 6c 79 20 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74  ly if.** a limit
dbd0: 20 6f 72 20 6f 66 66 73 65 74 20 69 73 20 64 65   or offset is de
dbe0: 66 69 6e 65 64 20 62 79 20 70 4c 69 6d 69 74 20  fined by pLimit 
dbf0: 61 6e 64 20 70 4f 66 66 73 65 74 2e 20 20 69 4c  and pOffset.  iL
dc00: 69 6d 69 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66  imit and.** iOff
dc10: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
dc20: 62 65 65 6e 20 70 72 65 73 65 74 20 74 6f 20 61  been preset to a
dc30: 70 70 72 6f 70 72 69 61 74 65 20 64 65 66 61 75  ppropriate defau
dc40: 6c 74 20 76 61 6c 75 65 73 20 28 7a 65 72 6f 29  lt values (zero)
dc50: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
dc60: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
dc70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 4f 66  e..**.** The iOf
dc80: 66 73 65 74 20 72 65 67 69 73 74 65 72 20 28 69  fset register (i
dc90: 66 20 69 74 20 65 78 69 73 74 73 29 20 69 73 20  f it exists) is 
dca0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 74  initialized to t
dcb0: 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74  he value.** of t
dcc0: 68 65 20 4f 46 46 53 45 54 2e 20 20 54 68 65 20  he OFFSET.  The 
dcd0: 69 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20  iLimit register 
dce0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
dcf0: 6f 20 4c 49 4d 49 54 2e 20 20 52 65 67 69 73 74  o LIMIT.  Regist
dd00: 65 72 0a 2a 2a 20 69 4f 66 66 73 65 74 2b 31 20  er.** iOffset+1 
dd10: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
dd20: 6f 20 4c 49 4d 49 54 2b 4f 46 46 53 45 54 2e 0a  o LIMIT+OFFSET..
dd30: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20 70 4c  **.** Only if pL
dd40: 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66 66 73  imit!=0 or pOffs
dd50: 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c 69 6d  et!=0 do the lim
dd60: 69 74 20 72 65 67 69 73 74 65 72 73 20 67 65 74  it registers get
dd70: 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e 20 20  .** redefined.  
dd80: 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70  The UNION ALL op
dd90: 65 72 61 74 6f 72 20 75 73 65 73 20 74 68 69 73  erator uses this
dda0: 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66 6f 72   property to for
ddb0: 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73 65 20  ce.** the reuse 
ddc0: 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69 6d 69  of the same limi
ddd0: 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72 65 67  t and offset reg
dde0: 69 73 74 65 72 73 20 61 63 72 6f 73 73 20 6d 75  isters across mu
ddf0: 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45 43 54  ltiple.** SELECT
de00: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a   statements..*/.
de10: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6d 70  static void comp
de20: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
de30: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
de40: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
de50: 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62 65 20  iBreak){.  Vdbe 
de60: 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c  *v = 0;.  int iL
de70: 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  imit = 0;.  int 
de80: 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 61  iOffset;.  int a
de90: 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28 20 70  ddr1, n;.  if( p
dea0: 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74 75 72  ->iLimit ) retur
deb0: 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 22  n;..  /* .  ** "
dec0: 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61 79 73  LIMIT -1" always
ded0: 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77 73 2e   shows all rows.
dee0: 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d 65 0a    There is some.
def0: 20 20 2a 2a 20 63 6f 6e 74 72 6f 76 65 72 73 79    ** controversy
df00: 20 61 62 6f 75 74 20 77 68 61 74 20 74 68 65 20   about what the 
df10: 63 6f 72 72 65 63 74 20 62 65 68 61 76 69 6f 72  correct behavior
df20: 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20 2a 2a   should be..  **
df30: 20 54 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70   The current imp
df40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 74 65  lementation inte
df50: 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20 30 22  rprets "LIMIT 0"
df60: 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20 6e 6f   to mean.  ** no
df70: 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20 73 71   rows..  */.  sq
df80: 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
df90: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 61  ear(pParse);.  a
dfa0: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
dfb0: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69 6d 69  t==0 || p->pLimi
dfc0: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  t!=0 );.  if( p-
dfd0: 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 70  >pLimit ){.    p
dfe0: 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69  ->iLimit = iLimi
dff0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
e000: 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  em;.    v = sqli
e010: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
e020: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
e030: 76 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  v!=0 );.    if( 
e040: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
e050: 65 67 65 72 28 70 2d 3e 70 4c 69 6d 69 74 2c 20  eger(p->pLimit, 
e060: 26 6e 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  &n) ){.      sql
e070: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e080: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6e 2c  , OP_Integer, n,
e090: 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20   iLimit);.      
e0a0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
e0b0: 22 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29  "LIMIT counter")
e0c0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  );.      if( n==
e0d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
e0e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
e0f0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 42  , OP_Goto, 0, iB
e100: 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c  reak);.      }el
e110: 73 65 20 69 66 28 20 6e 3e 3d 30 20 26 26 20 70  se if( n>=0 && p
e120: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28 75 36  ->nSelectRow>(u6
e130: 34 29 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  4)n ){.        p
e140: 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 6e  ->nSelectRow = n
e150: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e160: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
e170: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e180: 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
e190: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
e1a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e1b0: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
e1c0: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
e1d0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e1e0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
e1f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e200: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
e210: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  IfZero, iLimit, 
e220: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20  iBreak);.    }. 
e230: 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65     if( p->pOffse
e240: 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  t ){.      p->iO
e250: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
e260: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
e270: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
e280: 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
e290: 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
e2a0: 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
e2b0: 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
e2c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e2d0: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66  e(pParse, p->pOf
e2e0: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fset, iOffset);.
e2f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e300: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
e310: 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74  stBeInt, iOffset
e320: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
e330: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
e340: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
e350: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
e360: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e370: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
e380: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
e390: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
e3a0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f  P_Integer, 0, iO
e3b0: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
e3c0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
e3d0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
e3e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e3f0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
e400: 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c  iLimit, iOffset,
e410: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
e420: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
e430: 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
e440: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
e450: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
e460: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
e470: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
e480: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
e490: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
e4a0: 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29  , -1, iOffset+1)
e4b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e4c0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
e4d0: 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ddr1);.    }.  }
e4e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
e4f0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
e500: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
e510: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
e520: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
e530: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
e540: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
e550: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
e560: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
e570: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
e580: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
e590: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
e5a0: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
e5b0: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
e5c0: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
e5d0: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
e5e0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
e5f0: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
e600: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
e610: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
e620: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
e630: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
e640: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
e650: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
e660: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
e670: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
e680: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
e690: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
e6a0: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
e6b0: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
e6c0: 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
e6d0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
e6e0: 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
e6f0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
e700: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
e710: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
e720: 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ol>=0 );.  if( p
e730: 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Ret==0 && iCol<p
e740: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
e750: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
e760: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
e770: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
e780: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
e790: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
e7a0: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
e7b0: 54 68 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  The select state
e7c0: 6d 65 6e 74 20 70 61 73 73 65 64 20 61 73 20 74  ment passed as t
e7d0: 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
e7e0: 74 65 72 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ter is a compoun
e7f0: 64 20 53 45 4c 45 43 54 0a 2a 2a 20 77 69 74 68  d SELECT.** with
e800: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
e810: 75 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  use. This functi
e820: 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 64  on allocates and
e830: 20 72 65 74 75 72 6e 73 20 61 20 4b 65 79 49 6e   returns a KeyIn
e840: 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  fo.** structure 
e850: 73 75 69 74 61 62 6c 65 20 66 6f 72 20 69 6d 70  suitable for imp
e860: 6c 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 4f 52  lementing the OR
e870: 44 45 52 20 42 59 2e 0a 2a 2a 0a 2a 2a 20 53 70  DER BY..**.** Sp
e880: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
e890: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
e8a0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
e8b0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 63  om malloc. The c
e8c0: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
e8d0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
e8e0: 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
e8f0: 68 61 74 20 74 68 69 73 20 73 74 72 75 63 74 75  hat this structu
e900: 72 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79  re is eventually
e910: 0a 2a 2a 20 66 72 65 65 64 2e 0a 2a 2f 0a 73 74  .** freed..*/.st
e920: 61 74 69 63 20 4b 65 79 49 6e 66 6f 20 2a 6d 75  atic KeyInfo *mu
e930: 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
e940: 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  KeyInfo(Parse *p
e950: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
e960: 2c 20 69 6e 74 20 6e 45 78 74 72 61 29 7b 0a 20  , int nExtra){. 
e970: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
e980: 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
e990: 79 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42  y;.  int nOrderB
e9a0: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d  y = p->pOrderBy-
e9b0: 3e 6e 45 78 70 72 3b 0a 20 20 73 71 6c 69 74 65  >nExpr;.  sqlite
e9c0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e9d0: 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  db;.  KeyInfo *p
e9e0: 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Ret = sqlite3Key
e9f0: 49 6e 66 6f 41 6c 6c 6f 63 28 64 62 2c 20 6e 4f  InfoAlloc(db, nO
ea00: 72 64 65 72 42 79 2b 6e 45 78 74 72 61 2c 20 31  rderBy+nExtra, 1
ea10: 29 3b 0a 20 20 69 66 28 20 70 52 65 74 20 29 7b  );.  if( pRet ){
ea20: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
ea30: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
ea40: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rBy; i++){.     
ea50: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
ea60: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
ea70: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 3b 0a  pOrderBy->a[i];.
ea80: 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
ea90: 6d 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  m = pItem->pExpr
eaa0: 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  ;.      CollSeq 
eab0: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 69  *pColl;..      i
eac0: 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
ead0: 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a  & EP_Collate ){.
eae0: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
eaf0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
eb00: 65 71 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  eq(pParse, pTerm
eb10: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
eb20: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
eb30: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
eb40: 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49  eq(pParse, p, pI
eb50: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
eb60: 79 43 6f 6c 2d 31 29 3b 0a 20 20 20 20 20 20 20  yCol-1);.       
eb70: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
eb80: 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
eb90: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  tColl;.        p
eba0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
ebb0: 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
ebc0: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
ebd0: 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
ebe0: 73 65 2c 20 70 54 65 72 6d 2c 20 70 43 6f 6c 6c  se, pTerm, pColl
ebf0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
ec00: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
ec10: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
ec20: 57 72 69 74 65 61 62 6c 65 28 70 52 65 74 29 20  Writeable(pRet) 
ec30: 29 3b 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61  );.      pRet->a
ec40: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
ec50: 0a 20 20 20 20 20 20 70 52 65 74 2d 3e 61 53 6f  .      pRet->aSo
ec60: 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 4f 72  rtOrder[i] = pOr
ec70: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
ec80: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
ec90: 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ..  return pRet;
eca0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
ecb0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a  TE_OMIT_CTE./*.*
ecc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
ecd0: 65 6e 65 72 61 74 65 73 20 56 44 42 45 20 63 6f  enerates VDBE co
ece0: 64 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  de to compute th
ecf0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57  e content of a W
ed00: 49 54 48 20 52 45 43 55 52 53 49 56 45 0a 2a 2a  ITH RECURSIVE.**
ed10: 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 66 6f   query of the fo
ed20: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 3c 72 65 63  rm:.**.**   <rec
ed30: 75 72 73 69 76 65 2d 74 61 62 6c 65 3e 20 41 53  ursive-table> AS
ed40: 20 28 3c 73 65 74 75 70 2d 71 75 65 72 79 3e 20   (<setup-query> 
ed50: 55 4e 49 4f 4e 20 5b 41 4c 4c 5d 20 3c 72 65 63  UNION [ALL] <rec
ed60: 75 72 73 69 76 65 2d 71 75 65 72 79 3e 29 0a 2a  ursive-query>).*
ed70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
ed80: 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f            \_____
ed90: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 20 20 20 20  ______/         
eda0: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
edb0: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 20 20 20     p->pPrior    
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 70 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65    p.**.**.** The
ee00: 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e  re is exactly on
ee10: 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
ee20: 68 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62  he recursive-tab
ee30: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
ee40: 6c 61 75 73 65 0a 2a 2a 20 6f 66 20 72 65 63 75  lause.** of recu
ee50: 72 73 69 76 65 2d 71 75 65 72 79 2c 20 6d 61 72  rsive-query, mar
ee60: 6b 65 64 20 77 69 74 68 20 74 68 65 20 53 72 63  ked with the Src
ee70: 4c 69 73 74 2d 3e 61 5b 5d 2e 69 73 52 65 63 75  List->a[].isRecu
ee80: 72 73 69 76 65 20 66 6c 61 67 2e 0a 2a 2a 0a 2a  rsive flag..**.*
ee90: 2a 20 54 68 65 20 73 65 74 75 70 2d 71 75 65 72  * The setup-quer
eea0: 79 20 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 67  y runs once to g
eeb0: 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 69 74 69  enerate an initi
eec0: 61 6c 20 73 65 74 20 6f 66 20 72 6f 77 73 20 74  al set of rows t
eed0: 68 61 74 20 67 6f 0a 2a 2a 20 69 6e 74 6f 20 61  hat go.** into a
eee0: 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 52   Queue table.  R
eef0: 6f 77 73 20 61 72 65 20 65 78 74 72 61 63 74 65  ows are extracte
ef00: 64 20 66 72 6f 6d 20 74 68 65 20 51 75 65 75 65  d from the Queue
ef10: 20 74 61 62 6c 65 20 6f 6e 65 20 62 79 0a 2a 2a   table one by.**
ef20: 20 6f 6e 65 2e 20 20 45 61 63 68 20 72 6f 77 20   one.  Each row 
ef30: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51  extracted from Q
ef40: 75 65 75 65 20 69 73 20 6f 75 74 70 75 74 20 74  ueue is output t
ef50: 6f 20 70 44 65 73 74 2e 20 20 54 68 65 6e 20 74  o pDest.  Then t
ef60: 68 65 20 73 69 6e 67 6c 65 0a 2a 2a 20 65 78 74  he single.** ext
ef70: 72 61 63 74 65 64 20 72 6f 77 20 28 6e 6f 77 20  racted row (now 
ef80: 69 6e 20 74 68 65 20 69 43 75 72 72 65 6e 74 20  in the iCurrent 
ef90: 74 61 62 6c 65 29 20 62 65 63 6f 6d 65 73 20 74  table) becomes t
efa0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
efb0: 65 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 2d 74  e.** recursive-t
efc0: 61 62 6c 65 20 66 6f 72 20 61 20 72 65 63 75 72  able for a recur
efd0: 73 69 76 65 2d 71 75 65 72 79 20 72 75 6e 2e 20  sive-query run. 
efe0: 20 54 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74   The output of t
eff0: 68 65 20 72 65 63 75 72 73 69 76 65 2d 71 75 65  he recursive-que
f000: 72 79 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 62  ry.** is added b
f010: 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 51 75 65  ack into the Que
f020: 75 65 20 74 61 62 6c 65 2e 20 20 54 68 65 6e 20  ue table.  Then 
f030: 61 6e 6f 74 68 65 72 20 72 6f 77 20 69 73 20 65  another row is e
f040: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 51 75  xtracted from Qu
f050: 65 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69  eue.** and the i
f060: 74 65 72 61 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  teration continu
f070: 65 73 20 75 6e 74 69 6c 20 74 68 65 20 51 75 65  es until the Que
f080: 75 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  ue table is empt
f090: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  y..**.** If the 
f0a0: 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 6f  compound query o
f0b0: 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e  perator is UNION
f0c0: 20 74 68 65 6e 20 6e 6f 20 64 75 70 6c 69 63 61   then no duplica
f0d0: 74 65 20 72 6f 77 73 20 61 72 65 20 65 76 65 72  te rows are ever
f0e0: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
f0f0: 6f 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  o the Queue tabl
f100: 65 2e 20 20 54 68 65 20 69 44 69 73 74 69 6e 63  e.  The iDistinc
f110: 74 20 74 61 62 6c 65 20 6b 65 65 70 73 20 61 20  t table keeps a 
f120: 63 6f 70 79 20 6f 66 20 61 6c 6c 20 72 6f 77 73  copy of all rows
f130: 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 65 76  .** that have ev
f140: 65 72 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64  er been inserted
f150: 20 69 6e 74 6f 20 51 75 65 75 65 20 61 6e 64 20   into Queue and 
f160: 63 61 75 73 65 73 20 64 75 70 6c 69 63 61 74 65  causes duplicate
f170: 73 20 74 6f 20 62 65 0a 2a 2a 20 64 69 73 63 61  s to be.** disca
f180: 72 64 65 64 2e 20 20 49 66 20 74 68 65 20 6f 70  rded.  If the op
f190: 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 20  erator is UNION 
f1a0: 41 4c 4c 2c 20 74 68 65 6e 20 64 75 70 6c 69 63  ALL, then duplic
f1b0: 61 74 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ates are allowed
f1c0: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
f1d0: 71 75 65 72 79 20 68 61 73 20 61 6e 20 4f 52 44  query has an ORD
f1e0: 45 52 20 42 59 2c 20 74 68 65 6e 20 65 6e 74 72  ER BY, then entr
f1f0: 69 65 73 20 69 6e 20 74 68 65 20 51 75 65 75 65  ies in the Queue
f200: 20 74 61 62 6c 65 20 61 72 65 20 6b 65 70 74 20   table are kept 
f210: 69 6e 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f  in.** ORDER BY o
f220: 72 64 65 72 20 61 6e 64 20 74 68 65 20 66 69 72  rder and the fir
f230: 73 74 20 65 6e 74 72 79 20 69 73 20 65 78 74 72  st entry is extr
f240: 61 63 74 65 64 20 66 6f 72 20 65 61 63 68 20 63  acted for each c
f250: 79 63 6c 65 2e 20 20 57 69 74 68 6f 75 74 0a 2a  ycle.  Without.*
f260: 2a 20 61 6e 20 4f 52 44 45 52 20 42 59 2c 20 74  * an ORDER BY, t
f270: 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 69  he Queue table i
f280: 73 20 6a 75 73 74 20 61 20 46 49 46 4f 2e 0a 2a  s just a FIFO..*
f290: 2a 0a 2a 2a 20 49 66 20 61 20 4c 49 4d 49 54 20  *.** If a LIMIT 
f2a0: 63 6c 61 75 73 65 20 69 73 20 70 72 6f 76 69 64  clause is provid
f2b0: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ed, then the ite
f2c0: 72 61 74 69 6f 6e 20 73 74 6f 70 73 20 61 66 74  ration stops aft
f2d0: 65 72 20 4c 49 4d 49 54 20 72 6f 77 73 0a 2a 2a  er LIMIT rows.**
f2e0: 20 68 61 76 65 20 62 65 65 6e 20 6f 75 74 70 75   have been outpu
f2f0: 74 20 74 6f 20 70 44 65 73 74 2e 20 20 41 20 4c  t to pDest.  A L
f300: 49 4d 49 54 20 6f 66 20 7a 65 72 6f 20 6d 65 61  IMIT of zero mea
f310: 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 6e 6f 20  ns to output no 
f320: 72 6f 77 73 20 61 6e 64 20 61 0a 2a 2a 20 6e 65  rows and a.** ne
f330: 67 61 74 69 76 65 20 4c 49 4d 49 54 20 6d 65 61  gative LIMIT mea
f340: 6e 73 20 74 6f 20 6f 75 74 70 75 74 20 61 6c 6c  ns to output all
f350: 20 72 6f 77 73 2e 20 20 49 66 20 74 68 65 72 65   rows.  If there
f360: 20 69 73 20 61 6c 73 6f 20 61 6e 20 4f 46 46 53   is also an OFFS
f370: 45 54 20 63 6c 61 75 73 65 0a 2a 2a 20 77 69 74  ET clause.** wit
f380: 68 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  h a positive val
f390: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ue, then the fir
f3a0: 73 74 20 4f 46 46 53 45 54 20 6f 75 74 70 75 74  st OFFSET output
f3b0: 73 20 61 72 65 20 64 69 73 63 61 72 64 65 64 20  s are discarded 
f3c0: 72 61 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 62  rather.** than b
f3d0: 65 69 6e 67 20 73 65 6e 74 20 74 6f 20 70 44 65  eing sent to pDe
f3e0: 73 74 2e 20 20 54 68 65 20 4c 49 4d 49 54 20 63  st.  The LIMIT c
f3f0: 6f 75 6e 74 20 64 6f 65 73 20 6e 6f 74 20 62 65  ount does not be
f400: 67 69 6e 20 75 6e 74 69 6c 20 61 66 74 65 72 20  gin until after 
f410: 4f 46 46 53 45 54 0a 2a 2a 20 72 6f 77 73 20 68  OFFSET.** rows h
f420: 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
f430: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f440: 20 67 65 6e 65 72 61 74 65 57 69 74 68 52 65 63   generateWithRec
f450: 75 72 73 69 76 65 51 75 65 72 79 28 0a 20 20 50  ursiveQuery(.  P
f460: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f470: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
f480: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c  context */.  Sel
f490: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ect *p,         
f4a0: 20 20 20 2f 2a 20 54 68 65 20 72 65 63 75 72 73     /* The recurs
f4b0: 69 76 65 20 53 45 4c 45 43 54 20 74 6f 20 62 65  ive SELECT to be
f4c0: 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65   coded */.  Sele
f4d0: 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20 20  ctDest *pDest   
f4e0: 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
f4f0: 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75 6c  with query resul
f500: 74 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  ts */.){.  SrcLi
f510: 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70 53  st *pSrc = p->pS
f520: 72 63 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  rc;      /* The 
f530: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74  FROM clause of t
f540: 68 65 20 72 65 63 75 72 73 69 76 65 20 71 75 65  he recursive que
f550: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ry */.  int nCol
f560: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45   = p->pEList->nE
f570: 78 70 72 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  xpr;  /* Number 
f580: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
f590: 65 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c  e recursive tabl
f5a0: 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  e */.  Vdbe *v =
f5b0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
f5c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70       /* The prep
f5d0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 75  ared statement u
f5e0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
f5f0: 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
f600: 53 65 74 75 70 20 3d 20 70 2d 3e 70 50 72 69 6f  Setup = p->pPrio
f610: 72 3b 20 20 20 2f 2a 20 54 68 65 20 73 65 74 75  r;   /* The setu
f620: 70 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74  p query */.  int
f630: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
f640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
f650: 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f  p of the loop */
f660: 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 2c  .  int addrCont,
f670: 20 61 64 64 72 42 72 65 61 6b 3b 20 20 20 20 20   addrBreak;     
f680: 20 2f 2a 20 43 4f 4e 54 49 4e 55 45 20 61 6e 64   /* CONTINUE and
f690: 20 42 52 45 41 4b 20 61 64 64 72 65 73 73 65 73   BREAK addresses
f6a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 72 65   */.  int iCurre
f6b0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
f6c0: 20 20 20 20 2f 2a 20 54 68 65 20 43 75 72 72 65      /* The Curre
f6d0: 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
f6e0: 74 20 72 65 67 43 75 72 72 65 6e 74 3b 20 20 20  t regCurrent;   
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f700: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
f710: 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
f720: 0a 20 20 69 6e 74 20 69 51 75 65 75 65 3b 20 20  .  int iQueue;  
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 2f 2a 20 54 68 65 20 51 75 65 75 65 20 74 61   /* The Queue ta
f750: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69  ble */.  int iDi
f760: 73 74 69 6e 63 74 20 3d 20 30 3b 20 20 20 20 20  stinct = 0;     
f770: 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73         /* To ens
f780: 75 72 65 20 75 6e 69 71 75 65 20 72 65 73 75 6c  ure unique resul
f790: 74 73 20 69 66 20 55 4e 49 4f 4e 20 2a 2f 0a 20  ts if UNION */. 
f7a0: 20 69 6e 74 20 65 44 65 73 74 20 3d 20 53 52 54   int eDest = SRT
f7b0: 5f 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f  _Table;        /
f7c0: 2a 20 48 6f 77 20 74 6f 20 77 72 69 74 65 20 74  * How to write t
f7d0: 6f 20 51 75 65 75 65 20 2a 2f 0a 20 20 53 65 6c  o Queue */.  Sel
f7e0: 65 63 74 44 65 73 74 20 64 65 73 74 51 75 65 75  ectDest destQueu
f7f0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
f800: 6c 65 63 74 44 65 73 74 20 74 61 72 67 65 74 74  lectDest targett
f810: 69 6e 67 20 74 68 65 20 51 75 65 75 65 20 74 61  ing the Queue ta
f820: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
f850: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
f860: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
f870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
f880: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 45 78  ult code */.  Ex
f890: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
f8a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
f8b0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
f8c0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c  se */.  Expr *pL
f8d0: 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
f8e0: 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 4c        /* Saved L
f8f0: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
f900: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
f910: 74 2c 20 72 65 67 4f 66 66 73 65 74 3b 20 20 20  t, regOffset;   
f920: 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20     /* Registers 
f930: 75 73 65 64 20 62 79 20 4c 49 4d 49 54 20 61 6e  used by LIMIT an
f940: 64 20 4f 46 46 53 45 54 20 2a 2f 0a 0a 20 20 2f  d OFFSET */..  /
f950: 2a 20 4f 62 74 61 69 6e 20 61 75 74 68 6f 72 69  * Obtain authori
f960: 7a 61 74 69 6f 6e 20 74 6f 20 64 6f 20 61 20 72  zation to do a r
f970: 65 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a  ecursive query *
f980: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
f990: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
f9a0: 20 53 51 4c 49 54 45 5f 52 45 43 55 52 53 49 56   SQLITE_RECURSIV
f9b0: 45 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72 65  E, 0, 0, 0) ) re
f9c0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 50 72 6f 63  turn;..  /* Proc
f9d0: 65 73 73 20 74 68 65 20 4c 49 4d 49 54 20 61 6e  ess the LIMIT an
f9e0: 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
f9f0: 2c 20 69 66 20 74 68 65 79 20 65 78 69 73 74 20  , if they exist 
fa00: 2a 2f 0a 20 20 61 64 64 72 42 72 65 61 6b 20 3d  */.  addrBreak =
fa10: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
fa20: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f 6d 70  Label(v);.  comp
fa30: 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
fa40: 73 28 70 50 61 72 73 65 2c 20 70 2c 20 61 64 64  s(pParse, p, add
fa50: 72 42 72 65 61 6b 29 3b 0a 20 20 70 4c 69 6d 69  rBreak);.  pLimi
fa60: 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20  t = p->pLimit;. 
fa70: 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
fa80: 66 66 73 65 74 3b 0a 20 20 72 65 67 4c 69 6d 69  ffset;.  regLimi
fa90: 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20  t = p->iLimit;. 
faa0: 20 72 65 67 4f 66 66 73 65 74 20 3d 20 70 2d 3e   regOffset = p->
fab0: 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 70 4c  iOffset;.  p->pL
fac0: 69 6d 69 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65  imit = p->pOffse
fad0: 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 4c 69 6d  t = 0;.  p->iLim
fae0: 69 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 20  it = p->iOffset 
faf0: 3d 20 30 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  = 0;.  pOrderBy 
fb00: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
fb10: 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
fb20: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66  cursor number of
fb30: 20 74 68 65 20 43 75 72 72 65 6e 74 20 74 61 62   the Current tab
fb40: 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  le */.  for(i=0;
fb50: 20 41 4c 57 41 59 53 28 69 3c 70 53 72 63 2d 3e   ALWAYS(i<pSrc->
fb60: 6e 53 72 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  nSrc); i++){.   
fb70: 20 69 66 28 20 70 53 72 63 2d 3e 61 5b 69 5d 2e   if( pSrc->a[i].
fb80: 69 73 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20  isRecursive ){. 
fb90: 20 20 20 20 20 69 43 75 72 72 65 6e 74 20 3d 20       iCurrent = 
fba0: 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  pSrc->a[i].iCurs
fbb0: 6f 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  or;.      break;
fbc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
fbd0: 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
fbe0: 73 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 51 75  s numbers for Qu
fbf0: 65 75 65 20 61 6e 64 20 44 69 73 74 69 6e 63 74  eue and Distinct
fc00: 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
fc10: 6d 62 65 72 20 66 6f 72 0a 20 20 2a 2a 20 74 68  mber for.  ** th
fc20: 65 20 44 69 73 74 69 6e 63 74 20 74 61 62 6c 65  e Distinct table
fc30: 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
fc40: 20 6f 6e 65 20 67 72 65 61 74 65 72 20 74 68 61   one greater tha
fc50: 6e 20 51 75 65 75 65 20 69 6e 20 6f 72 64 65 72  n Queue in order
fc60: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 53 52  .  ** for the SR
fc70: 54 5f 44 69 73 74 54 61 62 6c 65 20 61 6e 64 20  T_DistTable and 
fc80: 53 52 54 5f 44 69 73 74 51 75 65 75 65 20 64 65  SRT_DistQueue de
fc90: 73 74 69 6e 61 74 69 6f 6e 73 20 74 6f 20 77 6f  stinations to wo
fca0: 72 6b 2e 20 2a 2f 0a 20 20 69 51 75 65 75 65 20  rk. */.  iQueue 
fcb0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
fcc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
fcd0: 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 65  K_UNION ){.    e
fce0: 44 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20  Dest = pOrderBy 
fcf0: 3f 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 20  ? SRT_DistQueue 
fd00: 3a 20 53 52 54 5f 44 69 73 74 54 61 62 6c 65 3b  : SRT_DistTable;
fd10: 0a 20 20 20 20 69 44 69 73 74 69 6e 63 74 20 3d  .    iDistinct =
fd20: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
fd30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 44  .  }else{.    eD
fd40: 65 73 74 20 3d 20 70 4f 72 64 65 72 42 79 20 3f  est = pOrderBy ?
fd50: 20 53 52 54 5f 51 75 65 75 65 20 3a 20 53 52 54   SRT_Queue : SRT
fd60: 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 73 71  _Table;.  }.  sq
fd70: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
fd80: 6e 69 74 28 26 64 65 73 74 51 75 65 75 65 2c 20  nit(&destQueue, 
fd90: 65 44 65 73 74 2c 20 69 51 75 65 75 65 29 3b 0a  eDest, iQueue);.
fda0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 63  .  /* Allocate c
fdb0: 75 72 73 6f 72 73 20 66 6f 72 20 43 75 72 72 65  ursors for Curre
fdc0: 6e 74 2c 20 51 75 65 75 65 2c 20 61 6e 64 20 44  nt, Queue, and D
fdd0: 69 73 74 69 6e 63 74 2e 20 2a 2f 0a 20 20 72 65  istinct. */.  re
fde0: 67 43 75 72 72 65 6e 74 20 3d 20 2b 2b 70 50 61  gCurrent = ++pPa
fdf0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
fe00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
fe10: 2c 20 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c  , OP_OpenPseudo,
fe20: 20 69 43 75 72 72 65 6e 74 2c 20 72 65 67 43 75   iCurrent, regCu
fe30: 72 72 65 6e 74 2c 20 6e 43 6f 6c 29 3b 0a 20 20  rrent, nCol);.  
fe40: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
fe50: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
fe60: 79 49 6e 66 6f 20 3d 20 6d 75 6c 74 69 53 65 6c  yInfo = multiSel
fe70: 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e 66  ectOrderByKeyInf
fe80: 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31 29 3b  o(pParse, p, 1);
fe90: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
fea0: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
feb0: 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 51 75 65  nEphemeral, iQue
fec0: 75 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ue, pOrderBy->nE
fed0: 78 70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20  xpr+2, 0,.      
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
ff00: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
ff10: 20 20 64 65 73 74 51 75 65 75 65 2e 70 4f 72 64    destQueue.pOrd
ff20: 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b  erBy = pOrderBy;
ff30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
ff40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
ff50: 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
ff60: 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 6e 43 6f  ral, iQueue, nCo
ff70: 6c 29 3b 0a 20 20 7d 0a 20 20 56 64 62 65 43 6f  l);.  }.  VdbeCo
ff80: 6d 6d 65 6e 74 28 28 76 2c 20 22 51 75 65 75 65  mment((v, "Queue
ff90: 20 74 61 62 6c 65 22 29 29 3b 0a 20 20 69 66 28   table"));.  if(
ffa0: 20 69 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20   iDistinct ){.  
ffb0: 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68    p->addrOpenEph
ffc0: 6d 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 56 64  m[0] = sqlite3Vd
ffd0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
ffe0: 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 69 44  penEphemeral, iD
fff0: 69 73 74 69 6e 63 74 2c 20 30 29 3b 0a 20 20 20  istinct, 0);.   
10000 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
10010 53 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c  SF_UsesEphemeral
10020 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 74 61  ;.  }..  /* Deta
10030 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ch the ORDER BY 
10040 63 6c 61 75 73 65 20 66 72 6f 6d 20 74 68 65 20  clause from the 
10050 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
10060 2a 2f 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79  */.  p->pOrderBy
10070 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 74 6f 72   = 0;..  /* Stor
10080 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66  e the results of
10090 20 74 68 65 20 73 65 74 75 70 2d 71 75 65 72 79   the setup-query
100a0 20 69 6e 20 51 75 65 75 65 2e 20 2a 2f 0a 20 20   in Queue. */.  
100b0 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20 3d 20  pSetup->pNext = 
100c0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
100d0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
100e0 70 53 65 74 75 70 2c 20 26 64 65 73 74 51 75 65  pSetup, &destQue
100f0 75 65 29 3b 0a 20 20 70 53 65 74 75 70 2d 3e 70  ue);.  pSetup->p
10100 4e 65 78 74 20 3d 20 70 3b 0a 20 20 69 66 28 20  Next = p;.  if( 
10110 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  rc ) goto end_of
10120 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
10130 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
10140 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 74 68 65   next row in the
10150 20 51 75 65 75 65 20 61 6e 64 20 6f 75 74 70 75   Queue and outpu
10160 74 20 74 68 61 74 20 72 6f 77 20 2a 2f 0a 20 20  t that row */.  
10170 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
10180 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10190 50 5f 52 65 77 69 6e 64 2c 20 69 51 75 65 75 65  P_Rewind, iQueue
101a0 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a 20  , addrBreak);.. 
101b0 20 2f 2a 20 54 72 61 6e 73 66 65 72 20 74 68 65   /* Transfer the
101c0 20 6e 65 78 74 20 72 6f 77 20 69 6e 20 51 75 65   next row in Que
101d0 75 65 20 6f 76 65 72 20 74 6f 20 43 75 72 72 65  ue over to Curre
101e0 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  nt */.  sqlite3V
101f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
10200 4e 75 6c 6c 52 6f 77 2c 20 69 43 75 72 72 65 6e  NullRow, iCurren
10210 74 29 3b 20 2f 2a 20 54 6f 20 72 65 73 65 74 20  t); /* To reset 
10220 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 2a 2f 0a  column cache */.
10230 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
10240 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
10250 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
10260 6c 75 6d 6e 2c 20 69 51 75 65 75 65 2c 20 70 4f  lumn, iQueue, pO
10270 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c  rderBy->nExpr+1,
10280 20 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20   regCurrent);.  
10290 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
102a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
102b0 4f 50 5f 52 6f 77 44 61 74 61 2c 20 69 51 75 65  OP_RowData, iQue
102c0 75 65 2c 20 72 65 67 43 75 72 72 65 6e 74 29 3b  ue, regCurrent);
102d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
102e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44  beAddOp1(v, OP_D
102f0 65 6c 65 74 65 2c 20 69 51 75 65 75 65 29 3b 0a  elete, iQueue);.
10300 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
10310 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20 43   single row in C
10320 75 72 72 65 6e 74 20 2a 2f 0a 20 20 61 64 64 72  urrent */.  addr
10330 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
10340 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
10350 20 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20    codeOffset(v, 
10360 72 65 67 4f 66 66 73 65 74 2c 20 61 64 64 72 43  regOffset, addrC
10370 6f 6e 74 29 3b 0a 20 20 73 65 6c 65 63 74 49 6e  ont);.  selectIn
10380 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
10390 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 69 43  p, p->pEList, iC
103a0 75 72 72 65 6e 74 2c 0a 20 20 20 20 20 20 30 2c  urrent,.      0,
103b0 20 30 2c 20 70 44 65 73 74 2c 20 61 64 64 72 43   0, pDest, addrC
103c0 6f 6e 74 2c 20 61 64 64 72 42 72 65 61 6b 29 3b  ont, addrBreak);
103d0 0a 20 20 69 66 28 20 72 65 67 4c 69 6d 69 74 20  .  if( regLimit 
103e0 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
103f0 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op3(v, OP_IfZero
10400 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64 72  , regLimit, addr
10410 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 73 71  Break, -1);.  sq
10420 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
10430 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e  Label(v, addrCon
10440 74 29 3b 0a 0a 20 20 2f 2a 20 45 78 65 63 75 74  t);..  /* Execut
10450 65 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  e the recursive 
10460 53 45 4c 45 43 54 20 74 61 6b 69 6e 67 20 74 68  SELECT taking th
10470 65 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 6e 20  e single row in 
10480 43 75 72 72 65 6e 74 20 61 73 0a 20 20 2a 2a 20  Current as.  ** 
10490 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68  the value for th
104a0 65 20 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c  e recursive-tabl
104b0 65 2e 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  e. Store the res
104c0 75 6c 74 73 20 69 6e 20 74 68 65 20 51 75 65 75  ults in the Queu
104d0 65 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50 72  e..  */.  p->pPr
104e0 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ior = 0;.  sqlit
104f0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
10500 20 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b   p, &destQueue);
10510 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50  .  assert( p->pP
10520 72 69 6f 72 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  rior==0 );.  p->
10530 70 50 72 69 6f 72 20 3d 20 70 53 65 74 75 70 3b  pPrior = pSetup;
10540 0a 0a 20 20 2f 2a 20 4b 65 65 70 20 72 75 6e 6e  ..  /* Keep runn
10550 69 6e 67 20 74 68 65 20 6c 6f 6f 70 20 75 6e 74  ing the loop unt
10560 69 6c 20 74 68 65 20 51 75 65 75 65 20 69 73 20  il the Queue is 
10570 65 6d 70 74 79 20 2a 2f 0a 20 20 73 71 6c 69 74  empty */.  sqlit
10580 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
10590 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
105a0 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Top);.  sqlite3V
105b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
105c0 76 2c 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 0a  v, addrBreak);..
105d0 65 6e 64 5f 6f 66 5f 72 65 63 75 72 73 69 76 65  end_of_recursive
105e0 5f 71 75 65 72 79 3a 0a 20 20 70 2d 3e 70 4f 72  _query:.  p->pOr
105f0 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79  derBy = pOrderBy
10600 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20  ;.  p->pLimit = 
10610 70 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 70 4f 66  pLimit;.  p->pOf
10620 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a  fset = pOffset;.
10630 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
10640 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10650 54 5f 43 54 45 20 2a 2f 0a 0a 2f 2a 20 46 6f 72  T_CTE */../* For
10660 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
10670 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
10680 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79  ltiSelectOrderBy
10690 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
106a0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
106b0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
106c0 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
106d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
106e0 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  ight-most of SEL
106f0 45 43 54 73 20 74 6f 20 62 65 20 63 6f 64 65 64  ECTs to be coded
10700 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
10710 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20 57   *pDest     /* W
10720 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 71  hat to do with q
10730 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
10740 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  );.../*.** This 
10750 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
10760 64 20 74 6f 20 70 72 6f 63 65 73 73 20 61 20 63  d to process a c
10770 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 20 66 6f  ompound query fo
10780 72 6d 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f  rm from.** two o
10790 72 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 20  r more separate 
107a0 71 75 65 72 69 65 73 20 75 73 69 6e 67 20 55 4e  queries using UN
107b0 49 4f 4e 2c 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  ION, UNION ALL, 
107c0 45 58 43 45 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e  EXCEPT, or.** IN
107d0 54 45 52 53 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70  TERSECT.**.** "p
107e0 22 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  " points to the 
107f0 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66 20 74 68  right-most of th
10800 65 20 74 77 6f 20 71 75 65 72 69 65 73 2e 20 20  e two queries.  
10810 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68 65  the query on the
10820 0a 2a 2a 20 6c 65 66 74 20 69 73 20 70 2d 3e 70  .** left is p->p
10830 50 72 69 6f 72 2e 20 20 54 68 65 20 6c 65 66 74  Prior.  The left
10840 20 71 75 65 72 79 20 63 6f 75 6c 64 20 61 6c 73   query could als
10850 6f 20 62 65 20 61 20 63 6f 6d 70 6f 75 6e 64 20  o be a compound 
10860 71 75 65 72 79 0a 2a 2a 20 69 6e 20 77 68 69 63  query.** in whic
10870 68 20 63 61 73 65 20 74 68 69 73 20 72 6f 75 74  h case this rout
10880 69 6e 65 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ine will be call
10890 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e 20  ed recursively. 
108a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  .**.** The resul
108b0 74 73 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20  ts of the total 
108c0 71 75 65 72 79 20 61 72 65 20 74 6f 20 62 65 20  query are to be 
108d0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 61 20 64  written into a d
108e0 65 73 74 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66  estination.** of
108f0 20 74 79 70 65 20 65 44 65 73 74 20 77 69 74 68   type eDest with
10900 20 70 61 72 61 6d 65 74 65 72 20 69 50 61 72 6d   parameter iParm
10910 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 20  ..**.** Example 
10920 31 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 20 74  1:  Consider a t
10930 68 72 65 65 2d 77 61 79 20 63 6f 6d 70 6f 75 6e  hree-way compoun
10940 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
10950 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
10960 54 20 61 20 46 52 4f 4d 20 74 31 20 55 4e 49 4f  T a FROM t1 UNIO
10970 4e 20 53 45 4c 45 43 54 20 62 20 46 52 4f 4d 20  N SELECT b FROM 
10980 74 32 20 55 4e 49 4f 4e 20 53 45 4c 45 43 54 20  t2 UNION SELECT 
10990 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20  c FROM t3.**.** 
109a0 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 69  This statement i
109b0 73 20 70 61 72 73 65 64 20 75 70 20 61 73 20 66  s parsed up as f
109c0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
109d0 20 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d 20    SELECT c FROM 
109e0 74 33 0a 2a 2a 20 20 20 20 20 20 7c 0a 2a 2a 20  t3.**      |.** 
109f0 20 20 20 20 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45       `----->  SE
10a00 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 0a 2a  LECT b FROM t2.*
10a10 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
10a20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   |.**           
10a30 20 20 20 20 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53       `------>  S
10a40 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 74 31 0a  ELECT a FROM t1.
10a50 2a 2a 0a 2a 2a 20 54 68 65 20 61 72 72 6f 77 73  **.** The arrows
10a60 20 69 6e 20 74 68 65 20 64 69 61 67 72 61 6d 20   in the diagram 
10a70 61 62 6f 76 65 20 72 65 70 72 65 73 65 6e 74 20  above represent 
10a80 74 68 65 20 53 65 6c 65 63 74 2e 70 50 72 69 6f  the Select.pPrio
10a90 72 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f  r pointer..** So
10aa0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
10ab0 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
10ac0 70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  p equal to the t
10ad0 33 20 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a 2a  3 query, then.**
10ae0 20 70 50 72 69 6f 72 20 77 69 6c 6c 20 62 65 20   pPrior will be 
10af0 74 68 65 20 74 32 20 71 75 65 72 79 2e 20 20 70  the t2 query.  p
10b00 2d 3e 6f 70 20 77 69 6c 6c 20 62 65 20 54 4b 5f  ->op will be TK_
10b10 55 4e 49 4f 4e 20 69 6e 20 74 68 69 73 20 63 61  UNION in this ca
10b20 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65  se..**.** Notice
10b30 20 74 68 61 74 20 62 65 63 61 75 73 65 20 6f 66   that because of
10b40 20 74 68 65 20 77 61 79 20 53 51 4c 69 74 65 20   the way SQLite 
10b50 70 61 72 73 65 73 20 63 6f 6d 70 6f 75 6e 64 20  parses compound 
10b60 53 45 4c 45 43 54 73 2c 20 74 68 65 0a 2a 2a 20  SELECTs, the.** 
10b70 69 6e 64 69 76 69 64 75 61 6c 20 73 65 6c 65 63  individual selec
10b80 74 73 20 61 6c 77 61 79 73 20 67 72 6f 75 70 20  ts always group 
10b90 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
10ba0 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ht..*/.static in
10bb0 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 28 0a 20  t multiSelect(. 
10bc0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
10bd0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
10be0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
10bf0 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
10c00 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
10c10 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
10c20 73 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  s to be coded */
10c30 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70  .  SelectDest *p
10c40 44 65 73 74 20 20 20 20 20 2f 2a 20 57 68 61 74  Dest     /* What
10c50 20 74 6f 20 64 6f 20 77 69 74 68 20 71 75 65 72   to do with quer
10c60 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a  y results */.){.
10c70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10c80 45 5f 4f 4b 3b 20 20 20 2f 2a 20 53 75 63 63 65  E_OK;   /* Succe
10c90 73 73 20 63 6f 64 65 20 66 72 6f 6d 20 61 20 73  ss code from a s
10ca0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 53  ubroutine */.  S
10cb0 65 6c 65 63 74 20 2a 70 50 72 69 6f 72 3b 20 20  elect *pPrior;  
10cc0 20 20 20 20 20 2f 2a 20 41 6e 6f 74 68 65 72 20       /* Another 
10cd0 53 45 4c 45 43 54 20 69 6d 6d 65 64 69 61 74 65  SELECT immediate
10ce0 6c 79 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 2a  ly to our left *
10cf0 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
10d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
10d10 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 68  erate code to th
10d20 69 73 20 56 44 42 45 20 2a 2f 0a 20 20 53 65 6c  is VDBE */.  Sel
10d30 65 63 74 44 65 73 74 20 64 65 73 74 3b 20 20 20  ectDest dest;   
10d40 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76     /* Alternativ
10d50 65 20 64 61 74 61 20 64 65 73 74 69 6e 61 74 69  e data destinati
10d60 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
10d70 70 44 65 6c 65 74 65 20 3d 20 30 3b 20 20 2f 2a  pDelete = 0;  /*
10d80 20 43 68 61 69 6e 20 6f 66 20 73 69 6d 70 6c 65   Chain of simple
10d90 20 73 65 6c 65 63 74 73 20 74 6f 20 64 65 6c 65   selects to dele
10da0 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  te */.  sqlite3 
10db0 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  *db;          /*
10dc0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
10dd0 74 69 6f 6e 20 2a 2f 0a 23 69 66 6e 64 65 66 20  tion */.#ifndef 
10de0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
10df0 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31 20  AIN.  int iSub1 
10e00 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  = 0;        /* E
10e10 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68 61  QP id of left-ha
10e20 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nd query */.  in
10e30 74 20 69 53 75 62 32 20 3d 20 30 3b 20 20 20 20  t iSub2 = 0;    
10e40 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66      /* EQP id of
10e50 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65 72   right-hand quer
10e60 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  y */.#endif..  /
10e70 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72  * Make sure ther
10e80 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
10e90 20 6f 72 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   or LIMIT clause
10ea0 20 6f 6e 20 70 72 69 6f 72 20 53 45 4c 45 43 54   on prior SELECT
10eb0 73 2e 20 20 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68  s.  Only.  ** th
10ec0 65 20 6c 61 73 74 20 28 72 69 67 68 74 2d 6d 6f  e last (right-mo
10ed0 73 74 29 20 53 45 4c 45 43 54 20 69 6e 20 74 68  st) SELECT in th
10ee0 65 20 73 65 72 69 65 73 20 6d 61 79 20 68 61 76  e series may hav
10ef0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  e an ORDER BY or
10f00 20 4c 49 4d 49 54 2e 0a 20 20 2a 2f 0a 20 20 61   LIMIT..  */.  a
10f10 73 73 65 72 74 28 20 70 20 26 26 20 70 2d 3e 70  ssert( p && p->p
10f20 50 72 69 6f 72 20 29 3b 20 20 2f 2a 20 43 61 6c  Prior );  /* Cal
10f30 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 67 75  ling function gu
10f40 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 6d 75  arantees this mu
10f50 63 68 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ch */.  assert( 
10f60 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
10f70 46 5f 52 65 63 75 72 73 69 76 65 29 3d 3d 30 20  F_Recursive)==0 
10f80 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c  || p->op==TK_ALL
10f90 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e   || p->op==TK_UN
10fa0 49 4f 4e 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  ION );.  db = pP
10fb0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 50 72 69  arse->db;.  pPri
10fc0 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a  or = p->pPrior;.
10fd0 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73 74 3b    dest = *pDest;
10fe0 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70  .  if( pPrior->p
10ff0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73  OrderBy ){.    s
11000 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
11010 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42 59 20  Parse,"ORDER BY 
11020 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 63 6f  clause should co
11030 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f 74 20  me after %s not 
11040 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20 20 73  before",.      s
11050 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f  electOpName(p->o
11060 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b  p));.    rc = 1;
11070 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f  .    goto multi_
11080 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a  select_end;.  }.
11090 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
110a0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
110b0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
110c0 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75 73 65  se,"LIMIT clause
110d0 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
110e0 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
110f0 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
11100 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
11110 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
11120 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
11130 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
11140 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
11150 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
11160 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a 20 54  t( v!=0 );  /* T
11170 68 65 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  he VDBE already 
11180 63 72 65 61 74 65 64 20 62 79 20 63 61 6c 6c 69  created by calli
11190 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  ng function */..
111a0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
111b0 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65 6d 70  destination temp
111c0 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66 20 6e  orary table if n
111d0 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a 20 20  ecessary.  */.  
111e0 69 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d  if( dest.eDest==
111f0 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a  SRT_EphemTab ){.
11200 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
11210 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73 71 6c  EList );.    sql
11220 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
11230 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
11240 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  al, dest.iSDParm
11250 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  , p->pEList->nEx
11260 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
11270 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
11280 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
11290 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65 73 74  ;.    dest.eDest
112a0 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a 20 20   = SRT_Table;.  
112b0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
112c0 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20 69 6e  e all SELECTs in
112d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 68   the statement h
112e0 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
112f0 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 0a  ber of elements.
11300 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20 72 65    ** in their re
11310 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a 2f 0a  sult sets..  */.
11320 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
11330 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d 3e 70  ist && pPrior->p
11340 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28 20 70  EList );.  if( p
11350 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21  ->pEList->nExpr!
11360 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 2d  =pPrior->pEList-
11370 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66  >nExpr ){.    if
11380 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
11390 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20 20 20  SF_Values ){.   
113a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
113b0 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c 6c 20  sg(pParse, "all 
113c0 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61 76 65  VALUES must have
113d0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
113e0 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20 20 20   of terms");.   
113f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
11400 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
11410 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73 20 74  arse, "SELECTs t
11420 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  o the left and r
11430 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20 20 20  ight of %s".    
11440 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68 61 76      " do not hav
11450 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65  e the same numbe
11460 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
11470 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  mns", selectOpNa
11480 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20  me(p->op));.    
11490 7d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  }.    rc = 1;.  
114a0 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
114b0 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23 69  ect_end;.  }..#i
114c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
114d0 54 5f 43 54 45 0a 20 20 69 66 28 20 70 2d 3e 73  T_CTE.  if( p->s
114e0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63  elFlags & SF_Rec
114f0 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 67 65  ursive ){.    ge
11500 6e 65 72 61 74 65 57 69 74 68 52 65 63 75 72 73  nerateWithRecurs
11510 69 76 65 51 75 65 72 79 28 70 50 61 72 73 65 2c  iveQuery(pParse,
11520 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 7d 65   p, &dest);.  }e
11530 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  lse.#endif..  /*
11540 20 43 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   Compound SELECT
11550 73 20 74 68 61 74 20 68 61 76 65 20 61 6e 20 4f  s that have an O
11560 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
11570 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72  re handled separ
11580 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
11590 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
115a0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 75 6c 74  .    return mult
115b0 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 28 70  iSelectOrderBy(p
115c0 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73 74 29  Parse, p, pDest)
115d0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
115e0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
115f0 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
11600 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
11610 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
11620 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
11630 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
11640 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
11650 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
11660 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
11670 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
11680 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
11690 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d  pPrior->iLimit =
116a0 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 20 20   p->iLimit;.    
116b0 20 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66 73 65    pPrior->iOffse
116c0 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b 0a  t = p->iOffset;.
116d0 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e 70 4c        pPrior->pL
116e0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
116f0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 2d 3e  ;.      pPrior->
11700 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f 66  pOffset = p->pOf
11710 66 73 65 74 3b 0a 20 20 20 20 20 20 65 78 70 6c  fset;.      expl
11720 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53  ainSetInteger(iS
11730 75 62 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65  ub1, pParse->iNe
11740 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20  xtSelectId);.   
11750 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
11760 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 50  elect(pParse, pP
11770 72 69 6f 72 2c 20 26 64 65 73 74 29 3b 0a 20 20  rior, &dest);.  
11780 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20      p->pLimit = 
11790 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 66 66  0;.      p->pOff
117a0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  set = 0;.      i
117b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
117c0 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
117d0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  ct_end;.      }.
117e0 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20        p->pPrior 
117f0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c  = 0;.      p->iL
11800 69 6d 69 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69  imit = pPrior->i
11810 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
11820 69 4f 66 66 73 65 74 20 3d 20 70 50 72 69 6f 72  iOffset = pPrior
11830 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ->iOffset;.     
11840 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
11850 7b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  {.        addr =
11860 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11870 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c  p1(v, OP_IfZero,
11880 20 70 2d 3e 69 4c 69 6d 69 74 29 3b 0a 20 20 20   p->iLimit);.   
11890 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
118a0 28 28 76 2c 20 22 4a 75 6d 70 20 61 68 65 61 64  ((v, "Jump ahead
118b0 20 69 66 20 4c 49 4d 49 54 20 72 65 61 63 68 65   if LIMIT reache
118c0 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
118d0 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
118e0 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50 61  teger(iSub2, pPa
118f0 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
11900 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
11910 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
11920 61 72 73 65 2c 20 70 2c 20 26 64 65 73 74 29 3b  arse, p, &dest);
11930 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11940 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11950 3b 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20  ;.      pDelete 
11960 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
11970 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70     p->pPrior = p
11980 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
11990 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50  nSelectRow += pP
119a0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
119b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 69  ;.      if( pPri
119c0 6f 72 2d 3e 70 4c 69 6d 69 74 0a 20 20 20 20 20  or->pLimit.     
119d0 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72    && sqlite3Expr
119e0 49 73 49 6e 74 65 67 65 72 28 70 50 72 69 6f 72  IsInteger(pPrior
119f0 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 4c 69 6d 69  ->pLimit, &nLimi
11a00 74 29 0a 20 20 20 20 20 20 20 26 26 20 6e 4c 69  t).       && nLi
11a10 6d 69 74 3e 30 20 26 26 20 70 2d 3e 6e 53 65 6c  mit>0 && p->nSel
11a20 65 63 74 52 6f 77 20 3e 20 28 75 36 34 29 6e 4c  ectRow > (u64)nL
11a30 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a 20  imit .      ){. 
11a40 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63         p->nSelec
11a50 74 52 6f 77 20 3d 20 6e 4c 69 6d 69 74 3b 0a 20  tRow = nLimit;. 
11a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11a70 20 61 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20   addr ){.       
11a80 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
11a90 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20  Here(v, addr);. 
11aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
11ab0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
11ac0 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 0a 20 20  se TK_EXCEPT:.  
11ad0 20 20 63 61 73 65 20 54 4b 5f 55 4e 49 4f 4e 3a    case TK_UNION:
11ae0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 75 6e 69   {.      int uni
11af0 6f 6e 54 61 62 3b 20 20 20 20 2f 2a 20 43 75 72  onTab;    /* Cur
11b00 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
11b10 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
11b20 65 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c 74  e holding result
11b30 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 6f 70 20   */.      u8 op 
11b40 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e  = 0;       /* On
11b50 65 20 6f 66 20 74 68 65 20 53 52 54 5f 20 6f 70  e of the SRT_ op
11b60 65 72 61 74 69 6f 6e 73 20 74 6f 20 61 70 70 6c  erations to appl
11b70 79 20 74 6f 20 73 65 6c 66 20 2a 2f 0a 20 20 20  y to self */.   
11b80 20 20 20 69 6e 74 20 70 72 69 6f 72 4f 70 3b 20     int priorOp; 
11b90 20 20 20 20 2f 2a 20 54 68 65 20 53 52 54 5f 20      /* The SRT_ 
11ba0 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 61 70 70  operation to app
11bb0 6c 79 20 74 6f 20 70 72 69 6f 72 20 73 65 6c 65  ly to prior sele
11bc0 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 45 78 70  cts */.      Exp
11bd0 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66  r *pLimit, *pOff
11be0 73 65 74 3b 20 2f 2a 20 53 61 76 65 64 20 76 61  set; /* Saved va
11bf0 6c 75 65 73 20 6f 66 20 70 2d 3e 6e 4c 69 6d 69  lues of p->nLimi
11c00 74 20 61 6e 64 20 70 2d 3e 6e 4f 66 66 73 65 74  t and p->nOffset
11c10 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
11c20 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74  dr;.      Select
11c30 44 65 73 74 20 75 6e 69 6f 6e 64 65 73 74 3b 0a  Dest uniondest;.
11c40 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
11c50 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
11c60 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  T );.      testc
11c70 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ase( p->op==TK_U
11c80 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 70 72  NION );.      pr
11c90 69 6f 72 4f 70 20 3d 20 53 52 54 5f 55 6e 69 6f  iorOp = SRT_Unio
11ca0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64 65 73  n;.      if( des
11cb0 74 2e 65 44 65 73 74 3d 3d 70 72 69 6f 72 4f 70  t.eDest==priorOp
11cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
11cd0 65 20 63 61 6e 20 72 65 75 73 65 20 61 20 74 65  e can reuse a te
11ce0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 67 65  mporary table ge
11cf0 6e 65 72 61 74 65 64 20 62 79 20 61 20 53 45 4c  nerated by a SEL
11d00 45 43 54 20 74 6f 20 6f 75 72 0a 20 20 20 20 20  ECT to our.     
11d10 20 20 20 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20     ** right..   
11d20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11d30 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69 6d 69  assert( p->pLimi
11d40 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  t==0 );      /* 
11d50 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c  Not allowed on l
11d60 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73  eftward elements
11d70 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
11d80 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74 3d 3d  rt( p->pOffset==
11d90 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f 74 20  0 );     /* Not 
11da0 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77  allowed on leftw
11db0 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a  ard elements */.
11dc0 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
11dd0 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72 6d 3b   = dest.iSDParm;
11de0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11df0 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69 6c 6c        /* We will
11e00 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
11e10 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72 61 72  our own temporar
11e20 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20  y table to hold 
11e30 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  the.        ** i
11e40 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
11e50 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  lts..        */.
11e60 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54 61 62          unionTab
11e70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
11e80 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
11e90 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  t( p->pOrderBy==
11ea0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  0 );.        add
11eb0 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
11ec0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
11ed0 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69 6f 6e  Ephemeral, union
11ee0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Tab, 0);.       
11ef0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
11f00 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
11f10 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
11f20 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
11f30 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 20 20  = addr;.        
11f40 66 69 6e 64 52 69 67 68 74 6d 6f 73 74 28 70 29  findRightmost(p)
11f50 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
11f60 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a  _UsesEphemeral;.
11f70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11f80 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
11f90 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
11fa0 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ode the SELECT s
11fb0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72  tatements to our
11fc0 20 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20   left.      */. 
11fd0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
11fe0 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29  rior->pOrderBy )
11ff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
12000 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75  electDestInit(&u
12010 6e 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f  niondest, priorO
12020 70 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20  p, unionTab);.  
12030 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e      explainSetIn
12040 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61  teger(iSub1, pPa
12050 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74  rse->iNextSelect
12060 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Id);.      rc = 
12070 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
12080 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75  arse, pPrior, &u
12090 6e 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20  niondest);.     
120a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
120b0 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65     goto multi_se
120c0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
120d0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  }..      /* Code
120e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c   the current SEL
120f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  ECT statement.  
12100 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
12110 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50   p->op==TK_EXCEP
12120 54 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20  T ){.        op 
12130 3d 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20  = SRT_Except;.  
12140 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12150 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70     assert( p->op
12160 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20  ==TK_UNION );.  
12170 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55        op = SRT_U
12180 6e 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nion;.      }.  
12190 20 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20      p->pPrior = 
121a0 30 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20  0;.      pLimit 
121b0 3d 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  = p->pLimit;.   
121c0 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30     p->pLimit = 0
121d0 3b 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20  ;.      pOffset 
121e0 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20  = p->pOffset;.  
121f0 20 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d      p->pOffset =
12200 20 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64   0;.      uniond
12210 65 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a  est.eDest = op;.
12220 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
12230 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70  Integer(iSub2, p
12240 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
12250 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
12260 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
12270 70 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f  pParse, p, &unio
12280 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65  ndest);.      te
12290 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49  stcase( rc!=SQLI
122a0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f  TE_OK );.      /
122b0 2a 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69  * Query flatteni
122c0 6e 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c  ng in sqlite3Sel
122d0 65 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69  ect() might refi
122e0 6c 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a  ll p->pOrderBy..
122f0 20 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65        ** Be sure
12300 20 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f   to delete p->pO
12310 72 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72  rderBy, therefor
12320 65 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65  e, to avoid a me
12330 6d 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20  mory leak. */.  
12340 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
12350 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
12360 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
12370 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
12380 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
12390 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
123a0 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
123b0 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  By = 0;.      if
123c0 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f  ( p->op==TK_UNIO
123d0 4e 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  N ) p->nSelectRo
123e0 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65  w += pPrior->nSe
123f0 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73  lectRow;.      s
12400 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
12410 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b  (db, p->pLimit);
12420 0a 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  .      p->pLimit
12430 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20   = pLimit;.     
12440 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f   p->pOffset = pO
12450 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
12460 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  iLimit = 0;.    
12470 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30    p->iOffset = 0
12480 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  ;..      /* Conv
12490 65 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20  ert the data in 
124a0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
124b0 62 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ble into whateve
124c0 72 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  r form.      ** 
124d0 69 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75  it is that we cu
124e0 72 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20  rrently need..  
124f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
12500 65 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64  ert( unionTab==d
12510 65 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64  est.iSDParm || d
12520 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
12530 4f 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Op );.      if( 
12540 64 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f  dest.eDest!=prio
12550 72 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rOp ){.        i
12560 6e 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  nt iCont, iBreak
12570 2c 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20  , iStart;.      
12580 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
12590 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ist );.        i
125a0 66 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53  f( dest.eDest==S
125b0 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
125c0 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70         Select *p
125d0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  First = p;.     
125e0 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
125f0 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
12600 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
12610 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rior;.          
12620 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
12630 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70  mes(pParse, 0, p
12640 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a  First->pEList);.
12650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12660 20 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74    iBreak = sqlit
12670 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
12680 76 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e  v);.        iCon
12690 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
126a0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
126b0 20 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69       computeLimi
126c0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
126d0 65 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20  e, p, iBreak);. 
126e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
126f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
12700 65 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c  ewind, unionTab,
12710 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
12720 20 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74    iStart = sqlit
12730 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
12740 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65  r(v);.        se
12750 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
12760 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69  arse, p, p->pELi
12770 73 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 0a 20 20  st, unionTab,.  
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65 73        0, 0, &des
127a0 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b  t, iCont, iBreak
127b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
127c0 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
127d0 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20 20  el(v, iCont);.  
127e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
127f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
12800 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 53  xt, unionTab, iS
12810 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 73  tart);.        s
12820 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
12830 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b  eLabel(v, iBreak
12840 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12850 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
12860 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54  OP_Close, unionT
12870 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ab, 0);.      }.
12880 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12890 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
128a0 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54  assert( p->op==T
128b0 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20 7b  K_INTERSECT ); {
128c0 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31 2c  .      int tab1,
128d0 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e 74   tab2;.      int
128e0 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20   iCont, iBreak, 
128f0 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45 78  iStart;.      Ex
12900 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66  pr *pLimit, *pOf
12910 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  fset;.      int 
12920 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c 65  addr;.      Sele
12930 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63 74  ctDest intersect
12940 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  dest;.      int 
12950 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e  r1;..      /* IN
12960 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66 65  TERSECT is diffe
12970 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f 74  rent from the ot
12980 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72 65  hers since it re
12990 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a 20  quires.      ** 
129a0 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61  two temporary ta
129b0 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74 20  bles.  Hence it 
129c0 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73 65  has its own case
129d0 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20 2a  .  Begin.      *
129e0 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * by allocating 
129f0 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77 69  the tables we wi
12a00 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ll need..      *
12a10 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20 70  /.      tab1 = p
12a20 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
12a30 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61 72       tab2 = pPar
12a40 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
12a50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
12a60 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  derBy==0 );..   
12a70 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
12a80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12a90 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
12aa0 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20 20   tab1, 0);.     
12ab0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64 72   assert( p->addr
12ac0 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d  OpenEphm[0] == -
12ad0 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64  1 );.      p->ad
12ae0 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20  drOpenEphm[0] = 
12af0 61 64 64 72 3b 0a 20 20 20 20 20 20 66 69 6e 64  addr;.      find
12b00 52 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65  Rightmost(p)->se
12b10 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
12b20 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20  sEphemeral;.    
12b30 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c    assert( p->pEL
12b40 69 73 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ist );..      /*
12b50 20 43 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54   Code the SELECT
12b60 73 20 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e  s to our left in
12b70 74 6f 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  to temporary tab
12b80 6c 65 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20  le "tab1"..     
12b90 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
12ba0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
12bb0 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20  &intersectdest, 
12bc0 53 52 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29  SRT_Union, tab1)
12bd0 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
12be0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c  etInteger(iSub1,
12bf0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
12c00 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
12c10 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
12c20 74 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72  t(pParse, pPrior
12c30 2c 20 26 69 6e 74 65 72 73 65 63 74 64 65 73 74  , &intersectdest
12c40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
12c50 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
12c60 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
12c70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
12c80 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72   /* Code the cur
12c90 72 65 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f  rent SELECT into
12ca0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12cb0 20 22 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f   "tab2".      */
12cc0 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
12cd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12ce0 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
12cf0 72 61 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20  ral, tab2, 0);. 
12d00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
12d10 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
12d20 3d 3d 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70  == -1 );.      p
12d30 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31  ->addrOpenEphm[1
12d40 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
12d50 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
12d60 20 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d       pLimit = p-
12d70 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70  >pLimit;.      p
12d80 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
12d90 20 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d      pOffset = p-
12da0 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >pOffset;.      
12db0 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->pOffset = 0;.
12dc0 20 20 20 20 20 20 69 6e 74 65 72 73 65 63 74 64        intersectd
12dd0 65 73 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61  est.iSDParm = ta
12de0 62 32 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69  b2;.      explai
12df0 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
12e00 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  2, pParse->iNext
12e10 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
12e20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c   rc = sqlite3Sel
12e30 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26  ect(pParse, p, &
12e40 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
12e50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
12e60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
12e70 0a 20 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d  .      pDelete =
12e80 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
12e90 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50    p->pPrior = pP
12ea0 72 69 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rior;.      if( 
12eb0 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50  p->nSelectRow>pP
12ec0 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77  rior->nSelectRow
12ed0 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
12ee0 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65   = pPrior->nSele
12ef0 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c  ctRow;.      sql
12f00 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
12f10 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  b, p->pLimit);. 
12f20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d       p->pLimit =
12f30 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70   pLimit;.      p
12f40 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66  ->pOffset = pOff
12f50 73 65 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  set;..      /* G
12f60 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12f70 74 61 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65  take the interse
12f80 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f  ction of the two
12f90 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
12fa0 20 2a 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20   ** tables..    
12fb0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
12fc0 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a  t( p->pEList );.
12fd0 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e 65        if( dest.e
12fe0 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
12ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65   ){.        Sele
13000 63 74 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a  ct *pFirst = p;.
13010 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
13020 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
13030 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
13040 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20  >pPrior;.       
13050 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e   generateColumnN
13060 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20  ames(pParse, 0, 
13070 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b  pFirst->pEList);
13080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13090 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
130a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
130b0 0a 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73  .      iCont = s
130c0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
130d0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
130e0 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
130f0 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69  ers(pParse, p, i
13100 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71  Break);.      sq
13110 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
13120 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61  v, OP_Rewind, ta
13130 62 31 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20  b1, iBreak);.   
13140 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
13150 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
13160 29 3b 0a 20 20 20 20 20 20 69 53 74 61 72 74 20  );.      iStart 
13170 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13180 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79  Op2(v, OP_RowKey
13190 2c 20 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20  , tab1, r1);.   
131a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
131b0 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f  dOp4Int(v, OP_No
131c0 74 46 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43  tFound, tab2, iC
131d0 6f 6e 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20  ont, r1, 0);.   
131e0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
131f0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
13200 20 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65   r1);.      sele
13210 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
13220 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
13230 2c 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20  , tab1,.        
13240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
13250 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
13260 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
13270 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
13280 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
13290 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
132a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
132b0 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
132c0 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
132d0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
132e0 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
132f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13300 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
13310 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
13320 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13330 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
13340 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
13350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13360 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
13370 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
13380 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
13390 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
133a0 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
133b0 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
133c0 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
133d0 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
133e0 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
133f0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
13400 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
13410 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
13420 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
13430 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
13440 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
13450 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
13460 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
13470 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
13480 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
13490 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
134a0 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
134b0 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
134c0 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
134d0 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
134e0 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
134f0 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
13500 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
13510 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13520 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
13530 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
13540 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
13550 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
13560 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
13570 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13590 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
135a0 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
135b0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
135c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
135d0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
135e0 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
135f0 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
13600 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
13610 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
13620 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
13630 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
13640 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
13650 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
13660 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
13670 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
13680 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
13690 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
136c0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
136d0 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
136e0 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
136f0 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  =0 );.    nCol =
13700 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
13710 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  r;.    pKeyInfo 
13720 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
13730 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20  Alloc(db, nCol, 
13740 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  1);.    if( !pKe
13750 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
13760 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13770 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
13780 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13790 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
137a0 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66  , apColl=pKeyInf
137b0 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c  o->aColl; i<nCol
137c0 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29  ; i++, apColl++)
137d0 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20  {.      *apColl 
137e0 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
137f0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
13800 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i);.      if( 0=
13810 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  =*apColl ){.    
13820 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62      *apColl = db
13830 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
13840 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
13850 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
13860 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
13870 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
13880 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
13890 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
138a0 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64  addr = pLoop->ad
138b0 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20  drOpenEphm[i];. 
138c0 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c         if( addr<
138d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
138e0 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73  * If [0] is unus
138f0 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61  ed then [1] is a
13900 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20  lso unused.  So 
13910 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20  we can.         
13920 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c   ** always safel
13930 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20  y abort as soon 
13940 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75  as the first unu
13950 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e  sed slot is foun
13960 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
13970 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64  ssert( pLoop->ad
13980 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20  drOpenEphm[1]<0 
13990 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
139a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
139b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
139c0 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
139d0 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  r, nCol);.      
139e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
139f0 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
13a00 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
13a10 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
13a20 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
13a40 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
13a50 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f      pLoop->addrO
13a60 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b  penEphm[i] = -1;
13a70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13a80 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
13a90 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
13aa0 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
13ab0 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74  ect_end:.  pDest
13ac0 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  ->iSdst = dest.i
13ad0 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e  Sdst;.  pDest->n
13ae0 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73  Sdst = dest.nSds
13af0 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  t;.  sqlite3Sele
13b00 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  ctDelete(db, pDe
13b10 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  lete);.  return 
13b20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
13b30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
13b40 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
13b50 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75  /*.** Code an ou
13b60 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
13b70 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  for a coroutine 
13b80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
13b90 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
13ba0 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  atment..**.** Th
13bb0 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74  e data to be out
13bc0 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  put is contained
13bd0 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20   in pIn->iSdst. 
13be0 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
13bf0 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73  n->nSdst columns
13c00 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
13c10 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
13c20 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
13c30 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
13c40 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
13c50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
13c60 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
13c70 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
13c80 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
13c90 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
13ca0 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
13cb0 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67  is the first reg
13cc0 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f  ister in a vecto
13cd0 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64  r that.** record
13ce0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  s the previous o
13cf0 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50  utput.  mem[regP
13d00 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74  rev] is a flag t
13d10 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20  hat is false.** 
13d20 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
13d30 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75  n no previous ou
13d40 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65  tput.  If regPre
13d50 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  v>0 then code is
13d60 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f  .** generated to
13d70 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   suppress duplic
13d80 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20  ates.  pKeyInfo 
13d90 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70  is used for comp
13da0 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a  aring.** keys..*
13db0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49  *.** If the LIMI
13dc0 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c  T found in p->iL
13dd0 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
13de0 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
13df0 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a  y to.** iBreak..
13e00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
13e10 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
13e20 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20  outine(.  Parse 
13e30 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
13e40 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
13e50 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
13e60 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
13e70 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
13e80 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
13e90 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20  electDest *pIn, 
13ea0 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74         /* Corout
13eb0 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61  ine supplying da
13ec0 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
13ed0 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
13ee0 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64  /* Where to send
13ef0 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   the data */.  i
13f00 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20  nt regReturn,   
13f10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
13f20 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
13f30 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
13f40 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  egPrev,         
13f50 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
13f60 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20  esult register. 
13f70 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69   No uniqueness i
13f80 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  f 0 */.  KeyInfo
13f90 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
13fa0 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e   /* For comparin
13fb0 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  g with previous 
13fc0 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  entry */.  int i
13fd0 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
13fe0 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
13ff0 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
14000 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
14010 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
14020 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
14030 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
14040 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
14050 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
14060 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
14070 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
14080 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
14090 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
140a0 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
140b0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
140c0 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
140d0 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
140e0 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
140f0 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
14100 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14110 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29  _IfNot, regPrev)
14120 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69 74  ;.    j2 = sqlit
14130 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
14140 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e 2d  OP_Compare, pIn-
14150 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
14160 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a 20  1, pIn->nSdst,. 
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
14190 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
141a0 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c  foRef(pKeyInfo),
141b0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
141c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
141d0 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20  Op3(v, OP_Jump, 
141e0 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65 2c  j2+2, iContinue,
141f0 20 6a 32 2b 32 29 3b 0a 20 20 20 20 73 71 6c 69   j2+2);.    sqli
14200 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
14210 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69  v, j1);.    sqli
14220 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
14230 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d 3e 69   OP_Copy, pIn->i
14240 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b 31 2c  Sdst, regPrev+1,
14250 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a   pIn->nSdst-1);.
14260 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14270 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14280 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65 76 29  ger, 1, regPrev)
14290 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72  ;.  }.  if( pPar
142a0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
142b0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
142c0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
142d0 74 68 65 20 66 69 72 73 74 20 4f 46 46 53 45 54  the first OFFSET
142e0 20 65 6e 74 72 69 65 73 20 69 66 20 74 68 65 72   entries if ther
142f0 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54 20 63  e is an OFFSET c
14300 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63 6f 64  lause.  */.  cod
14310 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
14320 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
14330 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 44  );..  switch( pD
14340 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a 20 20  est->eDest ){.  
14350 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 72    /* Store the r
14360 65 73 75 6c 74 20 61 73 20 64 61 74 61 20 75 73  esult as data us
14370 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b 65 79  ing a unique key
14380 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
14390 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
143a0 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
143b0 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ab: {.      int 
143c0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
143d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
143e0 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73        int r2 = s
143f0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
14400 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
14410 74 65 73 74 63 61 73 65 28 20 70 44 65 73 74 2d  testcase( pDest-
14420 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61 62 6c  >eDest==SRT_Tabl
14430 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
14440 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44 65 73  ase( pDest->eDes
14450 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20  t==SRT_EphemTab 
14460 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14470 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14480 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
14490 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53  ->iSdst, pIn->nS
144a0 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  dst, r1);.      
144b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
144c0 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
144d0 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
144e0 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  , r2);.      sql
144f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
14500 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70 44 65  , OP_Insert, pDe
14510 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 2c  st->iSDParm, r1,
14520 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r2);.      sqli
14530 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
14540 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
14550 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14560 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
14570 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20  Parse, r2);.    
14580 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
14590 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
145a0 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  r1);.      break
145b0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
145c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
145d0 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49 66 20  QUERY.    /* If 
145e0 77 65 20 61 72 65 20 63 72 65 61 74 69 6e 67 20  we are creating 
145f0 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22 65 78  a set for an "ex
14600 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
14610 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20  .)" construct,. 
14620 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
14630 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73 69 6e   should be a sin
14640 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68 65 20  gle item on the 
14650 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20 74 68  stack.  Write th
14660 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d 20 69  is.    ** item i
14670 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61 62 6c  nto the set tabl
14680 65 20 77 69 74 68 20 62 6f 67 75 73 20 64 61 74  e with bogus dat
14690 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  a..    */.    ca
146a0 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20  se SRT_Set: {.  
146b0 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20      int r1;.    
146c0 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d 3e 6e    assert( pIn->n
146d0 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Sdst==1 );.     
146e0 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20   pDest->affSdst 
146f0 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  = .         sqli
14700 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
14710 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  ty(p->pEList->a[
14720 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73 74 2d  0].pExpr, pDest-
14730 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20 20 20  >affSdst);.     
14740 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
14750 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
14760 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14770 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4d  beAddOp4(v, OP_M
14780 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e 2d 3e  akeRecord, pIn->
14790 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20 26 70  iSdst, 1, r1, &p
147a0 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 31 29  Dest->affSdst,1)
147b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
147c0 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
147d0 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70  Change(pParse, p
147e0 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b 0a 20  In->iSdst, 1);. 
147f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14800 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78  AddOp2(v, OP_Idx
14810 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d 3e 69  Insert, pDest->i
14820 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20  SDParm, r1);.   
14830 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
14840 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
14850 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   r1);.      brea
14860 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 20  k;.    }..#if 0 
14870 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75 72 73   /* Never occurs
14880 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   on an ORDER BY 
14890 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f 2a 20  query */.    /* 
148a0 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74  If any row exist
148b0 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
148c0 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20  et, record that 
148d0 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a  fact and abort..
148e0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
148f0 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20  SRT_Exists: {.  
14900 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14910 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
14920 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d 3e 69  ger, 1, pDest->i
14930 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f  SDParm);.      /
14940 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75  * The LIMIT clau
14950 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74  se will terminat
14960 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75  e the loop for u
14970 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  s */.      break
14980 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
14990 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
149a0 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63  s a scalar selec
149b0 74 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  t that is part o
149c0 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  f an expression,
149d0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f   then.    ** sto
149e0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
149f0 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  n the appropriat
14a00 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
14a10 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20  d break out.    
14a20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c  ** of the scan l
14a30 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oop..    */.    
14a40 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a  case SRT_Mem: {.
14a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
14a60 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20  n->nSdst==1 );. 
14a70 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14a80 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
14a90 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
14aa0 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31 29 3b  st->iSDParm, 1);
14ab0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49  .      /* The LI
14ac0 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20  MIT clause will 
14ad0 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65 20  jump out of the 
14ae0 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20  loop for us */. 
14af0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14b00 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e  }.#endif /* #ifn
14b10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14b20 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20 20 20  SUBQUERY */..   
14b30 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20   /* The results 
14b40 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
14b50 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
14b60 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
14b70 72 74 69 6e 67 20 61 74 20 70 44 65 73 74 2d 3e  rting at pDest->
14b80 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74 68 65  iSdst.  Then the
14b90 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69 65 6c   co-routine yiel
14ba0 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ds..    */.    c
14bb0 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  ase SRT_Coroutin
14bc0 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  e: {.      if( p
14bd0 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20 29  Dest->iSdst==0 )
14be0 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  {.        pDest-
14bf0 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74 65 33  >iSdst = sqlite3
14c00 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
14c10 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 29  rse, pIn->nSdst)
14c20 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73 74 2d  ;.        pDest-
14c30 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e 6e 53  >nSdst = pIn->nS
14c40 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dst;.      }.   
14c50 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
14c60 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 70  deMove(pParse, p
14c70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  In->iSdst, pDest
14c80 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74 2d 3e  ->iSdst, pDest->
14c90 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
14ca0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
14cb0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70 44 65  v, OP_Yield, pDe
14cc0 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20  st->iSDParm);.  
14cd0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
14ce0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 65  ..    /* If none
14cf0 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c 20 74   of the above, t
14d00 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 64  hen the result d
14d10 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73 74 20  estination must 
14d20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f 4f 75  be.    ** SRT_Ou
14d30 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74  tput.  This rout
14d40 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63 61 6c  ine is never cal
14d50 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  led with any oth
14d60 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74 69 6e  er.    ** destin
14d70 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ation other than
14d80 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64 6c 65   the ones handle
14d90 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54 5f 4f  d above or SRT_O
14da0 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  utput..    **.  
14db0 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f 75 74    ** For SRT_Out
14dc0 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61 72 65  put, results are
14dd0 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73 65 71   stored in a seq
14de0 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65  uence of registe
14df0 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54 68 65  rs.  .    ** The
14e00 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52  n the OP_ResultR
14e10 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75 73 65  ow opcode is use
14e20 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c 69 74  d to cause sqlit
14e30 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20 20 20  e3_step() to.   
14e40 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 6e   ** return the n
14e50 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73 75 6c  ext row of resul
14e60 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65  t..    */.    de
14e70 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 61  fault: {.      a
14e80 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e 65 44  ssert( pDest->eD
14e90 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
14ea0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14eb0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14ec0 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49 6e 2d  _ResultRow, pIn-
14ed0 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e 53 64  >iSdst, pIn->nSd
14ee0 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
14ef0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
14f00 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
14f10 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49  , pIn->iSdst, pI
14f20 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  n->nSdst);.     
14f30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
14f40 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20  }..  /* Jump to 
14f50 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
14f60 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d 49 54  oop if the LIMIT
14f70 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20 20 2a   is reached..  *
14f80 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  /.  if( p->iLimi
14f90 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
14fa0 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
14fb0 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c 69 6d  _IfZero, p->iLim
14fc0 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31 29 3b  it, iBreak, -1);
14fd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
14fe0 61 74 65 20 74 68 65 20 73 75 62 72 6f 75 74 69  ate the subrouti
14ff0 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  ne return.  */. 
15000 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
15010 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
15020 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c 69 74 65  tinue);.  sqlite
15030 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15040 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52 65 74  P_Return, regRet
15050 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  urn);..  return 
15060 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  addr;.}../*.** A
15070 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6d 70 6f  lternative compo
15080 75 6e 64 20 73 65 6c 65 63 74 20 63 6f 64 65 20  und select code 
15090 67 65 6e 65 72 61 74 6f 72 20 66 6f 72 20 63 61  generator for ca
150a0 73 65 73 20 77 68 65 6e 20 74 68 65 72 65 0a 2a  ses when there.*
150b0 2a 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  * is an ORDER BY
150c0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 57   clause..**.** W
150d0 65 20 61 73 73 75 6d 65 20 61 20 71 75 65 72 79  e assume a query
150e0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
150f0 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20  g form:.**.**   
15100 20 20 20 3c 73 65 6c 65 63 74 41 3e 20 20 3c 6f     <selectA>  <o
15110 70 65 72 61 74 6f 72 3e 20 20 3c 73 65 6c 65 63  perator>  <selec
15120 74 42 3e 20 20 4f 52 44 45 52 20 42 59 20 3c 6f  tB>  ORDER BY <o
15130 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a 2a 0a 2a  rderbylist>.**.*
15140 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20  * <operator> is 
15150 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20 41 4c 4c  one of UNION ALL
15160 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c  , UNION, EXCEPT,
15170 20 6f 72 20 49 4e 54 45 52 53 45 43 54 2e 20 20   or INTERSECT.  
15180 54 68 65 20 69 64 65 61 0a 2a 2a 20 69 73 20 74  The idea.** is t
15190 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c 73 65 6c  o code both <sel
151a0 65 63 74 41 3e 20 61 6e 64 20 3c 73 65 6c 65 63  ectA> and <selec
151b0 74 42 3e 20 77 69 74 68 20 74 68 65 20 4f 52 44  tB> with the ORD
151c0 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73 0a  ER BY clause as.
151d0 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65 73 2e 20  ** co-routines. 
151e0 20 54 68 65 6e 20 72 75 6e 20 74 68 65 20 63 6f   Then run the co
151f0 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20 70 61 72  -routines in par
15200 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72 67 65 20  allel and merge 
15210 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69  the results.** i
15220 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 20  nto the output. 
15230 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
15240 74 68 65 20 74 77 6f 20 63 6f 72 6f 75 74 69 6e  the two coroutin
15250 65 73 20 28 63 61 6c 6c 65 64 20 73 65 6c 65 63  es (called selec
15260 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c 65 63 74  tA and.** select
15270 42 29 20 74 68 65 72 65 20 61 72 65 20 37 20 73  B) there are 7 s
15280 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a 2a 0a 2a  ubroutines:.**.*
15290 2a 20 20 20 20 6f 75 74 41 3a 20 20 20 20 4d 6f  *    outA:    Mo
152a0 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  ve the output of
152b0 20 74 68 65 20 73 65 6c 65 63 74 41 20 63 6f 72   the selectA cor
152c0 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65 20  outine into the 
152d0 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20 20  output.**       
152e0 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f 6d        of the com
152f0 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a 2a 2a 0a  pound query..**.
15300 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20 20 20 4d  **    outB:    M
15310 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f  ove the output o
15320 66 20 74 68 65 20 73 65 6c 65 63 74 42 20 63 6f  f the selectB co
15330 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74 68 65  routine into the
15340 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20 20 20   output.**      
15350 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 63 6f         of the co
15360 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 20 28  mpound query.  (
15370 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65 64 20 66  Only generated f
15380 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a 2a 2a 20  or UNION and.** 
15390 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
153a0 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50 54 20 61  N ALL.  EXCEPT a
153b0 6e 64 20 49 4e 53 45 52 54 53 45 43 54 20 6e 65  nd INSERTSECT ne
153c0 76 65 72 20 6f 75 74 70 75 74 20 61 20 72 6f 77  ver output a row
153d0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
153e0 20 20 20 20 20 61 70 70 65 61 72 73 20 6f 6e 6c       appears onl
153f0 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a 2a 20 20  y in B.).**.**  
15400 20 20 41 6c 74 42 3a 20 20 20 20 43 61 6c 6c 65    AltB:    Calle
15410 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
15420 64 61 74 61 20 66 72 6f 6d 20 62 6f 74 68 20 63  data from both c
15430 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 41 3c  oroutines and A<
15440 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41 65 71 42  B..**.**    AeqB
15450 3a 20 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e  :    Called when
15460 20 74 68 65 72 65 20 69 73 20 64 61 74 61 20 66   there is data f
15470 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69  rom both corouti
15480 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e 0a 2a 2a  nes and A==B..**
15490 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 20 20 20  .**    AgtB:    
154a0 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72  Called when ther
154b0 65 20 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62  e is data from b
154c0 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61  oth coroutines a
154d0 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a 20 20 20  nd A>B..**.**   
154e0 20 45 6f 66 41 3a 20 20 20 20 43 61 6c 6c 65 64   EofA:    Called
154f0 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65 78   when data is ex
15500 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c  hausted from sel
15510 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 45  ectA..**.**    E
15520 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  ofB:    Called w
15530 68 65 6e 20 64 61 74 61 20 69 73 20 65 78 68 61  hen data is exha
15540 75 73 74 65 64 20 66 72 6f 6d 20 73 65 6c 65 63  usted from selec
15550 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6d  tB..**.** The im
15560 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
15570 74 68 65 20 6c 61 74 74 65 72 20 66 69 76 65 20  the latter five 
15580 73 75 62 72 6f 75 74 69 6e 65 73 20 64 65 70 65  subroutines depe
15590 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a 2a 2a 20  nd on which .** 
155a0 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73 20 75 73  <operator> is us
155b0 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 20 20 20  ed:.**.**.**    
155c0 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e 20 41           UNION A
155d0 4c 4c 20 20 20 20 20 20 20 20 20 55 4e 49 4f 4e  LL         UNION
155e0 20 20 20 20 20 20 20 20 20 20 20 20 45 58 43 45              EXCE
155f0 50 54 20 20 20 20 20 20 20 20 20 20 49 4e 54 45  PT          INTE
15600 52 53 45 43 54 0a 2a 2a 20 20 20 20 20 20 20 20  RSECT.**        
15610 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20    ------------- 
15620 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
15630 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
15640 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
15650 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c 74 42 3a  -----.**   AltB:
15660 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
15670 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20      outA, nextA 
15680 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74        outA, next
15690 41 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 0a  A         nextA.
156a0 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a 20 20 20  **.**   AeqB:   
156b0 6f 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20  outA, nextA     
156c0 20 20 20 20 6e 65 78 74 41 20 20 20 20 20 20 20      nextA       
156d0 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20 20        nextA     
156e0 20 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 0a      outA, nextA.
156f0 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a 20 20 20  **.**   AgtB:   
15700 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
15710 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
15720 20 20 20 20 20 20 6e 65 78 74 42 20 20 20 20 20        nextB     
15730 20 20 20 20 20 20 20 6e 65 78 74 42 0a 2a 2a 0a         nextB.**.
15740 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20 6f 75 74  **   EofA:   out
15750 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 6f 75  B, nextB      ou
15760 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20 20 20  tB, nextB       
15770 20 20 20 68 61 6c 74 20 20 20 20 20 20 20 20 20     halt         
15780 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 20      halt.**.**  
15790 20 45 6f 66 42 3a 20 20 20 6f 75 74 41 2c 20 6e   EofB:   outA, n
157a0 65 78 74 41 20 20 20 20 20 20 6f 75 74 41 2c 20  extA      outA, 
157b0 6e 65 78 74 41 20 20 20 20 20 20 20 6f 75 74 41  nextA       outA
157c0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 20 20  , nextA         
157d0 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  halt.**.** In th
157e0 65 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 61 6e  e AltB, AeqB, an
157f0 64 20 41 67 74 42 20 73 75 62 72 6f 75 74 69 6e  d AgtB subroutin
15800 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e 20 41 20  es, an EOF on A 
15810 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78 74 41 0a  following nextA.
15820 2a 2a 20 63 61 75 73 65 73 20 61 6e 20 69 6d 6d  ** causes an imm
15830 65 64 69 61 74 65 20 6a 75 6d 70 20 74 6f 20 45  ediate jump to E
15840 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f 46 20 6f  ofA and an EOF o
15850 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65  n B following ne
15860 78 74 42 20 63 61 75 73 65 73 0a 2a 2a 20 61 6e  xtB causes.** an
15870 20 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20   immediate jump 
15880 74 6f 20 45 6f 66 42 2e 20 20 57 69 74 68 69 6e  to EofB.  Within
15890 20 45 6f 66 41 20 61 6e 64 20 45 6f 66 42 2c 20   EofA and EofB, 
158a0 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e 74 72 79  and EOF on entry
158b0 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67   or.** following
158c0 20 6e 65 78 74 58 20 63 61 75 73 65 73 20 61 20   nextX causes a 
158d0 6a 75 6d 70 20 74 6f 20 74 68 65 20 65 6e 64 20  jump to the end 
158e0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 70 72  of the select pr
158f0 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
15900 44 75 70 6c 69 63 61 74 65 20 72 65 6d 6f 76 61  Duplicate remova
15910 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f 4e 2c 20  l in the UNION, 
15920 45 58 43 45 50 54 2c 20 61 6e 64 20 49 4e 54 45  EXCEPT, and INTE
15930 52 53 45 43 54 20 63 61 73 65 73 20 69 73 20 68  RSECT cases is h
15940 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74 68 69 6e  andled.** within
15950 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62 72   the output subr
15960 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 72 65 67  outine.  The reg
15970 50 72 65 76 20 72 65 67 69 73 74 65 72 20 73 65  Prev register se
15980 74 20 68 6f 6c 64 73 20 74 68 65 20 70 72 65 76  t holds the prev
15990 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74 70 75 74  iously.** output
159a0 20 76 61 6c 75 65 2e 20 20 41 20 63 6f 6d 70 61   value.  A compa
159b0 72 69 73 6f 6e 20 69 73 20 6d 61 64 65 20 61 67  rison is made ag
159c0 61 69 6e 73 74 20 74 68 69 73 20 76 61 6c 75 65  ainst this value
159d0 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
159e0 2a 2a 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ** is skipped if
159f0 20 74 68 65 20 6e 65 78 74 20 72 65 73 75 6c 74   the next result
15a00 73 20 77 6f 75 6c 64 20 62 65 20 74 68 65 20 73  s would be the s
15a10 61 6d 65 20 61 73 20 74 68 65 20 70 72 65 76 69  ame as the previ
15a20 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ous..**.** The i
15a30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 70 6c  mplementation pl
15a40 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c 65 6d 65  an is to impleme
15a50 6e 74 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  nt the two corou
15a60 74 69 6e 65 73 20 61 6e 64 20 73 65 76 65 6e 0a  tines and seven.
15a70 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 73 20 66  ** subroutines f
15a80 69 72 73 74 2c 20 74 68 65 6e 20 70 75 74 20 74  irst, then put t
15a90 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f 67 69 63  he control logic
15aa0 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 2e 20   at the bottom. 
15ab0 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   Like this:.**.*
15ac0 2a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  *          goto 
15ad0 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63 6f 41 3a  Init.**     coA:
15ae0 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
15af0 65 66 74 20 71 75 65 72 79 20 28 41 29 0a 2a 2a  eft query (A).**
15b00 20 20 20 20 20 63 6f 42 3a 20 63 6f 72 6f 75 74       coB: corout
15b10 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20 71 75  ine for right qu
15b20 65 72 79 20 28 42 29 0a 2a 2a 20 20 20 20 6f 75  ery (B).**    ou
15b30 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tA: output one r
15b40 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20 20 6f 75  ow of A.**    ou
15b50 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e 65 20 72  tB: output one r
15b60 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f 4e 20 61  ow of B (UNION a
15b70 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 6e 6c  nd UNION ALL onl
15b80 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41 3a 20 2e  y).**    EofA: .
15b90 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42 3a 20 2e  ...**    EofB: .
15ba0 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42 3a 20 2e  ...**    AltB: .
15bb0 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42 3a 20 2e  ...**    AeqB: .
15bc0 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20 2e  ...**    AgtB: .
15bd0 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74 3a 20 69  ...**    Init: i
15be0 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72 6f 75 74  nitialize corout
15bf0 69 6e 65 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  ine registers.**
15c00 20 20 20 20 20 20 20 20 20 20 79 69 65 6c 64 20            yield 
15c10 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  coA.**          
15c20 69 66 20 65 6f 66 28 41 29 20 67 6f 74 6f 20 45  if eof(A) goto E
15c30 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ofA.**          
15c40 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20 20 20 20  yield coB.**    
15c50 20 20 20 20 20 20 69 66 20 65 6f 66 28 42 29 20        if eof(B) 
15c60 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20 20 20 20  goto EofB.**    
15c70 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65 20 41 2c  Cmpr: Compare A,
15c80 20 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 4a   B.**          J
15c90 75 6d 70 20 41 6c 74 42 2c 20 41 65 71 42 2c 20  ump AltB, AeqB, 
15ca0 41 67 74 42 0a 2a 2a 20 20 20 20 20 45 6e 64 3a  AgtB.**     End:
15cb0 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61   ....**.** We ca
15cc0 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42 2c 20 41  ll AltB, AeqB, A
15cd0 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e 64 20 45  gtB, EofA, and E
15ce0 6f 66 42 20 22 73 75 62 72 6f 75 74 69 6e 65 73  ofB "subroutines
15cf0 22 20 62 75 74 20 74 68 65 79 20 61 72 65 20 6e  " but they are n
15d00 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 63  ot.** actually c
15d10 61 6c 6c 65 64 20 75 73 69 6e 67 20 47 6f 73 75  alled using Gosu
15d20 62 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  b and they do no
15d30 74 20 52 65 74 75 72 6e 2e 20 20 45 6f 66 41 20  t Return.  EofA 
15d40 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70 0a 2a 2a  and EofB loop.**
15d50 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61 74 61 20   until all data 
15d60 69 73 20 65 78 68 61 75 73 74 65 64 20 74 68 65  is exhausted the
15d70 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 22 65  n jump to the "e
15d80 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c 74 42 2c  nd" labe.  AltB,
15d90 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64 20 41 67   AeqB,.** and Ag
15da0 74 42 20 6a 75 6d 70 20 74 6f 20 65 69 74 68 65  tB jump to eithe
15db0 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e 65 20 6f  r L2 or to one o
15dc0 66 20 45 6f 66 41 20 6f 72 20 45 6f 66 42 2e 0a  f EofA or EofB..
15dd0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
15de0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
15df0 53 45 4c 45 43 54 0a 73 74 61 74 69 63 20 69 6e  SELECT.static in
15e00 74 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64  t multiSelectOrd
15e10 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
15e20 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
15e30 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
15e40 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
15e50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15e60 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6f 66  he right-most of
15e70 20 53 45 4c 45 43 54 73 20 74 6f 20 62 65 20 63   SELECTs to be c
15e80 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74  oded */.  Select
15e90 44 65 73 74 20 2a 70 44 65 73 74 20 20 20 20 20  Dest *pDest     
15ea0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
15eb0 74 68 20 71 75 65 72 79 20 72 65 73 75 6c 74 73  th query results
15ec0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
15ed0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  j;             /
15ee0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
15ef0 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 72  */.  Select *pPr
15f00 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e  ior;       /* An
15f10 6f 74 68 65 72 20 53 45 4c 45 43 54 20 69 6d 6d  other SELECT imm
15f20 65 64 69 61 74 65 6c 79 20 74 6f 20 6f 75 72 20  ediately to our 
15f30 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a  left */.  Vdbe *
15f40 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
15f50 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
15f60 20 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a 2f   to this VDBE */
15f70 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65  .  SelectDest de
15f80 73 74 41 3b 20 20 20 20 20 2f 2a 20 44 65 73 74  stA;     /* Dest
15f90 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f  ination for coro
15fa0 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20 53 65 6c  utine A */.  Sel
15fb0 65 63 74 44 65 73 74 20 64 65 73 74 42 3b 20 20  ectDest destB;  
15fc0 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f     /* Destinatio
15fd0 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69 6e 65 20  n for coroutine 
15fe0 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 41 64  B */.  int regAd
15ff0 64 72 41 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  drA;         /* 
16000 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72  Address register
16010 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 63 6f   for select-A co
16020 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
16030 20 72 65 67 41 64 64 72 42 3b 20 20 20 20 20 20   regAddrB;      
16040 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72 65     /* Address re
16050 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63  gister for selec
16060 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
16070 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
16080 74 41 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tA;      /* Addr
16090 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
160a0 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-A coroutine */
160b0 0a 20 20 69 6e 74 20 61 64 64 72 53 65 6c 65 63  .  int addrSelec
160c0 74 42 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tB;      /* Addr
160d0 65 73 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  ess of the selec
160e0 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f  t-B coroutine */
160f0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 41 3b 20  .  int regOutA; 
16100 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
16110 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
16120 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75   the output-A su
16130 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
16140 74 20 72 65 67 4f 75 74 42 3b 20 20 20 20 20 20  t regOutB;      
16150 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 72      /* Address r
16160 65 67 69 73 74 65 72 20 66 6f 72 20 74 68 65 20  egister for the 
16170 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f 75 74  output-B subrout
16180 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
16190 72 4f 75 74 41 3b 20 20 20 20 20 20 20 20 20 2f  rOutA;         /
161a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
161b0 20 6f 75 74 70 75 74 2d 41 20 73 75 62 72 6f 75   output-A subrou
161c0 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tine */.  int ad
161d0 64 72 4f 75 74 42 20 3d 20 30 3b 20 20 20 20 20  drOutB = 0;     
161e0 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
161f0 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72 6f  e output-B subro
16200 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
16210 64 64 72 45 6f 66 41 3b 20 20 20 20 20 20 20 20  ddrEofA;        
16220 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
16230 68 65 20 73 65 6c 65 63 74 2d 41 2d 65 78 68 61  he select-A-exha
16240 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
16250 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 6f   */.  int addrEo
16260 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f 2a 20 41  fA_noB;     /* A
16270 6c 74 65 72 6e 61 74 65 20 61 64 64 72 45 6f 66  lternate addrEof
16280 41 20 69 66 20 42 20 69 73 20 75 6e 69 6e 69 74  A if B is uninit
16290 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69 6e 74  ialized */.  int
162a0 20 61 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20   addrEofB;      
162b0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
162c0 20 74 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78   the select-B-ex
162d0 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74 69  hausted subrouti
162e0 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
162f0 41 6c 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a  AltB;         /*
16300 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
16310 41 3c 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  A<B subroutine *
16320 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 65 71 42  /.  int addrAeqB
16330 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
16340 72 65 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42  ress of the A==B
16350 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
16360 20 69 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20   int addrAgtB;  
16370 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16380 73 20 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62  s of the A>B sub
16390 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
163a0 20 72 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20   regLimitA;     
163b0 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69     /* Limit regi
163c0 73 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d  ster for select-
163d0 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69  A */.  int regLi
163e0 6d 69 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20  mitB;        /* 
163f0 4c 69 6d 69 74 20 72 65 67 69 73 74 65 72 20 66  Limit register f
16400 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20  or select-A */. 
16410 20 69 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20   int regPrev;   
16420 20 20 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67         /* A rang
16430 65 20 6f 66 20 72 65 67 69 73 74 65 72 73 20 74  e of registers t
16440 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20  o hold previous 
16450 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20  output */.  int 
16460 73 61 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20  savedLimit;     
16470 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
16480 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f   of p->iLimit */
16490 0a 20 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73  .  int savedOffs
164a0 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65  et;      /* Save
164b0 64 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f  d value of p->iO
164c0 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  ffset */.  int l
164d0 61 62 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20  abelCmpr;       
164e0 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68   /* Label for th
164f0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d  e start of the m
16500 65 72 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a  erge algorithm *
16510 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64  /.  int labelEnd
16520 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62  ;         /* Lab
16530 65 6c 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f  el for the end o
16540 66 20 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45  f the overall SE
16550 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69  LECT stmt */.  i
16560 6e 74 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20  nt j1;          
16570 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73       /* Jump ins
16580 74 72 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67  tructions that g
16590 65 74 20 72 65 74 61 72 67 65 74 74 65 64 20 2a  et retargetted *
165a0 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  /.  int op;     
165b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
165c0 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55   of TK_ALL, TK_U
165d0 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c  NION, TK_EXCEPT,
165e0 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f   TK_INTERSECT */
165f0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
16600 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70  Dup = 0; /* Comp
16610 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69  arison informati
16620 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  on for duplicate
16630 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65   removal */.  Ke
16640 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65  yInfo *pKeyMerge
16650 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f  ;   /* Compariso
16660 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  n information fo
16670 72 20 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a  r merging rows *
16680 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
16690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
166a0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
166b0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
166c0 70 4f 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54  pOrderBy;   /* T
166d0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
166e0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  se */.  int nOrd
166f0 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  erBy;         /*
16700 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
16710 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
16720 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
16730 20 2a 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20   *aPermute;     
16740 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72     /* Mapping fr
16750 6f 6d 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  om ORDER BY term
16760 73 20 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20  s to result set 
16770 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64  columns */.#ifnd
16780 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
16790 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75  XPLAIN.  int iSu
167a0 62 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  b1;            /
167b0 2a 20 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74  * EQP id of left
167c0 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20  -hand query */. 
167d0 20 69 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20   int iSub2;     
167e0 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64         /* EQP id
167f0 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71   of right-hand q
16800 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  uery */.#endif..
16810 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72    assert( p->pOr
16820 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73  derBy!=0 );.  as
16830 73 65 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30  sert( pKeyDup==0
16840 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22   ); /* "Managed"
16850 20 63 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73   code needs this
16860 2e 20 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e  .  Ticket #3382.
16870 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
16880 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61  e->db;.  v = pPa
16890 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
168a0 73 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20  sert( v!=0 );   
168b0 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74      /* Already t
168c0 68 72 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20  hrown the error 
168d0 69 66 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61  if VDBE alloc fa
168e0 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45  iled */.  labelE
168f0 6e 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nd = sqlite3Vdbe
16900 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
16910 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69  labelCmpr = sqli
16920 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16930 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63  (v);...  /* Patc
16940 68 20 75 70 20 74 68 65 20 4f 52 44 45 52 20 42  h up the ORDER B
16950 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20  Y clause.  */.  
16960 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20  op = p->op;  .  
16970 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
16980 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  or;.  assert( pP
16990 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d  rior->pOrderBy==
169a0 30 20 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20  0 );.  pOrderBy 
169b0 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  = p->pOrderBy;. 
169c0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
169d0 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20  y );.  nOrderBy 
169e0 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
169f0 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65  r;..  /* For ope
16a00 72 61 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61  rators other tha
16a10 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68  n UNION ALL we h
16a20 61 76 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ave to make sure
16a30 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f   that.  ** the O
16a40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
16a50 6f 76 65 72 73 20 65 76 65 72 79 20 74 65 72 6d  overs every term
16a60 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
16a70 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65  et.  Add.  ** te
16a80 72 6d 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52  rms to the ORDER
16a90 20 42 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65   BY clause as ne
16aa0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
16ab0 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29  if( op!=TK_ALL )
16ac0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64  {.    for(i=1; d
16ad0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
16ae0 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69  =0 && i<=p->pELi
16af0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
16b00 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
16b10 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
16b20 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  em;.      for(j=
16b30 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
16b40 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79  y->a; j<nOrderBy
16b50 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
16b60 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16b70 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
16b80 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  erByCol>0 );.   
16b90 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
16ba0 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  u.x.iOrderByCol=
16bb0 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =i ) break;.    
16bc0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
16bd0 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  =nOrderBy ){.   
16be0 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
16bf0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
16c00 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
16c10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
16c20 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ew==0 ) return S
16c30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
16c40 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
16c50 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
16c60 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
16c70 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a 20 20 20  .iValue = i;.   
16c80 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20       pOrderBy = 
16c90 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
16ca0 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 4f  ppend(pParse, pO
16cb0 72 64 65 72 42 79 2c 20 70 4e 65 77 29 3b 0a 20  rderBy, pNew);. 
16cc0 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65         if( pOrde
16cd0 72 42 79 20 29 20 70 4f 72 64 65 72 42 79 2d 3e  rBy ) pOrderBy->
16ce0 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d 2e 75 2e  a[nOrderBy++].u.
16cf0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
16d00 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20 7d 0a  (u16)i;.      }.
16d10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
16d20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70  Compute the comp
16d30 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61 74 69  arison permutati
16d40 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f 20 74  on and keyinfo t
16d50 68 61 74 20 69 73 20 75 73 65 64 20 77 69 74 68  hat is used with
16d60 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d 75 74  .  ** the permut
16d70 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 64 65  ation used to de
16d80 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 6e  termine if the n
16d90 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  ext.  ** row of 
16da0 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20 66 72  results comes fr
16db0 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20 73 65  om selectA or se
16dc0 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61 64 64  lectB.  Also add
16dd0 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a 20 63   explicit.  ** c
16de0 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74 68 65  ollations to the
16df0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16e00 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74 20 77   terms so that w
16e10 68 65 6e 20 74 68 65 20 73 75 62 71 75 65 72 69  hen the subqueri
16e20 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 72  es.  ** to the r
16e30 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c 65 66  ight and the lef
16e40 74 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 2c  t are evaluated,
16e50 20 74 68 65 79 20 75 73 65 20 74 68 65 20 63 6f   they use the co
16e60 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c 6c 61  rrect.  ** colla
16e70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61 50 65  tion..  */.  aPe
16e80 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65 33 44  rmute = sqlite3D
16e90 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
16ea0 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72 64 65  izeof(int)*nOrde
16eb0 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50 65 72  rBy);.  if( aPer
16ec0 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74 72 75  mute ){.    stru
16ed0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
16ee0 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66 6f 72   *pItem;.    for
16ef0 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
16f00 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72 64 65  erBy->a; i<nOrde
16f10 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; i++, pItem+
16f20 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
16f30 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
16f40 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20 20 20 20  derByCol>0.     
16f50 20 20 20 20 20 26 26 20 70 49 74 65 6d 2d 3e 75       && pItem->u
16f60 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3c 3d  .x.iOrderByCol<=
16f70 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
16f80 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d 75   );.      aPermu
16f90 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e 75  te[i] = pItem->u
16fa0 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d  .x.iOrderByCol -
16fb0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b   1;.    }.    pK
16fc0 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c 74 69 53  eyMerge = multiS
16fd0 65 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49  electOrderByKeyI
16fe0 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 2c 20 31  nfo(pParse, p, 1
16ff0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17000 70 4b 65 79 4d 65 72 67 65 20 3d 20 30 3b 0a 20  pKeyMerge = 0;. 
17010 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74 74 61 63   }..  /* Reattac
17020 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
17030 6c 61 75 73 65 20 74 6f 20 74 68 65 20 71 75 65  lause to the que
17040 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 4f  ry..  */.  p->pO
17050 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72 42  rderBy = pOrderB
17060 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4f 72  y;.  pPrior->pOr
17070 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
17080 78 70 72 4c 69 73 74 44 75 70 28 70 50 61 72 73  xprListDup(pPars
17090 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72 42 79 2c  e->db, pOrderBy,
170a0 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63   0);..  /* Alloc
170b0 61 74 65 20 61 20 72 61 6e 67 65 20 6f 66 20 74  ate a range of t
170c0 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
170d0 72 73 20 61 6e 64 20 74 68 65 20 4b 65 79 49 6e  rs and the KeyIn
170e0 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a 2a 20 66  fo needed.  ** f
170f0 6f 72 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61  or the logic tha
17100 74 20 72 65 6d 6f 76 65 73 20 64 75 70 6c 69 63  t removes duplic
17110 61 74 65 20 72 65 73 75 6c 74 20 72 6f 77 73 20  ate result rows 
17120 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 70  when the.  ** op
17130 65 72 61 74 6f 72 20 69 73 20 55 4e 49 4f 4e 2c  erator is UNION,
17140 20 45 58 43 45 50 54 2c 20 6f 72 20 49 4e 54 45   EXCEPT, or INTE
17150 52 53 45 43 54 20 28 62 75 74 20 6e 6f 74 20 55  RSECT (but not U
17160 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20 2a 2f 0a  NION ALL)..  */.
17170 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 4c 4c    if( op==TK_ALL
17180 20 29 7b 0a 20 20 20 20 72 65 67 50 72 65 76 20   ){.    regPrev 
17190 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
171a0 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 2d    int nExpr = p-
171b0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
171c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4f 72 64      assert( nOrd
171d0 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c 7c 20 64  erBy>=nExpr || d
171e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
171f0 29 3b 0a 20 20 20 20 72 65 67 50 72 65 76 20 3d  );.    regPrev =
17200 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
17210 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
17220 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b 0a 20 20  m += nExpr+1;.  
17230 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
17240 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
17250 72 2c 20 30 2c 20 72 65 67 50 72 65 76 29 3b 0a  r, 0, regPrev);.
17260 20 20 20 20 70 4b 65 79 44 75 70 20 3d 20 73 71      pKeyDup = sq
17270 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
17280 63 28 64 62 2c 20 6e 45 78 70 72 2c 20 31 29 3b  c(db, nExpr, 1);
17290 0a 20 20 20 20 69 66 28 20 70 4b 65 79 44 75 70  .    if( pKeyDup
172a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
172b0 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ( sqlite3KeyInfo
172c0 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79  IsWriteable(pKey
172d0 44 75 70 29 20 29 3b 0a 20 20 20 20 20 20 66 6f  Dup) );.      fo
172e0 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20  r(i=0; i<nExpr; 
172f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4b  i++){.        pK
17300 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20  eyDup->aColl[i] 
17310 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
17320 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
17330 69 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79  i);.        pKey
17340 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Dup->aSortOrder[
17350 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
17360 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a      }.  }. .  /*
17370 20 53 65 70 61 72 61 74 65 20 74 68 65 20 6c 65   Separate the le
17380 66 74 20 61 6e 64 20 74 68 65 20 72 69 67 68 74  ft and the right
17390 20 71 75 65 72 79 20 66 72 6f 6d 20 6f 6e 65 20   query from one 
173a0 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a 20 20 70  another.  */.  p
173b0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
173c0 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20  pPrior->pNext = 
173d0 30 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f  0;.  sqlite3Reso
173e0 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
173f0 70 50 61 72 73 65 2c 20 70 2c 20 70 2d 3e 70 4f  pParse, p, p->pO
17400 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
17410 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  ;.  if( pPrior->
17420 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a 20 20 20  pPrior==0 ){.   
17430 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
17440 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72  rderGroupBy(pPar
17450 73 65 2c 20 70 50 72 69 6f 72 2c 20 70 50 72 69  se, pPrior, pPri
17460 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f  or->pOrderBy, "O
17470 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  RDER");.  }..  /
17480 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 69  * Compute the li
17490 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 2a 2f  mit registers */
174a0 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52  .  computeLimitR
174b0 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65 2c  egisters(pParse,
174c0 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20   p, labelEnd);. 
174d0 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 26   if( p->iLimit &
174e0 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  & op==TK_ALL ){.
174f0 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
17500 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
17510 20 20 20 20 72 65 67 4c 69 6d 69 74 42 20 3d 20      regLimitB = 
17520 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
17530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17540 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79  ddOp2(v, OP_Copy
17550 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20 3f 20 70  , p->iOffset ? p
17560 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a 20 70 2d  ->iOffset+1 : p-
17570 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20 20 20 20  >iLimit,.       
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17590 20 20 20 20 20 20 20 20 20 20 20 72 65 67 4c 69             regLi
175a0 6d 69 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  mitA);.    sqlit
175b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
175c0 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c 69 6d 69  OP_Copy, regLimi
175d0 74 41 2c 20 72 65 67 4c 69 6d 69 74 42 29 3b 0a  tA, regLimitB);.
175e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 67    }else{.    reg
175f0 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c 69 6d 69  LimitA = regLimi
17600 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  tB = 0;.  }.  sq
17610 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
17620 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
17630 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
17640 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
17650 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 66 66  lete(db, p->pOff
17660 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f 66 66 73  set);.  p->pOffs
17670 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65 67 41 64  et = 0;..  regAd
17680 64 72 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drA = ++pParse->
17690 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64 64 72 42  nMem;.  regAddrB
176a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
176b0 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b  m;.  regOutA = +
176c0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
176d0 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61   regOutB = ++pPa
176e0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c  rse->nMem;.  sql
176f0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
17700 69 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43  it(&destA, SRT_C
17710 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64  oroutine, regAdd
17720 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  rA);.  sqlite3Se
17730 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
17740 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69  stB, SRT_Corouti
17750 6e 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a  ne, regAddrB);..
17760 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
17770 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
17780 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
17790 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68   statement to th
177a0 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f 66 20 74  e.  ** left of t
177b0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f 70 65 72  he compound oper
177c0 61 74 6f 72 20 2d 20 74 68 65 20 22 41 22 20 73  ator - the "A" s
177d0 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 61 64  elect..  */.  ad
177e0 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
177f0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
17800 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20  dr(v) + 1;.  j1 
17810 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
17820 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
17830 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
17840 41 2c 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74  A, 0, addrSelect
17850 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  A);.  VdbeCommen
17860 74 28 28 76 2c 20 22 6c 65 66 74 20 53 45 4c 45  t((v, "left SELE
17870 43 54 22 29 29 3b 0a 20 20 70 50 72 69 6f 72 2d  CT"));.  pPrior-
17880 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
17890 69 74 41 3b 0a 20 20 65 78 70 6c 61 69 6e 53 65  itA;.  explainSe
178a0 74 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20  tInteger(iSub1, 
178b0 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
178c0 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74 65  ectId);.  sqlite
178d0 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
178e0 70 50 72 69 6f 72 2c 20 26 64 65 73 74 41 29 3b  pPrior, &destA);
178f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
17900 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
17910 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
17920 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
17930 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
17940 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
17950 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
17960 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
17970 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e  ECT statement on
17980 20 0a 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74   .  ** the right
17990 20 2d 20 74 68 65 20 22 42 22 20 73 65 6c 65 63   - the "B" selec
179a0 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c  t.  */.  addrSel
179b0 65 63 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64  ectB = sqlite3Vd
179c0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
179d0 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20 73 71 6c   + 1;.  j1 = sql
179e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
179f0 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
17a00 6e 65 2c 20 72 65 67 41 64 64 72 42 2c 20 30 2c  ne, regAddrB, 0,
17a10 20 61 64 64 72 53 65 6c 65 63 74 42 29 3b 0a 20   addrSelectB);. 
17a20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
17a30 20 22 72 69 67 68 74 20 53 45 4c 45 43 54 22 29   "right SELECT")
17a40 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d 69 74 20  );.  savedLimit 
17a50 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 73  = p->iLimit;.  s
17a60 61 76 65 64 4f 66 66 73 65 74 20 3d 20 70 2d 3e  avedOffset = p->
17a70 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d 3e 69 4c  iOffset;.  p->iL
17a80 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d 69 74 42  imit = regLimitB
17a90 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d  ;.  p->iOffset =
17aa0 20 30 3b 20 20 0a 20 20 65 78 70 6c 61 69 6e 53   0;  .  explainS
17ab0 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
17ac0 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
17ad0 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c 69 74  lectId);.  sqlit
17ae0 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
17af0 20 70 2c 20 26 64 65 73 74 42 29 3b 0a 20 20 70   p, &destB);.  p
17b00 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61 76 65 64  ->iLimit = saved
17b10 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69 4f 66 66  Limit;.  p->iOff
17b20 73 65 74 20 3d 20 73 61 76 65 64 4f 66 66 73 65  set = savedOffse
17b30 74 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  t;.  sqlite3Vdbe
17b40 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64  AddOp1(v, OP_End
17b50 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64  Coroutine, regAd
17b60 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  drB);..  /* Gene
17b70 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e  rate a subroutin
17b80 65 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74  e that outputs t
17b90 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f  he current row o
17ba0 66 20 74 68 65 20 41 0a 20 20 2a 2a 20 73 65 6c  f the A.  ** sel
17bb0 65 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20  ect as the next 
17bc0 6f 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68  output row of th
17bd0 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  e compound selec
17be0 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f  t..  */.  VdbeNo
17bf0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4f  opComment((v, "O
17c00 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66 6f  utput routine fo
17c10 72 20 41 22 29 29 3b 0a 20 20 61 64 64 72 4f 75  r A"));.  addrOu
17c20 74 41 20 3d 20 67 65 6e 65 72 61 74 65 4f 75 74  tA = generateOut
17c30 70 75 74 53 75 62 72 6f 75 74 69 6e 65 28 70 50  putSubroutine(pP
17c40 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
17c50 20 20 20 20 20 20 20 70 2c 20 26 64 65 73 74 41         p, &destA
17c60 2c 20 70 44 65 73 74 2c 20 72 65 67 4f 75 74 41  , pDest, regOutA
17c70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17c80 20 20 20 72 65 67 50 72 65 76 2c 20 70 4b 65 79     regPrev, pKey
17c90 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a  Dup, labelEnd);.
17ca0 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65    .  /* Generate
17cb0 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
17cc0 61 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63  at outputs the c
17cd0 75 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68  urrent row of th
17ce0 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20  e B.  ** select 
17cf0 61 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70  as the next outp
17d00 75 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f  ut row of the co
17d10 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20  mpound select.. 
17d20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
17d30 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
17d40 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65  NION ){.    Vdbe
17d50 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
17d60 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20  "Output routine 
17d70 66 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64  for B"));.    ad
17d80 64 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74  drOutB = generat
17d90 65 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e  eOutputSubroutin
17da0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
17db0 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64             p, &d
17dc0 65 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67  estB, pDest, reg
17dd0 4f 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20  OutB,.          
17de0 20 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20         regPrev, 
17df0 70 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e  pKeyDup, labelEn
17e00 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
17e10 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b  3KeyInfoUnref(pK
17e20 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a 20 47 65  eyDup);..  /* Ge
17e30 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74  nerate a subrout
17e40 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20  ine to run when 
17e50 74 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d  the results from
17e60 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a 20 61   select A.  ** a
17e70 72 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64  re exhausted and
17e80 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65   only data in se
17e90 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73 2e 0a  lect B remains..
17ea0 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54    */.  if( op==T
17eb0 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d  K_EXCEPT || op==
17ec0 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
17ed0 20 20 20 20 61 64 64 72 45 6f 66 41 5f 6e 6f 42      addrEofA_noB
17ee0 20 3d 20 61 64 64 72 45 6f 66 41 20 3d 20 6c 61   = addrEofA = la
17ef0 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b  belEnd;.  }else{
17f00 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
17f10 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
17f20 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  A subroutine"));
17f30 0a 20 20 20 20 61 64 64 72 45 6f 66 41 20 3d 20  .    addrEofA = 
17f40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17f50 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
17f60 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42  egOutB, addrOutB
17f70 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  );.    addrEofA_
17f80 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  noB = sqlite3Vdb
17f90 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69  eAddOp2(v, OP_Yi
17fa0 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20 6c  eld, regAddrB, l
17fb0 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73 71  abelEnd);.    sq
17fc0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17fd0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
17fe0 64 64 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d  ddrEofA);.    p-
17ff0 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70  >nSelectRow += p
18000 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
18010 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  w;.  }..  /* Gen
18020 65 72 61 74 65 20 61 20 73 75 62 72 6f 75 74 69  erate a subrouti
18030 6e 65 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74  ne to run when t
18040 68 65 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20  he results from 
18050 73 65 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72  select B.  ** ar
18060 65 20 65 78 68 61 75 73 74 65 64 20 61 6e 64 20  e exhausted and 
18070 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c  only data in sel
18080 65 63 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20  ect A remains.. 
18090 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
180a0 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
180b0 20 20 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64    addrEofB = add
180c0 72 45 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70  rEofA;.    if( p
180d0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70  ->nSelectRow > p
180e0 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f  Prior->nSelectRo
180f0 77 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  w ) p->nSelectRo
18100 77 20 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c  w = pPrior->nSel
18110 65 63 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b  ectRow;.  }else{
18120 20 20 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43    .    VdbeNoopC
18130 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d  omment((v, "eof-
18140 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
18150 0a 20 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20  .    addrEofB = 
18160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18170 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
18180 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75 74 41  egOutA, addrOutA
18190 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
181a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
181b0 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
181c0 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20 20 73  labelEnd);.    s
181d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
181e0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
181f0 61 64 64 72 45 6f 66 42 29 3b 0a 20 20 7d 0a 0a  addrEofB);.  }..
18200 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
18210 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
18220 20 63 61 73 65 20 6f 66 20 41 3c 42 0a 20 20 2a   case of A<B.  *
18230 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  /.  VdbeNoopComm
18240 65 6e 74 28 28 76 2c 20 22 41 2d 6c 74 2d 42 20  ent((v, "A-lt-B 
18250 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
18260 20 61 64 64 72 41 6c 74 42 20 3d 20 73 71 6c 69   addrAltB = sqli
18270 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18280 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
18290 74 41 2c 20 61 64 64 72 4f 75 74 41 29 3b 0a 20  tA, addrOutA);. 
182a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
182b0 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
182c0 72 65 67 41 64 64 72 41 2c 20 61 64 64 72 45 6f  regAddrA, addrEo
182d0 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
182e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
182f0 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
18300 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
18310 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
18320 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
18330 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
18340 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
18350 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
18360 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
18370 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
18380 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
18390 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
183a0 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
183b0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
183c0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
183d0 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
183e0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
183f0 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
18400 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18410 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
18420 2c 20 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 20  , addrEofA);.   
18430 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18440 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
18450 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20 20  , labelCmpr);.  
18460 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  }..  /* Generate
18470 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c 65 20   code to handle 
18480 74 68 65 20 63 61 73 65 20 6f 66 20 41 3e 42 0a  the case of A>B.
18490 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
184a0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 67 74  omment((v, "A-gt
184b0 2d 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29  -B subroutine"))
184c0 3b 0a 20 20 61 64 64 72 41 67 74 42 20 3d 20 73  ;.  addrAgtB = s
184d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
184e0 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
184f0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70  op==TK_ALL || op
18500 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20  ==TK_UNION ){.  
18510 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18520 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
18530 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f 75   regOutB, addrOu
18540 74 42 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  tB);.  }.  sqlit
18550 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
18560 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
18570 72 42 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 20  rB, addrEofB);. 
18580 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18590 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
185a0 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20  , labelCmpr);.. 
185b0 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20 72 75   /* This code ru
185c0 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ns once to initi
185d0 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69 6e 67  alize everything
185e0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
185f0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
18600 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  j1);.  sqlite3Vd
18610 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
18620 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41 2c 20  ield, regAddrA, 
18630 61 64 64 72 45 6f 66 41 5f 6e 6f 42 29 3b 0a 20  addrEofA_noB);. 
18640 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18650 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p2(v, OP_Yield, 
18660 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f  regAddrB, addrEo
18670 66 42 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65  fB);..  /* Imple
18680 6d 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65  ment the main me
18690 72 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20  rge loop.  */.  
186a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
186b0 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c  veLabel(v, label
186c0 43 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cmpr);.  sqlite3
186d0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
186e0 5f 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c  _Permutation, 0,
186f0 20 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50   0, 0, (char*)aP
18700 65 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52  ermute, P4_INTAR
18710 52 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  RAY);.  sqlite3V
18720 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18730 43 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69  Compare, destA.i
18740 53 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73  Sdst, destB.iSds
18750 74 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20  t, nOrderBy,.   
18760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18770 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65        (char*)pKe
18780 79 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e  yMerge, P4_KEYIN
18790 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  FO);.  sqlite3Vd
187a0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
187b0 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20  FLAG_PERMUTE);. 
187c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
187d0 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
187e0 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71  ddrAltB, addrAeq
187f0 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a 20  B, addrAgtB);.. 
18800 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
18810 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
18820 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  der to terminate
18830 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
18840 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
18850 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
18860 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53  belEnd);..  /* S
18870 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
18880 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a   output columns.
18890 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
188a0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
188b0 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  put ){.    Selec
188c0 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69  t *pFirst = pPri
188d0 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  or;.    while( p
188e0 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
188f0 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
18900 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e  >pPrior;.    gen
18910 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
18920 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
18930 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st->pEList);.  }
18940 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c  ..  /* Reassembl
18950 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  y the compound q
18960 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  uery so that it 
18970 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f  will be freed co
18980 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  rrectly.  ** by 
18990 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
189a0 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tion */.  if( p-
189b0 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73  >pPrior ){.    s
189c0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
189d0 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
189e0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
189f0 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70  or = pPrior;.  p
18a00 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
18a10 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20  ;..  /*** TBD:  
18a20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e  Insert subroutin
18a30 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65  e calls to close
18a40 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f   cursors on inco
18a50 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75  mplete.  **** su
18a60 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20  bqueries ****/. 
18a70 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
18a80 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
18a90 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30   iSub1, iSub2, 0
18aa0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18ab0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
18ac0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
18ad0 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
18ae0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
18af0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
18b00 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  )./* Forward Dec
18b10 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
18b20 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
18b30 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
18b40 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
18b50 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
18b60 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
18b70 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
18b80 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
18b90 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a  prList *);../*.*
18ba0 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
18bb0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
18bc0 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
18bd0 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
18be0 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
18bf0 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
18c00 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
18c10 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
18c20 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
18c30 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
18c40 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
18c50 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
18c60 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
18c70 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18c80 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
18c90 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
18ca0 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
18cb0 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
18cc0 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
18cd0 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
18ce0 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
18cf0 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
18d00 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
18d10 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
18d20 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
18d30 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
18d40 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
18d50 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
18d60 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
18d70 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
18d80 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
18d90 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
18da0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
18db0 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
18dc0 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
18dd0 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
18de0 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
18df0 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
18e00 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
18e10 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
18e20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52  *db,        /* R
18e30 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
18e40 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e  ors to this conn
18e50 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
18e60 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
18e70 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
18e80 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
18e90 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  curs */.  int iT
18ea0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  able,         /*
18eb0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
18ec0 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
18ed0 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
18ee0 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
18ef0 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29  expressions */.)
18f00 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
18f10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
18f20 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
18f30 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
18f40 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
18f50 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
18f60 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
18f70 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
18f80 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
18f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
18fa0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
18fb0 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
18fc0 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
18fd0 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
18fe0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18ff0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
19000 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
19010 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
19020 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
19030 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
19040 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
19050 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
19060 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
19070 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
19080 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
19090 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  New;.    }.  }el
190a0 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  se{.    pExpr->p
190b0 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
190c0 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
190d0 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
190e0 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
190f0 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70  Right = substExp
19100 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69  r(db, pExpr->pRi
19110 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
19120 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ist);.    if( Ex
19130 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
19140 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
19150 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
19160 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70  tSelect(db, pExp
19170 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54  r->x.pSelect, iT
19180 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
19190 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
191a0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
191b0 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
191c0 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
191d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
191e0 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73  eturn pExpr;.}.s
191f0 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
19200 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69  ExprList(.  sqli
19210 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
19220 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
19230 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
19240 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
19250 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st,     /* List 
19260 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
19270 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
19280 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e  stitutes */.  in
19290 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
192a0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
192b0 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
192c0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
192d0 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
192e0 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
192f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
19300 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
19310 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
19320 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
19330 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  i++){.    pList-
19340 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75  >a[i].pExpr = su
19350 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
19360 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
19370 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
19380 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
19390 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
193a0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
193b0 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
193c0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
193d0 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
193e0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
193f0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19400 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
19410 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
19420 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
19430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
19440 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
19450 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
19460 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
19470 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
19480 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
19490 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
194a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
194b0 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
194c0 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
194d0 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
194e0 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  t(db, p->pEList,
194f0 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
19500 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
19510 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
19520 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
19530 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
19540 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
19550 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
19560 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69  ist);.  p->pHavi
19570 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
19580 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  b, p->pHaving, i
19590 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
195a0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
195b0 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
195c0 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70  Where, iTable, p
195d0 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53  EList);.  substS
195e0 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72  elect(db, p->pPr
195f0 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ior, iTable, pEL
19600 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70  ist);.  pSrc = p
19610 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
19620 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76  ( pSrc );  /* Ev
19630 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31  en for (SELECT 1
19640 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63 21  ) we have: pSrc!
19650 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72  =0 but pSrc->nSr
19660 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c  c==0 */.  if( AL
19670 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20  WAYS(pSrc) ){.  
19680 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
19690 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
196a0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
196b0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
196c0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74  stSelect(db, pIt
196d0 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  em->pSelect, iTa
196e0 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
196f0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
19700 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
19710 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19720 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
19730 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
19740 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
19750 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
19760 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
19770 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
19780 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  VIEW)./*.** This
19790 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
197a0 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  s to flatten sub
197b0 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72  queries as a per
197c0 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a  formance optimiz
197d0 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ation..** This r
197e0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
197f0 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
19800 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
19810 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75   flattening occu
19820 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
19830 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
19840 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
19850 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
19860 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
19870 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
19880 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
19890 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
198a0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
198b0 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
198c0 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
198d0 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
198e0 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
198f0 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
19900 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
19910 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
19920 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
19930 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
19940 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
19950 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
19960 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
19970 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
19980 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
19990 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
199a0 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
199b0 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
199c0 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
199d0 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
199e0 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
199f0 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
19a00 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
19a10 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
19a20 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
19a30 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
19a40 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
19a50 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
19a60 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
19a70 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
19a80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
19a90 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
19aa0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
19ab0 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
19ac0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
19ad0 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69  for this simpifi
19ae0 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
19af0 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
19b00 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
19b10 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
19b20 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
19b30 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
19b40 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
19b50 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
19b60 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
19b70 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
19b80 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
19b90 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
19ba0 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
19bb0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
19bc0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
19bd0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
19be0 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
19bf0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
19c00 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
19c10 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
19c20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
19c30 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
19c40 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f  gregate or the o
19c50 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
19c60 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
19c70 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
19c80 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
19c90 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
19ca0 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
19cb0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69  n.**        (Ori
19cc0 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23  ginally ticket #
19cd0 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e  306.  Strengthen
19ce0 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33  ed by ticket #33
19cf0 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  00).**.**   (4) 
19d00 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
19d10 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a   not DISTINCT..*
19d20 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
19d30 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
19d40 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
19d50 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
19d60 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
19d70 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
19d80 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
19d90 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
19da0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
19db0 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
19dc0 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
19dd0 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
19de0 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
19df0 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
19e00 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  eries..**.**   (
19e10 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
19e20 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
19e30 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
19e40 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
19e50 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
19e60 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
19e70 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
19e80 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
19e90 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
19ea0 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
19eb0 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
19ec0 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
19ed0 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
19ee0 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68  OM close with th
19ef0 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20  e special.**    
19f00 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65      table sqlite
19f10 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69  _once that consi
19f20 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
19f30 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  row containing a
19f40 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c  .**        singl
19f50 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20  e NULL..**.**   
19f60 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
19f70 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
19f80 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
19f90 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
19fa0 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
19fb0 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
19fc0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
19fd0 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
19fe0 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
19ff0 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
1a000 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1a010 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
1a020 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1a030 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
1a040 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1a050 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
1a060 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
1a070 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
1a080 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1a090 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1a0a0 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
1a0b0 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
1a0c0 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69  .**  (**)  Not i
1a0d0 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62  mplemented.  Sub
1a0e0 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72  sumed into restr
1a0f0 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73  iction (3).  Was
1a100 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20   previously.**  
1a110 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65        a separate
1a120 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72   restriction der
1a130 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65  iving from ticke
1a140 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28  t #350..**.**  (
1a150 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
1a160 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
1a170 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1a180 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
1a190 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
1a1a0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1a1b0 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  OFFSET..**.**  (
1a1c0 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  15)  The outer q
1a1d0 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74  uery is not part
1a1e0 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1a1f0 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20  elect or the.** 
1a200 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
1a210 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
1a220 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a  LIMIT clause..**
1a230 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
1a240 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
1a250 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
1a260 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
1a270 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1a280 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1a290 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
1a2a0 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
1a2b0 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
1a2c0 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
1a2d0 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
1a2e0 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
1a2f0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
1a300 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
1a310 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
1a320 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
1a330 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
1a340 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
1a350 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
1a360 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
1a370 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
1a380 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c       compound cl
1a390 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
1a3a0 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
1a3b0 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
1a3c0 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
1a3d0 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
1a3e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1a3f0 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
1a400 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
1a410 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
1a420 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1a430 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1a440 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
1a450 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
1a460 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a  * is not a join.
1a470 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
1a480 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
1a490 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
1a4a0 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
1a4b0 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
1a4c0 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
1a4d0 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
1a4e0 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
1a4f0 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
1a500 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
1a510 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
1a520 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
1a530 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
1a540 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1a550 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
1a560 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
1a570 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
1a580 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
1a590 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1a5a0 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
1a5b0 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
1a5c0 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
1a5d0 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
1a5e0 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
1a5f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
1a600 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
1a610 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
1a620 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
1a630 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
1a640 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
1a650 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
1a660 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
1a670 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
1a680 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
1a690 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
1a6a0 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
1a6b0 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
1a6c0 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
1a6d0 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
1a6e0 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
1a6f0 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
1a700 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
1a710 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
1a720 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1a730 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
1a740 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
1a750 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
1a760 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
1a770 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1a780 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1a790 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
1a7a0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
1a7b0 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f  RDER by clause o
1a7c0 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
1a7d0 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
1a7e0 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
1a7f0 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
1a800 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
1a810 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20  *.**  (19)  The 
1a820 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1a830 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1a840 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1a850 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
1a860 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63    have a WHERE c
1a870 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  lause..**.**  (2
1a880 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  0)  If the sub-q
1a890 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1a8a0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1a8b0 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a  it must not use.
1a8c0 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44  **        an ORD
1a8d0 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ER BY clause.  T
1a8e0 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65  icket #3773.  We
1a8f0 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69   could relax thi
1a900 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  s constraint.** 
1a910 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20         somewhat 
1a920 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74  by saying that t
1a930 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
1a940 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1a950 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61  must.**        a
1a960 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66  ppear as unmodif
1a970 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ied result colum
1a980 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ns in the outer 
1a990 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a  query.  But we.*
1a9a0 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74  *        have ot
1a9b0 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
1a9c0 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61  s in mind to dea
1a9d0 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65  l with that case
1a9e0 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54  ..**.**  (21)  T
1a9f0 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1aa00 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1aa10 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1aa20 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
1aa30 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53     DISTINCT.  (S
1aa40 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31  ee ticket [752e1
1aa50 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  646fc])..**.**  
1aa60 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65  (22)  The subque
1aa70 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  ry is not a recu
1aa80 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rsive CTE..**.**
1aa90 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72 65    (23)  The pare
1aaa0 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  nt is not a recu
1aab0 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68  rsive CTE, or th
1aac0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1aad0 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63  ot a.**        c
1aae0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54  ompound query. T
1aaf0 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
1ab00 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73  is because trans
1ab10 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20  forming the.**  
1ab20 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20        parent to 
1ab30 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
1ab40 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f   confuses the co
1ab50 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a  de that handles.
1ab60 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73  **        recurs
1ab70 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d  ive queries in m
1ab80 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ultiSelect()..**
1ab90 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
1aba0 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
1abb0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
1abc0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
1abd0 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
1abe0 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
1abf0 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
1ac00 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
1ac10 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
1ac20 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
1ac30 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
1ac40 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
1ac50 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1ac60 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
1ac70 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
1ac80 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
1ac90 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
1aca0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
1acb0 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
1acc0 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1acd0 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
1ace0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1acf0 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
1ad00 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1ad10 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
1ad20 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
1ad30 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
1ad40 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
1ad50 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1ad60 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
1ad70 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
1ad80 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
1ad90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1ada0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1adb0 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1adc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
1add0 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
1ade0 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
1adf0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
1ae00 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
1ae10 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
1ae20 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
1ae30 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
1ae40 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
1ae50 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1ae60 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
1ae70 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1ae80 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
1ae90 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
1aea0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1aeb0 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1aec0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1aed0 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
1aee0 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
1aef0 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
1af00 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1af10 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
1af20 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ent;.  Select *p
1af30 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
1af40 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
1af50 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
1af60 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20   Select *pSub1; 
1af70 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1af80 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  to the rightmost
1af90 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71   select in sub-q
1afa0 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1afb0 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
1afc0 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1afd0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1afe0 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1aff0 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
1b000 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1b010 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1b020 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1b030 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
1b040 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1b050 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1b060 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
1b070 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
1b080 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1b090 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
1b0a0 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
1b0b0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1b0c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1b0d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
1b0e0 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b100 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1b110 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1b120 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
1b130 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
1b140 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
1b150 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1b160 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
1b170 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
1b180 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1b190 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
1b1a0 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61  if not..  */.  a
1b1b0 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1b1c0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
1b1d0 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61  or==0 );  /* Una
1b1e0 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63  ble to flatten c
1b1f0 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20  ompound queries 
1b200 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1b210 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
1b220 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  , SQLITE_QueryFl
1b230 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72  attener) ) retur
1b240 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
1b250 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1b260 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
1b270 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
1b280 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
1b290 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
1b2a0 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74  From];.  iParent
1b2b0 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
1b2c0 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70  rsor;.  pSub = p
1b2d0 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1b2e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1b2f0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
1b300 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
1b310 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1b340 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62  1)  */.  if( sub
1b350 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
1b360 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
1b370 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1b380 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1b390 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63  2)  */.  pSubSrc
1b3a0 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
1b3b0 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
1b3c0 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
1b3d0 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
1b3e0 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1b3f0 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
1b400 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
1b410 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
1b420 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f  trary expresssio
1b430 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
1b440 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
1b450 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1b460 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
1b470 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
1b480 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
1b490 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
1b4a0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1b4b0 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
1b4c0 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1b4d0 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
1b4e0 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
1b4f0 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
1b500 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
1b510 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1b520 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
1b530 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1b540 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1b550 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
1b560 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73   if( pSub->pOffs
1b570 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  et ) return 0;  
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b590 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1b5a0 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
1b5b0 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1b5c0 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29  s & SF_Compound)
1b5d0 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  !=0 && pSub->pLi
1b5e0 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
1b5f0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b620 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1b630 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
1b640 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
1b650 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1b680 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
1b690 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1b6a0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
1b6b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1b6c0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1b6d0 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28  on (5)  */.  if(
1b6e0 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1b6f0 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
1b700 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
1b710 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1b720 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1b730 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
1b740 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1b750 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1b760 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72  t)!=0 && subquer
1b770 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72  yIsAgg ){.     r
1b780 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1b790 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1b7a0 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (6)  */.  }.  if
1b7b0 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
1b7c0 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1b7d0 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1b7e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1b810 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
1b820 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
1b830 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
1b840 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b860 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1b870 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
1b880 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1b890 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
1b8a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1b8b0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1b8c0 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
1b8d0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
1b8e0 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1b8f0 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
1b900 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1b910 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1b920 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
1b930 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1b940 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1b950 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b  sive ) return 0;
1b960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1b970 74 72 69 63 74 69 6f 6e 20 28 32 32 29 20 20 2a  triction (22)  *
1b980 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
1b990 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
1b9a0 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50  ive) && pSub->pP
1b9b0 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
1b9c0 20 20 20 20 20 20 20 2f 2a 20 28 32 33 29 20 20         /* (23)  
1b9d0 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54  */..  /* OBSOLET
1b9e0 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a  E COMMENT 1:.  *
1b9f0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
1ba00 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1ba10 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
1ba20 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
1ba30 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
1ba40 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
1ba50 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
1ba60 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
1ba70 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
1ba80 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
1ba90 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1baa0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1bab0 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
1bac0 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
1bad0 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1bae0 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1baf0 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1bb00 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1bb10 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1bb20 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
1bb30 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
1bb40 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
1bb50 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
1bb60 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   ** OBSOLETE COM
1bb70 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73  MENT 2:.  ** Res
1bb80 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
1bb90 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1bba0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1bbb0 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
1bbc0 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
1bbd0 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1bbe0 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
1bbf0 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
1bc00 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
1bc10 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
1bc20 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1bc30 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1bc40 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
1bc50 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
1bc60 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
1bc70 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1bc80 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1bc90 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1bca0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1bcb0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1bcc0 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
1bcd0 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
1bce0 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
1bcf0 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
1bd00 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
1bd10 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
1bd20 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
1bd30 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
1bd40 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
1bd50 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20  NER JOIN..  **. 
1bd60 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44   ** THIS OVERRID
1bd70 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ES OBSOLETE COMM
1bd80 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f  ENTS 1 AND 2 ABO
1bd90 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20  VE:.  ** Ticket 
1bda0 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74  #3300 shows that
1bdb0 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1bdc0 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
1bdd0 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69  LEFT JOIN.  ** i
1bde0 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64  s fraught with d
1bdf0 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20  anger.  Best to 
1be00 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20  avoid the whole 
1be10 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20  thing.  If the. 
1be20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
1be30 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1be40 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
1be50 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
1be60 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  en..  */.  if( (
1be70 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
1be80 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1be90 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1bea0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
1beb0 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20  triction 17: If 
1bec0 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1bed0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1bee0 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
1bef0 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
1bf00 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
1bf10 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
1bf20 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
1bf30 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
1bf40 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
1bf50 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
1bf60 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
1bf70 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
1bf80 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
1bf90 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
1bfa0 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
1bfb0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
1bfc0 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1bfd0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1bfe0 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30  * Restriction 20
1bff0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
1c000 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
1c010 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1c020 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
1c030 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
1c040 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c050 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
1c060 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
1c070 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
1c080 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
1c090 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1c0a0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1c0b0 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1c0c0 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
1c0d0 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c0e0 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
1c0f0 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1c100 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1c110 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
1c120 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1c130 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
1c140 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
1c150 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1c160 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1c170 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
1c180 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1c190 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1c1a0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
1c1b0 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
1c1c0 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
1c1d0 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c      || pSub->pEL
1c1e0 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62  ist->nExpr!=pSub
1c1f0 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1->pEList->nExpr
1c200 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1c210 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1c220 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
1c230 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d  se( pSub1->pSrc-
1c240 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d  >nSrc>1 );.    }
1c250 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63  ..    /* Restric
1c260 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20  tion 18. */.    
1c270 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1c280 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
1c290 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
1c2a0 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d   ii<p->pOrderBy-
1c2b0 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
1c2c0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
1c2d0 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e  rderBy->a[ii].u.
1c2e0 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
1c2f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1c300 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1c310 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
1c320 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1c330 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1c340 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
1c350 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
1c360 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1c370 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1c380 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1c390 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
1c3a0 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
1c3b0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1c3c0 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1c3d0 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
1c3e0 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
1c3f0 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
1c400 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1c410 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
1c420 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
1c430 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1c440 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1c450 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1c460 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
1c470 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
1c480 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
1c490 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1c4a0 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
1c4b0 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
1c4c0 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1c4d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1c4e0 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1c4f0 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1c500 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1c510 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1c520 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1c530 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1c540 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1c550 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1c560 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
1c570 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
1c580 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
1c590 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
1c5a0 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
1c5b0 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
1c5c0 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
1c5d0 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
1c5e0 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
1c5f0 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
1c600 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1c610 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
1c620 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
1c630 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
1c640 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
1c650 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
1c660 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
1c670 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1c680 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1c690 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
1c6a0 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
1c6b0 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
1c6c0 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1c6d0 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1c6e0 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
1c6f0 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1c700 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1c710 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
1c720 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
1c730 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
1c740 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
1c750 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
1c760 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
1c770 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1c780 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
1c790 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
1c7a0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1c7b0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
1c7c0 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1c7d0 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
1c7e0 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1c7f0 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1c800 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
1c810 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
1c820 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
1c830 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1c840 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
1c850 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
1c860 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1c870 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
1c880 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1c890 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
1c8a0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1c8b0 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1c8c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1c8d0 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1c8e0 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
1c8f0 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
1c900 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
1c910 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
1c920 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
1c930 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1c940 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1c950 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
1c960 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
1c970 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
1c980 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1c990 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1c9a0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1c9b0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1c9c0 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
1c9d0 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1c9e0 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
1c9f0 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1ca00 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1ca10 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
1ca20 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1ca30 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
1ca40 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1ca50 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  {.      p->pPrio
1ca60 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1ca70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
1ca80 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
1ca90 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  or;.      if( pP
1caa0 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
1cab0 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Next = pNew;.   
1cac0 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
1cad0 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   p;.      p->pPr
1cae0 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
1caf0 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1cb00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1cb10 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
1cb20 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
1cb30 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
1cb40 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1cb50 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
1cb60 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cb70 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
1cb80 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
1cb90 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
1cba0 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
1cbb0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1cbc0 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
1cbd0 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1cbe0 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
1cbf0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1cc00 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1cc10 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1cc20 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1cc30 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1cc40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1cc50 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1cc60 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1cc70 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1cc80 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1cc90 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1cca0 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1ccb0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1ccc0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1ccd0 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1cce0 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1ccf0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1cd00 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1cd10 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1cd20 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1cd30 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1cd40 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1cd50 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1cd60 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1cd70 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1cd80 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1cd90 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1cda0 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1cdb0 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1cdc0 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1cdd0 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1cde0 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1cdf0 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1ce00 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1ce10 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1ce20 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1ce30 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1ce40 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1ce50 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1ce60 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1ce70 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1ce80 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1ce90 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1cea0 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1ceb0 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1cec0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1ced0 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1cee0 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1cef0 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1cf00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cf10 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1cf20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1cf30 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1cf40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1cf50 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1cf60 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1cf70 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1cf80 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1cf90 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1cfa0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1cfb0 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1cfc0 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1cfd0 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1cfe0 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1cff0 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1d000 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1d010 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1d020 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1d030 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1d040 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1d050 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1d060 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1d070 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1d080 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1d090 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1d0a0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1d0b0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1d0c0 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1d0d0 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1d0e0 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1d0f0 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1d100 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1d110 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1d120 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1d130 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1d140 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1d150 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1d160 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1d170 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1d180 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1d190 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1d1a0 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1d1b0 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1d1c0 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1d1d0 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1d1e0 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1d1f0 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1d200 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1d210 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1d220 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1d230 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1d240 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1d250 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1d260 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1d270 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1d280 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1d290 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1d2a0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1d2b0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1d2c0 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1d2d0 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1d2e0 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1d2f0 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1d300 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1d310 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1d320 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1d330 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1d340 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1d350 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1d360 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1d370 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1d380 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1d390 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1d3a0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1d3b0 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1d3c0 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1d3d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1d3e0 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1d3f0 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1d400 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1d410 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1d420 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1d430 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1d440 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1d450 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1d460 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1d470 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1d480 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1d490 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1d4a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d4b0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d4c0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1d4d0 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1d4e0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1d4f0 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1d500 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1d510 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1d520 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1d530 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1d540 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1d550 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1d560 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d570 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1d580 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1d590 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1d5a0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1d5b0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1d5c0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1d5d0 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1d5e0 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1d5f0 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1d600 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1d610 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1d620 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1d630 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1d640 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1d650 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1d660 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1d670 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1d680 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1d690 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1d6a0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1d6b0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1d6c0 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1d6d0 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
1d6e0 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
1d6f0 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
1d700 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
1d710 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
1d720 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
1d730 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
1d740 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
1d750 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1d760 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1d770 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
1d780 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
1d790 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1d7a0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1d7b0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1d7c0 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
1d7d0 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
1d7e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1d7f0 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
1d800 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1d810 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
1d820 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
1d830 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
1d840 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1d850 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1d860 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
1d870 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1d880 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1d890 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1d8a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
1d8b0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
1d8c0 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
1d8d0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1d8e0 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1d8f0 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1d900 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1d910 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1d920 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1d930 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1d940 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1d950 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1d960 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1d970 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1d980 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1d990 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1d9a0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1d9b0 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1d9c0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1d9d0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1d9e0 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1d9f0 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1da00 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1da10 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1da20 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
1da30 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
1da40 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
1da50 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1da60 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
1da70 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
1da80 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
1da90 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
1daa0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1dab0 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1dac0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1dad0 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
1dae0 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
1daf0 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1db00 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
1db10 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
1db20 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
1db30 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1db40 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1db50 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1db60 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1db70 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1db80 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1db90 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1dba0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1dbb0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1dbc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1dbd0 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
1dbe0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
1dbf0 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1dc00 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
1dc10 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1dc20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1dc30 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
1dc40 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
1dc50 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
1dc60 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
1dc70 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
1dc80 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1dc90 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
1dca0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1dcb0 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
1dcc0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1dcd0 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1dce0 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
1dcf0 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1dd00 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1dd10 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1dd20 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1dd30 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1dd40 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1dd50 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1dd60 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
1dd70 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rBy ){.      ass
1dd80 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
1dd90 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
1dda0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
1ddb0 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
1ddc0 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
1ddd0 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
1dde0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1ddf0 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1de00 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1de10 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1de20 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
1de30 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1de40 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1de50 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
1de60 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
1de70 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
1de80 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
1de90 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
1dea0 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
1deb0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1dec0 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
1ded0 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
1dee0 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
1def0 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
1df00 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1df10 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
1df20 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1df30 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
1df40 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1df50 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1df60 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1df70 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1df80 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1df90 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1dfa0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
1dfb0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1dfc0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1dfd0 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e000 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1e010 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
1e020 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1e030 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
1e040 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1e050 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1e060 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1e070 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
1e080 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
1e090 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
1e0a0 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1e0b0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1e0c0 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
1e0d0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1e0e0 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1e0f0 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1e100 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1e110 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
1e120 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
1e130 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
1e140 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
1e150 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
1e160 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
1e170 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1e180 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1e190 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
1e1a0 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
1e1b0 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
1e1c0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
1e1d0 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
1e1e0 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
1e1f0 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
1e200 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
1e210 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
1e220 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1e230 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
1e240 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
1e250 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
1e260 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
1e270 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
1e280 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
1e290 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
1e2a0 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
1e2b0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
1e2c0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
1e2d0 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
1e2e0 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
1e2f0 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
1e300 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1e310 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
1e320 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
1e330 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
1e340 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
1e350 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
1e360 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1e370 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
1e380 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
1e390 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1e3a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1e3b0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1e3c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1e3d0 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
1e3e0 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
1e3f0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1e400 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1e410 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
1e420 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
1e430 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
1e440 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
1e450 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1e460 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
1e470 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
1e480 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
1e490 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1e4a0 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
1e4b0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1e4c0 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
1e4d0 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
1e4e0 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
1e4f0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
1e500 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1e510 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
1e520 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
1e530 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
1e540 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
1e550 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
1e560 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
1e570 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
1e580 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
1e590 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
1e5a0 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
1e5b0 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
1e5c0 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
1e5d0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
1e5e0 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
1e5f0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1e600 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
1e610 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
1e620 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
1e630 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
1e640 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
1e650 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
1e660 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1e670 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
1e680 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
1e690 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
1e6a0 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
1e6b0 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1e6c0 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
1e6d0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1e6e0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
1e6f0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
1e700 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
1e710 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
1e720 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
1e730 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
1e740 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
1e750 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
1e760 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1e770 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1e780 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
1e790 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
1e7a0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
1e7b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
1e7c0 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
1e7d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
1e7e0 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
1e7f0 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
1e800 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1e810 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
1e820 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1e830 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
1e840 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1e850 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1e860 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
1e870 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
1e880 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
1e890 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
1e8a0 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
1e8b0 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
1e8c0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1e8d0 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
1e8e0 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
1e8f0 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
1e900 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
1e910 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
1e920 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
1e930 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
1e940 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
1e950 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
1e960 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
1e970 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
1e980 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
1e990 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
1e9a0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1e9b0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1e9c0 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
1e9d0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1e9e0 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  rgment is the as
1e9f0 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
1ea00 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
1ea10 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
1ea20 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
1ea30 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
1ea40 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
1ea50 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1ea60 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
1ea70 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
1ea80 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
1ea90 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
1eaa0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
1eab0 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
1eac0 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
1ead0 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
1eae0 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
1eaf0 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
1eb00 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
1eb10 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1eb20 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
1eb30 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
1eb40 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
1eb50 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
1eb60 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1eb70 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
1eb80 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
1eb90 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
1eba0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
1ebb0 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
1ebc0 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
1ebd0 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
1ebe0 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
1ebf0 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
1ec00 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
1ec10 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
1ec20 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
1ec30 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
1ec40 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
1ec50 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
1ec60 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
1ec70 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
1ec80 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
1ec90 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
1eca0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1ecb0 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
1ecc0 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
1ecd0 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
1ece0 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
1ecf0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
1ed00 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
1ed10 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
1ed20 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
1ed30 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
1ed40 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1ed50 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1ed60 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
1ed70 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
1ed80 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
1ed90 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
1eda0 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
1edb0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
1edc0 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
1edd0 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
1ede0 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1edf0 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
1ee00 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
1ee10 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
1ee20 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
1ee30 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
1ee40 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
1ee50 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
1ee60 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
1ee70 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
1ee80 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
1ee90 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
1eea0 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
1eeb0 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
1eec0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
1eed0 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
1eee0 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
1eef0 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
1ef00 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
1ef10 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
1ef20 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a  pTab && pFrom->z
1ef30 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62  Index ){.    Tab
1ef40 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
1ef50 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
1ef60 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d   *zIndex = pFrom
1ef70 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e  ->zIndex;.    In
1ef80 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
1ef90 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
1efa0 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70  ndex; .        p
1efb0 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74  Idx && sqlite3St
1efc0 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d  rICmp(pIdx->zNam
1efd0 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20  e, zIndex); .   
1efe0 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
1eff0 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
1f000 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
1f010 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1f020 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1f030 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
1f040 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20   zIndex, 0);.   
1f050 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
1f060 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
1f070 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f080 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
1f090 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d   pFrom->pIndex =
1f0a0 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
1f0b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f0c0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f  ./*.** Detect co
1f0d0 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1f0e0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
1f0f0 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
1f100 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e  ause with .** an
1f110 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
1f120 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
1f130 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
1f140 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
1f150 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
1f160 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
1f170 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
1f180 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72  *.** These are r
1f190 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75  ewritten as a su
1f1a0 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  bquery:.**.**   
1f1b0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
1f1c0 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1f1d0 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
1f1e0 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   ... FROM t2).**
1f1f0 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e       ORDER BY ..
1f200 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
1f210 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
1f220 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  rmation is neces
1f230 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65  sary because the
1f240 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
1f250 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  rBy() routine.**
1f260 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65   above that gene
1f270 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
1f280 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  or a compound SE
1f290 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  LECT with an ORD
1f2a0 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  ER BY clause.** 
1f2b0 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67  uses a merge alg
1f2c0 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75  orithm that requ
1f2d0 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  ires the same co
1f2e0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1f2f0 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   on the.** resul
1f300 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20  t columns as on 
1f310 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1f320 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74  use.  See ticket
1f330 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  .** http://www.s
1f340 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
1f350 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a  fo/6709574d2a.**
1f360 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
1f370 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  rmation is only 
1f380 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50  needed for EXCEP
1f390 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e  T, INTERSECT, an
1f3a0 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20  d UNION..** The 
1f3b0 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
1f3c0 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69  or works fine wi
1f3d0 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  th multiSelectOr
1f3e0 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65  derBy() even whe
1f3f0 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43  n.** there are C
1f400 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20  OLLATE terms in 
1f410 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f  the ORDER BY..*/
1f420 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76  .static int conv
1f430 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
1f440 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b  tToSubquery(Walk
1f450 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
1f460 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
1f470 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  ;.  Select *pNew
1f480 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a  ;.  Select *pX;.
1f490 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1f4a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1f4b0 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c  _item *a;.  SrcL
1f4c0 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20  ist *pNewSrc;.  
1f4d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
1f4e0 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20   Token dummy;.. 
1f4f0 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
1f500 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
1f510 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70  ontinue;.  if( p
1f520 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
1f530 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1f540 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b  nue;.  for(pX=p;
1f550 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d   pX && (pX->op==
1f560 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70  TK_ALL || pX->op
1f570 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58  ==TK_SELECT); pX
1f580 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20  =pX->pPrior){}. 
1f590 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74   if( pX==0 ) ret
1f5a0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1f5b0 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65  ;.  a = p->pOrde
1f5c0 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  rBy->a;.  for(i=
1f5d0 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1f5e0 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  pr-1; i>=0; i--)
1f5f0 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70  {.    if( a[i].p
1f600 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1f610 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b  _Collate ) break
1f620 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20  ;.  }.  if( i<0 
1f630 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
1f640 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  tinue;..  /* If 
1f650 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1f660 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
1f670 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
1f680 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  on is required. 
1f690 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
1f6a0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
1f6b0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1f6c0 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
1f6d0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1f6e0 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
1f6f0 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
1f700 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1f710 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28  Abort;.  memset(
1f720 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f  &dummy, 0, sizeo
1f730 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65  f(dummy));.  pNe
1f740 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  wSrc = sqlite3Sr
1f750 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
1f760 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
1f770 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30  ,&dummy,pNew,0,0
1f780 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63  );.  if( pNewSrc
1f790 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1f7a0 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20  _Abort;.  *pNew 
1f7b0 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20  = *p;.  p->pSrc 
1f7c0 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e  = pNewSrc;.  p->
1f7d0 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
1f7e0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1f7f0 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
1f800 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c  3Expr(db, TK_ALL
1f810 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
1f820 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
1f830 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
1f840 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
1f850 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
1f860 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
1f870 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1f880 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
1f890 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
1f8a0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
1f8b0 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
1f8c0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50  assert( pNew->pP
1f8d0 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65  rior!=0 );.  pNe
1f8e0 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  w->pPrior->pNext
1f8f0 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d   = pNew;.  pNew-
1f900 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
1f910 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30  New->pOffset = 0
1f920 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
1f930 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e  ontinue;.}..#ifn
1f940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f950 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
1f960 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
1f970 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
1f980 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
1f990 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
1f9a0 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
1f9b0 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
1f9c0 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
1f9d0 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
1f9e0 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
1f9f0 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
1fa00 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
1fa10 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
1fa20 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
1fa30 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
1fa40 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
1fa50 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
1fa60 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
1fa70 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
1fa80 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
1fa90 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
1faa0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73  e is returned, s
1fab0 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f  et *ppContext to
1fac0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69   point to the Wi
1fad0 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  th.** object tha
1fae0 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43  t the returned C
1faf0 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a  TE belongs to..*
1fb00 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
1fb10 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
1fb20 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 75     /* Current ou
1fb50 74 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  termost WITH cla
1fb60 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1fb70 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1fb80 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d  tem,     /* FROM
1fb90 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
1fba0 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
1fbb0 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74  With **ppContext
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbd0 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61  /* OUT: WITH cla
1fbe0 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  use return value
1fbf0 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29   belongs to */.)
1fc00 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1fc10 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74  zName;.  if( pIt
1fc20 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
1fc30 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74   && (zName = pIt
1fc40 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  em->zName)!=0 ){
1fc50 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20  .    With *p;.  
1fc60 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70    for(p=pWith; p
1fc70 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a  ; p=p->pOuter){.
1fc80 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1fc90 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
1fca0 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
1fcb0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1fcc0 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
1fcd0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
1fce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
1fcf0 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20  pContext = p;.  
1fd00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26          return &
1fd10 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  p->a[i];.       
1fd20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1fd30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1fd40 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20  .}../* The code 
1fd50 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61  generator mainta
1fd60 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61  ins a stack of a
1fd70 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73  ctive WITH claus
1fd80 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  es.** with the i
1fd90 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63  nner-most WITH c
1fda0 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74  lause being at t
1fdb0 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
1fdc0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
1fdd0 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74  routine pushes t
1fde0 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70  he WITH clause p
1fdf0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1fe00 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
1fe10 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  onto the top of 
1fe20 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72  the stack. If ar
1fe30 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20  gument bFree is 
1fe40 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  true, then this.
1fe50 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77  ** WITH clause w
1fe60 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70  ill never be pop
1fe70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
1fe80 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
1fe90 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65   it.** should be
1fea0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
1feb0 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  h the Parse obje
1fec0 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73  ct. In other cas
1fed0 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65  es, when.** bFre
1fee0 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f  e==0, the With o
1fef0 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72  bject will be fr
1ff00 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
1ff10 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
1ff20 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69  atement with whi
1ff30 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61  ch it is associa
1ff40 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
1ff50 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72  ite3WithPush(Par
1ff60 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68  se *pParse, With
1ff70 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65   *pWith, u8 bFre
1ff80 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46  e){.  assert( bF
1ff90 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ree==0 || pParse
1ffa0 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20  ->pWith==0 );.  
1ffb0 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
1ffc0 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d   pWith->pOuter =
1ffd0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
1ffe0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
1fff0 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 70  h = pWith;.    p
20000 50 61 72 73 65 2d 3e 62 46 72 65 65 57 69 74 68  Parse->bFreeWith
20010 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a   = bFree;.  }.}.
20020 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
20030 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61  tion checks if a
20040 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65  rgument pFrom re
20050 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64 65  fers to a CTE de
20060 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20  clared by .** a 
20070 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74  WITH clause on t
20080 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74  he stack current
20090 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79  ly maintained by
200a0 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64   the parser. And
200b0 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c  ,.** if currentl
200c0 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43  y processing a C
200d0 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69  TE expression, i
200e0 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72 73  f it is a recurs
200f0 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ive.** reference
20100 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
20110 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  CTE..**.** If pF
20120 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65  rom falls into e
20130 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  ither of the two
20140 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76   categories abov
20150 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a  e, pFrom->pTab.*
20160 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
20170 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64  ds are populated
20180 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68   accordingly. Th
20190 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
201a0 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d  check.** (pFrom-
201b0 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74  >pTab!=0) to det
201c0 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
201d0 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66  r not a successf
201e0 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20  ul match.** was 
201f0 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  found..**.** Whe
20200 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61  ther or not a ma
20210 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51  tch is found, SQ
20220 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
20230 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a  ned if no error.
20240 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  ** occurs. If an
20250 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
20260 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  r, an error mess
20270 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
20280 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61   the.** parser a
20290 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f  nd some error co
202a0 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  de other than SQ
202b0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
202c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
202d0 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61  withExpand(.  Wa
202e0 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a  lker *pWalker, .
202f0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20300 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a  _item *pFrom.){.
20310 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
20320 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
20330 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
20340 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
20350 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74   struct Cte *pCt
20360 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
20370 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20   /* Matched CTE 
20380 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d  (or NULL if no m
20390 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20  atch) */.  With 
203a0 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20 20  *pWith;         
203b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49             /* WI
203c0 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20 70  TH clause that p
203d0 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  Cte belongs to *
203e0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72  /..  assert( pFr
203f0 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a  om->pTab==0 );..
20400 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68 57    pCte = searchW
20410 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74  ith(pParse->pWit
20420 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68  h, pFrom, &pWith
20430 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b  );.  if( pCte ){
20440 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
20450 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
20460 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65  pEList;.    Sele
20470 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65  ct *pSel;.    Se
20480 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20  lect *pLeft;    
20490 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
204a0 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  eft-most SELECT 
204b0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
204c0 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69   int bMayRecursi
204d0 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ve;            /
204e0 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75  * True if compou
204f0 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49  nd joined by UNI
20500 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20  ON [ALL] */.    
20510 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74 68  With *pSavedWith
20520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20530 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
20540 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20  f pParse->pWith 
20550 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43  */..    /* If pC
20560 74 65 2d 3e 7a 45 72 72 20 69 73 20 6e 6f 6e 2d  te->zErr is non-
20570 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
20580 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
20590 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
205a0 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
205b0 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
205c0 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
205d0 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
205e0 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
205f0 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
20600 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Err is NULL, the
20610 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  n this is not a 
20620 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
20630 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  nce..    ** In t
20640 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65  his case, procee
20650 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
20660 43 74 65 2d 3e 7a 45 72 72 20 29 7b 0a 20 20 20  Cte->zErr ){.   
20670 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20680 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d  sg(pParse, pCte-
20690 3e 7a 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61  >zErr, pCte->zNa
206a0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
206b0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
206c0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
206d0 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
206e0 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 );.    pFrom->
206f0 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
20700 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
20710 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
20720 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  le));.    if( pT
20730 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
20740 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54  RC_Abort;.    pT
20750 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
20760 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
20770 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
20780 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  db, pCte->zName)
20790 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  ;.    pTab->iPKe
207a0 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62  y = -1;.    pTab
207b0 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38  ->nRowEst = 1048
207c0 35 37 36 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  576;.    pTab->t
207d0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
207e0 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70 46 72  hemeral;.    pFr
207f0 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
20800 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
20810 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
20820 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
20830 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20850 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73 65 72 74  OMEM;.    assert
20860 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
20870 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
20880 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
20890 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f  ecursive CTE. */
208a0 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f  .    pSel = pFro
208b0 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
208c0 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20  bMayRecursive = 
208d0 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41  ( pSel->op==TK_A
208e0 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d  LL || pSel->op==
208f0 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
20900 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
20910 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
20920 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  ;.      SrcList 
20930 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSrc = pFrom->p
20940 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
20950 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20960 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
20970 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
20980 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
20990 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
209a0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
209b0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
209c0 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
209d0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
209e0 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
209f0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
20a00 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74  Item->zName, pCt
20a10 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20  e->zName).      
20a20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
20a30 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70   pItem->pTab = p
20a40 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
20a50 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76  Item->isRecursiv
20a60 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
20a70 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20   pTab->nRef++;. 
20a80 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73           pSel->s
20a90 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
20aa0 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20  cursive;.       
20ab0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
20ac0 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  ..    /* Only on
20ad0 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
20ae0 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74  rence is permitt
20af0 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20  ed. */ .    if( 
20b00 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a  pTab->nRef>2 ){.
20b10 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
20b20 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20  orMsg(.         
20b30 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70   pParse, "multip
20b40 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
20b50 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
20b60 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61  : %s", pCte->zNa
20b70 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
20b80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20b90 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
20ba0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
20bb0 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c  Ref==1 || ((pSel
20bc0 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65  ->selFlags&SF_Re
20bd0 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61 62  cursive) && pTab
20be0 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20  ->nRef==2 ));.. 
20bf0 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20     pCte->zErr = 
20c00 22 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65  "circular refere
20c10 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53  nce: %s";.    pS
20c20 61 76 65 64 57 69 74 68 20 3d 20 70 50 61 72 73  avedWith = pPars
20c30 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50  e->pWith;.    pP
20c40 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
20c50 69 74 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ith;.    sqlite3
20c60 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
20c70 65 72 2c 20 62 4d 61 79 52 65 63 75 72 73 69 76  er, bMayRecursiv
20c80 65 20 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  e ? pSel->pPrior
20c90 20 3a 20 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66   : pSel);..    f
20ca0 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70  or(pLeft=pSel; p
20cb0 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c  Left->pPrior; pL
20cc0 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f  eft=pLeft->pPrio
20cd0 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  r);.    pEList =
20ce0 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a   pLeft->pEList;.
20cf0 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43      if( pCte->pC
20d00 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ols ){.      if(
20d10 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
20d20 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
20d30 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
20d40 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
20d50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
20d60 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f  has %d values fo
20d70 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20  r %d columns",. 
20d80 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d             pCte-
20d90 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e  >zName, pEList->
20da0 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f  nExpr, pCte->pCo
20db0 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  ls->nExpr.      
20dc0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61    );.        pPa
20dd0 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
20de0 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20  vedWith;.       
20df0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
20e00 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
20e10 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74      pEList = pCt
20e20 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a  e->pCols;.    }.
20e30 0a 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  .    selectColum
20e40 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
20e50 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26  Parse, pEList, &
20e60 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
20e70 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b->aCol);.    if
20e80 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
20e90 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  ){.      if( pSe
20ea0 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  l->selFlags & SF
20eb0 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
20ec0 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72        pCte->zErr
20ed0 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63   = "multiple rec
20ee0 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
20ef0 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65  s: %s";.      }e
20f00 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
20f10 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65 63 75 72  e->zErr = "recur
20f20 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
20f30 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
20f40 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
20f50 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
20f60 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
20f70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
20f80 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  e->zErr = 0;.   
20f90 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
20fa0 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d   pSavedWith;.  }
20fb0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
20fc0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
20fd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20fe0 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66  MIT_CTE./*.** If
20ff0 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73 73   the SELECT pass
21000 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
21010 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e   argument has an
21020 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54 48   associated WITH
21030 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70   .** clause, pop
21040 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61   it from the sta
21050 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  ck stored as par
21060 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f  t of the Parse o
21070 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bject..**.** Thi
21080 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
21090 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65 63  ed as the xSelec
210a0 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c  tCallback2() cal
210b0 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69  lback by.** sqli
210c0 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
210d0 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61  ) when walking a
210e0 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20   SELECT tree to 
210f0 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a  resolve table.**
21100 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72   names and other
21110 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
21120 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  ments. .*/.stati
21130 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70  c void selectPop
21140 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61  With(Walker *pWa
21150 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
21160 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
21170 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
21180 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70 57 69  rse;.  With *pWi
21190 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f  th = findRightmo
211a0 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20  st(p)->pWith;.  
211b0 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
211c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
211d0 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68  se->pWith==pWith
211e0 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
211f0 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70  pWith = pWith->p
21200 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  Outer;.  }.}.#el
21210 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
21220 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
21230 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
21240 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
21250 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
21260 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
21270 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
21280 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
21290 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
212a0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
212b0 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
212c0 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
212d0 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
212e0 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
212f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
21300 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
21310 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
21320 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
21330 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
21340 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
21350 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
21360 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
21370 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
21380 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
21390 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
213a0 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
213b0 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
213c0 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
213d0 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
213e0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
213f0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
21400 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
21410 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
21420 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
21430 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
21440 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
21450 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
21460 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
21470 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
21480 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
21490 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
214a0 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
214b0 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
214c0 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
214d0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
214e0 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
214f0 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
21500 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
21510 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
21520 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
21530 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
21540 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
21550 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
21560 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
21570 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
21580 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
21590 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
215a0 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
215b0 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
215c0 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
215d0 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
215e0 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
215f0 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
21600 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
21610 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
21620 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
21630 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
21640 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
21650 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
21660 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
21670 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
21680 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
21690 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
216a0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
216b0 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
216c0 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
216d0 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
216e0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
216f0 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
21700 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
21710 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
21720 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
21730 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
21740 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
21750 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67   Expr *pE, *pRig
21760 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31  ht, *pExpr;.  u1
21770 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  6 selFlags = p->
21780 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e  selFlags;..  p->
21790 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
217a0 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64  xpanded;.  if( d
217b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
217c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
217d0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
217e0 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72  if( NEVER(p->pSr
217f0 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61  c==0) || (selFla
21800 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
21810 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
21820 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
21830 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
21840 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
21850 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
21860 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
21870 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67 68  pParse, findRigh
21880 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 2c  tmost(p)->pWith,
21890 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20   0);..  /* Make 
218a0 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
218b0 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
218c0 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
218d0 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
218e0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
218f0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
21900 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
21910 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
21920 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
21930 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
21940 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
21950 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
21960 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
21970 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
21980 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
21990 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
219a0 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
219b0 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
219c0 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
219d0 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
219e0 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
219f0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
21a00 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
21a10 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
21a20 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
21a30 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
21a40 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
21a50 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
21a60 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73  le *pTab;.    as
21a70 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 52  sert( pFrom->isR
21a80 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70  ecursive==0 || p
21a90 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20 20  From->pTab );.  
21aa0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 52    if( pFrom->isR
21ab0 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69  ecursive ) conti
21ac0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46 72  nue;.    if( pFr
21ad0 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
21ae0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
21af0 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
21b00 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
21b10 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
21b20 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
21b30 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
21b40 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
21b50 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
21b60 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
21b70 20 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68     selectPopWith
21b80 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23 65  (pWalker, p);.#e
21b90 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
21ba0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
21bb0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
21bc0 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69  E_OMIT_CTE.    i
21bd0 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57  f( withExpand(pW
21be0 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20  alker, pFrom) ) 
21bf0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
21c00 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
21c10 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a  >pTab ) {} else.
21c20 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
21c30 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
21c40 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
21c50 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
21c60 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
21c70 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
21c80 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
21c90 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
21ca0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
21cb0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
21cc0 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
21cd0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
21ce0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
21cf0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
21d00 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
21d10 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
21d20 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
21d30 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
21d40 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
21d50 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
21d60 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
21d70 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
21d80 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
21d90 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
21da0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
21db0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
21dc0 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22  , "sqlite_sq_%p"
21dd0 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
21de0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
21df0 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
21e00 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
21e10 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74  ; }.      select
21e20 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
21e30 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
21e40 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
21e50 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
21e60 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
21e70 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
21e80 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74     pTab->nRowEst
21e90 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 20 20   = 1048576;.    
21ea0 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
21eb0 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
21ec0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
21ed0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
21ee0 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
21ef0 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
21f00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
21f10 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
21f20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
21f30 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
21f40 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
21f50 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
21f60 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70  tem(pParse, 0, p
21f70 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  From);.      if(
21f80 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
21f90 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
21fa0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65     if( pTab->nRe
21fb0 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20  f==0xffff ){.   
21fc0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
21fd0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
21fe0 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65  o many reference
21ff0 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78  s to \"%s\": max
22000 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20   65535",.       
22010 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
22020 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
22030 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  >pTab = 0;.     
22040 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
22050 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
22060 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
22070 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
22080 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
22090 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
220a0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
220b0 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
220c0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c   pTab->pSelect |
220d0 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  | IsVirtual(pTab
220e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
220f0 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66  We reach here if
22100 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
22110 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76   is a really a v
22120 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  iew */.        i
22130 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
22140 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
22150 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
22160 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
22170 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22180 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
22190 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
221a0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
221b0 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
221c0 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
221d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
221e0 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
221f0 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
22200 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
22210 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
22220 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
22230 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
22240 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
22250 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
22260 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
22270 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
22280 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
22290 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
222a0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
222b0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
222c0 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
222d0 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
222e0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
222f0 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
22300 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
22310 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
22320 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
22330 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
22340 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
22350 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
22360 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
22370 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
22380 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
22390 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
223a0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
223b0 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
223c0 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
223d0 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
223e0 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
223f0 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
22400 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
22410 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
22420 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
22430 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
22440 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
22450 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
22460 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
22470 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
22480 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
22490 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
224a0 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
224b0 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
224c0 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
224d0 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
224e0 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
224f0 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
22500 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
22510 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
22520 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
22530 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
22540 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
22550 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
22560 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
22570 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
22580 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20   k++){.    pE = 
22590 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
225a0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
225b0 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
225c0 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
225d0 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
225e0 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
225f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22600 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
22610 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
22620 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
22630 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
22640 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
22650 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
22660 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
22670 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
22680 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
22690 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
226a0 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
226b0 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
226c0 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
226d0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
226e0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
226f0 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
22700 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
22710 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
22720 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
22730 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
22740 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
22750 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
22760 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
22770 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
22780 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
22790 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
227a0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
227b0 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
227c0 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
227d0 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
227e0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
227f0 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
22820 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
22830 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f  ames)==0;..    /
22840 2a 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  * When processin
22850 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  g FROM-clause su
22860 62 71 75 65 72 69 65 73 2c 20 69 74 20 69 73 20  bqueries, it is 
22870 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
22880 20 20 20 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c      ** that full
22890 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46  _column_names=OF
228a0 46 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75  F and short_colu
228b0 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68  mn_names=ON.  Th
228c0 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
228d0 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
228e0 74 28 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  t() routine make
228f0 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20  s it so. */.    
22900 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
22910 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
22920 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20  From)==0.       
22930 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 20 26 20     || ((flags & 
22940 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
22950 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  mes)==0 &&.     
22960 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73 20           (flags 
22970 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
22980 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a  lNames)!=0) );..
22990 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
229a0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
229b0 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
229c0 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
229d0 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52   pRight = pE->pR
229e0 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
229f0 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
22a00 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20  OT || pRight!=0 
22a10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
22a20 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28  >op!=TK_ALL && (
22a30 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
22a40 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
22a50 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
22a60 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
22a70 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
22a80 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
22a90 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
22aa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22ab0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
22ac0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
22ad0 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
22ae0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
22af0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
22b00 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
22b10 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
22b20 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
22b30 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
22b40 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
22b50 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
22b60 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
22b70 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
22b80 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
22b90 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
22ba0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
22bb0 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
22bc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22bd0 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
22be0 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
22bf0 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
22c00 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
22c10 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
22c20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
22c30 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
22c40 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
22c50 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
22c60 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
22c70 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
22c80 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
22c90 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
22ca0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
22cb0 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
22cc0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
22cd0 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
22ce0 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
22cf0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
22d00 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
22d10 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
22d20 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
22d30 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
22d40 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
22d50 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
22d60 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
22d70 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
22d80 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
22d90 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
22da0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
22db0 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
22dc0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
22dd0 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
22de0 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
22df0 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
22e00 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
22e10 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
22e20 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
22e30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22e40 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
22e50 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
22e60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
22e70 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
22e80 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
22e90 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22ea0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
22eb0 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
22ec0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
22ed0 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
22ee0 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
22ef0 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
22f00 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
22f10 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
22f20 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
22f30 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
22f40 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
22f50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
22f60 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
22f70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22f80 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
22f90 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
22fa0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
22fb0 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
22fc0 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
22fd0 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
22fe0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a  [iDb].zName : "*
22ff0 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
23000 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
23010 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
23020 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
23030 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
23040 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
23050 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
23060 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
23070 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
23080 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
23090 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
230a0 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
230b0 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
230c0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
230d0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
230e0 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
230f0 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
23100 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
23110 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
23120 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
23130 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  t( zName );.    
23140 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
23150 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20  me && pSub.     
23160 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
23170 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
23180 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
23190 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e  j].zSpan, 0, zTN
231a0 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  ame, 0)==0.     
231b0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
231c0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
231d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
231e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
231f0 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
23200 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
23210 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  ' (currently onl
23220 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  y possible.     
23230 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69         ** for vi
23240 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64  rtual tables), d
23250 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74  o not include it
23260 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64   in the expanded
23270 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
23280 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e  result-set list.
23290 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
232a0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
232b0 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
232c0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29  pTab->aCol[j]) )
232d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
232e0 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c  assert(IsVirtual
232f0 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20  (pTab));.       
23300 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
23310 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23320 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
23330 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
23340 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
23350 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
23370 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70   (pFrom->jointyp
23380 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
23390 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
233a0 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
233b0 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
233c0 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
233d0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
233e0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
233f0 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
23400 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
23410 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
23420 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
23430 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
23440 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
23450 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
23460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23470 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23490 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
234a0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
234b0 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
234c0 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
234d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
234e0 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
234f0 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
23500 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
23510 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23520 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
23530 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
23540 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
23550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23560 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
23570 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23590 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
235a0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
235b0 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
235c0 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
235d0 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
235e0 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
235f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
23600 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
23610 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
23620 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
23630 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
23650 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
23660 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
23670 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
23680 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
23690 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
236a0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
236b0 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
236c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
236d0 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
236f0 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
23700 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
23710 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
23720 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
23730 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
23740 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
23750 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30   pLeft, pExpr, 0
23760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
23770 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
23780 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
23790 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
237a0 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
237b0 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
237c0 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
237d0 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
237e0 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
237f0 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
23800 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
23810 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
23820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23830 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
23840 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23850 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
23860 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23870 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
23880 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
23890 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
238a0 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  e.z = zColname;.
238b0 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
238c0 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33  name.n = sqlite3
238d0 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d  Strlen30(zColnam
238e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
238f0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
23900 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
23910 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20  New, &sColname, 
23920 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
23930 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e  if( pNew && (p->
23940 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
23950 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a  stedFrom)!=0 ){.
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
23970 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
23980 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e  em *pX = &pNew->
23990 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
239a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
239b0 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20  if( pSub ){.    
239c0 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
239d0 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
239e0 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62  bStrDup(db, pSub
239f0 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
23a00 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Span);.         
23a10 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23a20 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
23a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
23a40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23a50 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
23a60 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
23a70 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c  (db, "%s.%s.%s",
23a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
23ab0 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  emaName, zTabNam
23ac0 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
23ae0 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
23af0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
23b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23b10 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49        pX->bSpanI
23b20 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  sTab = 1;.      
23b30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23b40 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23b50 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a  e(db, zToFree);.
23b60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23b70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
23b80 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
23b90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
23ba0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
23bb0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
23bc0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
23bd0 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
23be0 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
23bf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23c00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
23c10 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
23c20 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
23c30 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
23c40 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23c50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
23c60 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
23c70 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29  lete(db, pEList)
23c80 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
23c90 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20  = pNew;.  }.#if 
23ca0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
23cb0 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  N.  if( p->pELis
23cc0 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  t && p->pEList->
23cd0 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
23ce0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
23cf0 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
23d00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
23d10 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
23d20 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
23d30 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64   set");.  }.#end
23d40 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  if.  return WRC_
23d50 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
23d60 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
23d70 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
23d80 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
23d90 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
23da0 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
23db0 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
23dc0 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
23dd0 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
23de0 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
23df0 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
23e00 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
23e10 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
23e20 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
23e30 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
23e40 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
23e50 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
23e60 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
23e70 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
23e80 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
23e90 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
23ea0 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
23eb0 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
23ec0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
23ed0 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
23ee0 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
23ef0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
23f00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
23f10 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
23f20 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
23f30 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
23f40 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23f50 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
23f60 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
23f70 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
23f80 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
23f90 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
23fa0 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
23fb0 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
23fc0 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
23fd0 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
23fe0 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
23ff0 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
24000 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
24010 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
24020 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
24030 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
24040 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
24050 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
24060 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
24070 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
24080 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
24090 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
240a0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
240b0 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
240c0 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
240d0 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
240e0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
240f0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
24100 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
24110 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
24120 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
24130 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
24140 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
24150 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
24160 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
24170 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
24180 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
24190 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
241a0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
241b0 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
241c0 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
241d0 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
241e0 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
241f0 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
24200 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
24210 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72  arse;.  if( pPar
24220 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20  se->hasCompound 
24230 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  ){.    w.xSelect
24240 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65  Callback = conve
24250 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74  rtCompoundSelect
24260 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20  ToSubquery;.    
24270 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
24280 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
24290 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
242a0 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
242b0 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53  Expander;.  w.xS
242c0 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
242d0 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
242e0 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
242f0 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
24300 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
24310 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
24320 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  RY./*.** This is
24330 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63   a Walker.xSelec
24340 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61  tCallback callba
24350 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
24360 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f  e3SelectTypeInfo
24370 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
24380 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
24390 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
243a0 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e  uery, add Column
243b0 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d  .zType and Colum
243c0 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  n.zColl.** infor
243d0 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61  mation to the Ta
243e0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
243f0 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
24400 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
24410 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79  of that subquery
24420 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ..**.** The Tabl
24430 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
24440 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
24450 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63  result set was c
24460 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79  onstructed.** by
24470 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
24480 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61  ) but the type a
24490 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
244a0 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69  ormation was omi
244b0 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20  tted.** at that 
244c0 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64  point because id
244d0 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f  entifiers had no
244e0 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c  t yet been resol
244f0 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ved.  This.** ro
24500 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
24510 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72  after identifier
24520 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
24530 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
24540 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
24550 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57  eInfo(Walker *pW
24560 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
24570 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
24580 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  se;.  int i;.  S
24590 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
245a0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
245b0 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
245c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
245d0 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
245e0 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70  lved );.  if( (p
245f0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
24600 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20  HasTypeInfo)==0 
24610 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
24620 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
24630 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65  Info;.    pParse
24640 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
24650 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  se;.    pTabList
24660 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
24670 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
24680 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
24690 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
246a0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
246b0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
246c0 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
246d0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
246e0 54 61 62 21 3d 30 29 20 26 26 20 28 70 54 61 62  Tab!=0) && (pTab
246f0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
24700 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
24710 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75  .        /* A su
24720 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
24730 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
24740 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
24750 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
24760 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
24770 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
24780 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  l ){.          w
24790 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
247a0 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c  or ) pSel = pSel
247b0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
247c0 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c      selectAddCol
247d0 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
247e0 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
247f0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pSel);.       
24800 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24810 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
24820 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
24830 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
24840 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
24850 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
24860 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
24870 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
24880 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
24890 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
248a0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
248b0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
248c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
248d0 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
248e0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
248f0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
24900 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
24910 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
24920 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
24930 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24940 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
24950 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
24960 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
24970 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  );.  w.xSelectCa
24980 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
24990 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
249a0 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
249b0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
249c0 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
249d0 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
249e0 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
249f0 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
24a00 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
24a10 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
24a20 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61   up a SELECT sta
24a30 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
24a40 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
24a50 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
24a60 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
24a70 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
24a80 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
24a90 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
24aa0 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
24ab0 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
24ac0 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
24ad0 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
24ae0 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
24af0 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
24b00 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
24b10 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
24b20 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
24b30 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
24b40 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
24b50 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
24b60 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
24b70 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
24b80 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
24b90 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
24ba0 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
24bb0 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
24bc0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24bd0 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
24be0 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
24bf0 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
24c00 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
24c10 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
24c20 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
24c30 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
24c40 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
24c50 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
24c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
24c70 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
24c80 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
24c90 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
24ca0 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
24cb0 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
24cc0 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
24cd0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
24ce0 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
24cf0 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
24d00 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
24d10 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
24d20 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
24d30 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
24d40 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
24d50 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
24d60 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
24d70 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b  pand(pParse, p);
24d80 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
24d90 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
24da0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
24db0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
24dc0 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
24dd0 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
24de0 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  C);.  if( pParse
24df0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
24e00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
24e10 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
24e20 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
24e30 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f  pParse, p);.}../
24e40 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
24e50 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
24e60 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
24e70 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
24e80 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
24e90 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
24ea0 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
24eb0 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
24ec0 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
24ed0 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
24ee0 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
24ef0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
24f00 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c   that stores NUL
24f10 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
24f20 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c  se memory.** cel
24f30 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
24f40 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
24f50 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
24f60 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
24f70 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
24f80 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
24f90 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
24fa0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
24fb0 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e   *pFunc;.  int n
24fc0 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Reg = pAggInfo->
24fd0 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f  nFunc + pAggInfo
24fe0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28  ->nColumn;.  if(
24ff0 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nReg==0 ) retur
25000 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  n;.#ifdef SQLITE
25010 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
25020 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49  fy that all AggI
25030 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72  nfo registers ar
25040 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  e within the ran
25050 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a  ge specified by.
25060 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52    ** AggInfo.mnR
25070 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65  eg..AggInfo.mxRe
25080 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  g */.  assert( n
25090 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg==pAggInfo->m
250a0 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d  xReg-pAggInfo->m
250b0 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28  nReg+1 );.  for(
250c0 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
250d0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
250e0 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
250f0 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
25100 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
25110 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
25120 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
25130 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
25140 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20  ->mxReg );.  }. 
25150 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
25160 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
25170 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
25180 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
25190 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
251a0 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
251b0 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   && pAggInfo->aF
251c0 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  unc[i].iMem<=pAg
251d0 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
251e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
251f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
25200 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41  , OP_Null, 0, pA
25210 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70  ggInfo->mnReg, p
25220 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b  AggInfo->mxReg);
25230 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
25240 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
25250 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
25260 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
25270 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75  ++){.    if( pFu
25280 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
25290 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
252a0 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
252b0 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
252c0 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
252d0 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pE, EP_xIsSele
252e0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
252f0 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20   pE->x.pList==0 
25300 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pE->x.pList->
25310 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
25320 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25330 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
25340 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73  TINCT aggregates
25350 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
25360 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20  ly one ".       
25370 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b      "argument");
25380 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
25390 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
253a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
253b0 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
253c0 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
253d0 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
253e0 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  rse, pE->x.pList
253f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
25400 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
25410 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
25420 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
25430 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
25460 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
25470 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
25480 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
25490 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
254a0 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
254b0 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
254c0 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
254d0 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
254e0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
254f0 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
25500 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
25510 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
25520 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
25530 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
25540 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
25550 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
25560 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
25570 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
25580 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
25590 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
255a0 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
255b0 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
255c0 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
255d0 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
255e0 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
255f0 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
25600 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
25610 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
25620 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
25630 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
25640 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
25650 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20  >nExpr : 0, 0,. 
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25670 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
25680 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
25690 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
256a0 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
256b0 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
256c0 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
256d0 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
256e0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
256f0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
25700 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
25710 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
25720 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
25730 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
25740 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
25750 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
25760 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67  int i;.  int reg
25770 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  Hit = 0;.  int a
25780 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a  ddrHitTest = 0;.
25790 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
257a0 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
257b0 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
257c0 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
257d0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
257e0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
257f0 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
25800 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
25810 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
25820 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
25830 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
25840 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
25850 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
25860 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
25870 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
25880 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
25890 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
258a0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
258b0 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
258c0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
258d0 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
258e0 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
258f0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
25900 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
25910 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
25920 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
25930 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
25940 2c 20 72 65 67 41 67 67 2c 20 53 51 4c 49 54 45  , regAgg, SQLITE
25950 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
25960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
25970 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
25980 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
25990 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
259a0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
259b0 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
259c0 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
259d0 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (v);.      asser
259e0 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20  t( nArg==1 );.  
259f0 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
25a00 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69  (pParse, pF->iDi
25a10 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74  stinct, addrNext
25a20 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20  , 1, regAgg);.  
25a30 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
25a40 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
25a50 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
25a60 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
25a70 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
25a80 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
25a90 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
25aa0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
25ab0 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
25ac0 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
25ad0 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
25ae0 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
25af0 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
25b00 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
25b10 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
25b20 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
25b30 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
25b40 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
25b50 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
25b60 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
25b70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25b80 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
25b90 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
25ba0 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
25bb0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
25bc0 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
25bd0 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
25be0 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
25bf0 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
25c00 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
25c10 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
25c20 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
25c30 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
25c40 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
25c50 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
25c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
25c70 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
25c80 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
25c90 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
25cb0 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
25cc0 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
25cd0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
25ce0 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
25cf0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
25d00 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
25d10 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
25d20 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
25d30 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
25d40 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
25d50 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
25d60 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
25d70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25d80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
25d90 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
25da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
25db0 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
25dc0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
25dd0 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
25de0 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
25df0 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
25e00 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
25e10 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
25e20 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
25e30 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
25e40 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
25e50 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
25e60 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
25e70 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
25e80 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
25e90 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
25ea0 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
25eb0 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
25ec0 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
25ed0 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
25ee0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
25ef0 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
25f00 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
25f10 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
25f20 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
25f30 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
25f40 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
25f50 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
25f60 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
25f70 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
25f80 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
25f90 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
25fa0 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
25fb0 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
25fc0 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
25fd0 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
25fe0 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
25ff0 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
26000 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
26010 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
26020 67 48 69 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  gHit);.  }.  sql
26030 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
26040 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
26050 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49 6e  r(i=0, pC=pAggIn
26060 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67 67  fo->aCol; i<pAgg
26070 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61 74  Info->nAccumulat
26080 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b 0a  or; i++, pC++){.
26090 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
260a0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d 3e  ode(pParse, pC->
260b0 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d 29  pExpr, pC->iMem)
260c0 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66 6f  ;.  }.  pAggInfo
260d0 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 30  ->directMode = 0
260e0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
260f0 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
26100 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69 74  );.  if( addrHit
26110 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Test ){.    sqli
26120 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
26130 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29 3b  v, addrHitTest);
26140 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
26150 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45 78  d a single OP_Ex
26160 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f  plain instructio
26170 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74 6f  n to the VDBE to
26180 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70 6c   explain a simpl
26190 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71 75  e.** count(*) qu
261a0 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f 75  ery ("SELECT cou
261b0 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62 22  nt(*) FROM pTab"
261c0 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  )..*/.#ifndef SQ
261d0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
261e0 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  N.static void ex
261f0 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74  plainSimpleCount
26200 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
26210 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
26220 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
26230 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20  text */.  Table 
26240 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20 20  *pTab,          
26250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
26260 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
26270 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
26280 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x               
26290 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75        /* Index u
262a0 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
262b0 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  scan, or NULL */
262c0 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  .){.  if( pParse
262d0 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
262e0 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20 3d      char *zEqp =
262f0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
26300 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43 41  pParse->db, "SCA
26310 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22 2c  N TABLE %s%s%s",
26320 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
26330 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
26340 49 64 78 20 3f 20 22 20 55 53 49 4e 47 20 43 4f  Idx ? " USING CO
26350 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20 3a  VERING INDEX " :
26360 20 22 22 2c 0a 20 20 20 20 20 20 20 20 70 49 64   "",.        pId
26370 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  x ? pIdx->zName 
26380 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  : "".    );.    
26390 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
263a0 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  4(.        pPars
263b0 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78 70  e->pVdbe, OP_Exp
263c0 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
263d0 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
263e0 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 0a  Eqp, P4_DYNAMIC.
263f0 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c      );.  }.}.#el
26400 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  se.# define expl
26410 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 61  ainSimpleCount(a
26420 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ,b,c).#endif../*
26430 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
26440 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e for the SELECT
26450 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
26460 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d 65   in the p argume
26470 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  nt.  .**.** The 
26480 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74 75  results are retu
26490 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  rned according t
264a0 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74  o the SelectDest
264b0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 53   structure..** S
264c0 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 73  ee comments in s
264d0 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20 66  qliteInt.h for f
264e0 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74 69  urther informati
264f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  on..**.** This r
26500 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
26510 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
26520 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72 72  ors.  If any err
26530 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f 75  ors are.** encou
26540 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e 20  ntered, then an 
26550 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
26560 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
26570 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d 3e  t in.** pParse->
26580 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
26590 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
265a0 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53 65   NOT free the Se
265b0 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20 70  lect structure p
265c0 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a 2a  assed in.  The.*
265d0 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  * calling functi
265e0 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20 74  on needs to do t
265f0 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hat..*/.int sqli
26600 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61 72  te3Select(.  Par
26610 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
26620 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
26630 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
26640 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
26650 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
26660 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
26670 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
26680 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
26690 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74  t      /* What t
266a0 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71 75  o do with the qu
266b0 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a 29  ery results */.)
266c0 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
266d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
266e0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
266f0 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
26700 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72  fo;     /* Retur
26710 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57 68  n from sqlite3Wh
26720 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20 20  ereBegin() */.  
26730 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
26740 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69         /* The vi
26750 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e  rtual machine un
26760 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
26770 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67 3b   */.  int isAgg;
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26790 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74 20  True for select 
267a0 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75 6e  lists like "coun
267b0 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72 4c  t(*)" */.  ExprL
267c0 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20  ist *pEList;    
267d0 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f 6c    /* List of col
267e0 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74 2e  umns to extract.
267f0 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
26800 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a 20  TabList;     /* 
26810 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 74  List of tables t
26820 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a 2f  o select from */
26830 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 3b  .  Expr *pWhere;
26840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26850 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
26860 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
26870 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
26880 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f  rBy;    /* The O
26890 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
268a0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
268b0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
268c0 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  upBy;    /* The 
268d0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
268e0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
268f0 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e 67  .  Expr *pHaving
26900 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
26910 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e 20   HAVING clause. 
26920 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
26930 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20 20    int rc = 1;   
26940 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
26950 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f 6d  e to return from
26960 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
26970 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74  /.  int addrSort
26980 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41 64  Index;     /* Ad
26990 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f 4f  dress of an OP_O
269a0 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73  penEphemeral ins
269b0 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 69  truction */.  Di
269c0 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74 69  stinctCtx sDisti
269d0 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e 20  nct; /* Info on 
269e0 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65 20  how to code the 
269f0 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
26a00 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73 41   */.  AggInfo sA
26a10 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a 20  ggInfo;      /* 
26a20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  Information used
26a30 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71 75   by aggregate qu
26a40 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  eries */.  int i
26a50 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
26a60 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
26a70 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 71  the end of the q
26a80 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  uery */.  sqlite
26a90 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
26aa0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
26ab0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
26ac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26ad0 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e  MIT_EXPLAIN.  in
26ae0 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  t iRestoreSelect
26af0 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53 65  Id = pParse->iSe
26b00 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73 65  lectId;.  pParse
26b10 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70 50  ->iSelectId = pP
26b20 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
26b30 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  tId++;.#endif.. 
26b40 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
26b50 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
26b60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
26b70 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
26b80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
26b90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
26ba0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
26bb0 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45  rse, SQLITE_SELE
26bc0 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20 72  CT, 0, 0, 0) ) r
26bd0 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
26be0 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c 20  t(&sAggInfo, 0, 
26bf0 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f 29  sizeof(sAggInfo)
26c00 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72 61  );..  if( Ignora
26c10 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73 74  bleOrderby(pDest
26c20 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
26c30 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
26c40 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65 73  T_Exists || pDes
26c50 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55 6e  t->eDest==SRT_Un
26c60 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ion || .        
26c70 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d     pDest->eDest=
26c80 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20 70  =SRT_Except || p
26c90 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
26ca0 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20 2f  _Discard);.    /
26cb0 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d 61  * If ORDER BY ma
26cc0 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e 63  kes no differenc
26cd0 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  e in the output 
26ce0 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f 65  then neither doe
26cf0 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e 43  s.    ** DISTINC
26d00 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20 72  T so it can be r
26d10 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a 20  emoved too. */. 
26d20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
26d30 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
26d40 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 70  pOrderBy);.    p
26d50 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
26d60 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
26d70 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74 3b  &= ~SF_Distinct;
26d80 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 65  .  }.  sqlite3Se
26d90 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
26da0 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65 72   p, 0);.  pOrder
26db0 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
26dc0 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  ;.  pTabList = p
26dd0 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
26de0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
26df0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
26e00 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
26e10 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
26e20 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d   select_end;.  }
26e30 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e 73  .  isAgg = (p->s
26e40 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
26e50 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61 73  regate)!=0;.  as
26e60 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
26e70 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  );..  /* Begin g
26e80 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e 0a  enerating code..
26e90 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
26ea0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
26eb0 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  );.  if( v==0 ) 
26ec0 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b  goto select_end;
26ed0 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69 6e  ..  /* If writin
26ee0 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20 67  g to memory or g
26ef0 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74 0a  enerating a set.
26f00 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67    ** only a sing
26f10 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62 65  le column may be
26f20 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23 69   output..  */.#i
26f30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26f40 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66 28  T_SUBQUERY.  if(
26f50 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
26f60 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
26f70 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20 70  pParse, pDest, p
26f80 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b  EList->nExpr) ){
26f90 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74  .    goto select
26fa0 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  _end;.  }.#endif
26fb0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
26fc0 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75 62  code for all sub
26fd0 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65 20  -queries in the 
26fe0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a 2f  FROM clause.  */
26ff0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
27000 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
27010 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
27020 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
27030 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70 2d  ).  for(i=0; !p-
27040 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54 61  >pPrior && i<pTa
27050 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
27060 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
27070 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
27080 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
27090 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74 44  [i];.    SelectD
270a0 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53 65  est dest;.    Se
270b0 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49 74  lect *pSub = pIt
270c0 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  em->pSelect;.   
270d0 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a 0a   int isAggSub;..
270e0 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30 20      if( pSub==0 
270f0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
27100 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74 68   /* Sometimes th
27110 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75 62  e code for a sub
27120 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67 65  query will be ge
27130 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68 61  nerated more tha
27140 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20 69  n.    ** once, i
27150 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69  f the subquery i
27160 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57 48  s part of the WH
27170 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61 20  ERE clause in a 
27180 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20 2a  LEFT JOIN,.    *
27190 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  * for example.  
271a0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64 6f  In that case, do
271b0 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65 20   not regenerate 
271c0 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e 69  the code to mani
271d0 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76 69  fest.    ** a vi
271e0 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f 75  ew or the co-rou
271f0 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  tine to implemen
27200 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20 66  t a view.  The f
27210 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20 20  irst instance.  
27220 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69 65    ** is sufficie
27230 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20 73  nt, though the s
27240 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6e  ubroutine to man
27250 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20 64  ifest the view d
27260 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  oes need.    ** 
27270 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 67  to be invoked ag
27280 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ain. */.    if( 
27290 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53  pItem->addrFillS
272a0 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ub ){.      if( 
272b0 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75 74  pItem->viaCorout
272c0 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ine==0 ){.      
272d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
272e0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
272f0 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72   pItem->regRetur
27300 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69  n, pItem->addrFi
27310 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a  llSub);.      }.
27320 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
27330 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
27340 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e 48  crement Parse.nH
27350 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65 69  eight by the hei
27360 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67 65  ght of the large
27370 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  st expression.  
27380 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72 72    ** tree referr
27390 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
273a0 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
273b0 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
273c0 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
273d0 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
273e0 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
273f0 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
27400 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
27410 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
27420 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
27430 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
27440 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
27450 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
27460 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
27470 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
27480 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
27490 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
274a0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
274b0 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
274c0 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
274d0 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70     isAggSub = (p
274e0 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
274f0 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
27500 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65  ;.    if( flatte
27510 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
27520 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69  , p, i, isAgg, i
27530 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20  sAggSub) ){.    
27540 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65    /* This subque
27550 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62  ry can be absorb
27560 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  ed into its pare
27570 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nt. */.      if(
27580 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20   isAggSub ){.   
27590 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a       isAgg = 1;.
275a0 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
275b0 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67  ags |= SF_Aggreg
275c0 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ate;.      }.   
275d0 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
275e0 65 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69 73  else if( pTabLis
275f0 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20 20  t->nSrc==1.     
27600 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
27610 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
27620 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f   SQLITE_SubqCoro
27630 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20  utine).    ){.  
27640 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74      /* Implement
27650 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
27660 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  at will return a
27670 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
27680 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
27690 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69  ** set on each i
276a0 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20  nvocation..     
276b0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
276c0 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
276d0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
276e0 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  )+1;.      pItem
276f0 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
27700 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
27710 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27720 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74  ddOp3(v, OP_Init
27730 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d  Coroutine, pItem
27740 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c 20  ->regReturn, 0, 
27750 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20 20  addrTop);.      
27760 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
27770 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61  "%s", pItem->pTa
27780 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
27790 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c    pItem->addrFil
277a0 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b 0a  lSub = addrTop;.
277b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
277c0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
277d0 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
277e0 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
277f0 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  rn);.      expla
27800 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49 74  inSetInteger(pIt
27810 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 28  em->iSelectId, (
27820 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  u8)pParse->iNext
27830 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20  SelectId);.     
27840 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
27850 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64 65  Parse, pSub, &de
27860 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  st);.      pItem
27870 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 20  ->pTab->nRowEst 
27880 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53 75 62  = (unsigned)pSub
27890 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20  ->nSelectRow;.  
278a0 20 20 20 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f      pItem->viaCo
278b0 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20 20  routine = 1;.   
278c0 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 73     pItem->regRes
278d0 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74  ult = dest.iSdst
278e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
278f0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
27900 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49  EndCoroutine, pI
27910 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b  tem->regReturn);
27920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27930 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
27940 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  drTop-1);.      
27950 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
27960 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65 29  RegCache(pParse)
27970 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27980 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
27990 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
279a0 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65 70   will fill an ep
279b0 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77 69  hemeral table wi
279c0 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  th.      ** the 
279d0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20  content of this 
279e0 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65 6d  subquery.  pItem
279f0 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77 69  ->addrFillSub wi
27a00 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a  ll point.      *
27a10 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73 73  * to the address
27a20 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
27a30 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 70  d subroutine.  p
27a40 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 0a  Item->regReturn.
27a50 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72 65        ** is a re
27a60 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65 64  gister allocated
27a70 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75 62   to hold the sub
27a80 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
27a90 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f 0a  ddress.      */.
27aa0 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64 64        int topAdd
27ab0 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 63  r;.      int onc
27ac0 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 20  eAddr = 0;.     
27ad0 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20 20   int retAddr;.  
27ae0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
27af0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d 3d  m->addrFillSub==
27b00 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 );.      pItem
27b10 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b  ->regReturn = ++
27b20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
27b30 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73 71      topAddr = sq
27b40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
27b50 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
27b60 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
27b70 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  rn);.      pItem
27b80 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d 20  ->addrFillSub = 
27b90 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20 20  topAddr+1;.     
27ba0 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f   if( pItem->isCo
27bb0 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20  rrelated==0 ){. 
27bc0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
27bd0 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f 74   subquery is not
27be0 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64 20   correlated and 
27bf0 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  if we are not in
27c00 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20 20  side of.        
27c10 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74 68  ** a trigger, th
27c20 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  en we only need 
27c30 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 76  to compute the v
27c40 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62 71  alue of the subq
27c50 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  uery.        ** 
27c60 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  once. */.       
27c70 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c 69   onceAddr = sqli
27c80 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61 72  te3CodeOnce(pPar
27c90 73 65 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  se);.        Vdb
27ca0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6d 61  eComment((v, "ma
27cb0 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73 5c 22  terialize \"%s\"
27cc0 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  ", pItem->pTab->
27cd0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 7d  zName));.      }
27ce0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 56 64  else{.        Vd
27cf0 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
27d00 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c  , "materialize \
27d10 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70  "%s\"", pItem->p
27d20 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
27d30 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
27d40 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
27d50 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45 70 68  t(&dest, SRT_Eph
27d60 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e 69 43  emTab, pItem->iC
27d70 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 65 78  ursor);.      ex
27d80 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
27d90 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64  pItem->iSelectId
27da0 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e  , (u8)pParse->iN
27db0 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20  extSelectId);.  
27dc0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
27dd0 74 28 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20  t(pParse, pSub, 
27de0 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49  &dest);.      pI
27df0 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45  tem->pTab->nRowE
27e00 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70  st = (unsigned)p
27e10 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  Sub->nSelectRow;
27e20 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 41  .      if( onceA
27e30 64 64 72 20 29 20 73 71 6c 69 74 65 33 56 64 62  ddr ) sqlite3Vdb
27e40 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f 6e 63  eJumpHere(v, onc
27e50 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20 72 65  eAddr);.      re
27e60 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56  tAddr = sqlite3V
27e70 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
27e80 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d 3e 72  Return, pItem->r
27e90 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20 20  egReturn);.     
27ea0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27eb0 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74 65 6d   "end %s", pItem
27ec0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b  ->pTab->zName));
27ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27ee0 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20 74 6f  beChangeP1(v, to
27ef0 70 41 64 64 72 2c 20 72 65 74 41 64 64 72 29 3b  pAddr, retAddr);
27f00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c  .      sqlite3Cl
27f10 65 61 72 54 65 6d 70 52 65 67 43 61 63 68 65 28  earTempRegCache(
27f20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20  pParse);.    }. 
27f30 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73 65 2d     if( /*pParse-
27f40 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d 3e 6d  >nErr ||*/ db->m
27f50 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
27f60 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63 74       goto select
27f70 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
27f80 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
27f90 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  -= sqlite3Select
27fa0 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 20  ExprHeight(p);. 
27fb0 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 2d     pTabList = p-
27fc0 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28 20 21  >pSrc;.    if( !
27fd0 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72 62 79  IgnorableOrderby
27fe0 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20 20 20  (pDest) ){.     
27ff0 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70   pOrderBy = p->p
28000 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d 0a 20  OrderBy;.    }. 
28010 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 2d   }.  pEList = p-
28020 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69 66 0a  >pEList;.#endif.
28030 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e 70 57    pWhere = p->pW
28040 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70 42 79  here;.  pGroupBy
28050 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
28060 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d 3e 70    pHaving = p->p
28070 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73 74 69  Having;.  sDisti
28080 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28 70 2d  nct.isTnct = (p-
28090 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
280a0 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a 23 69  istinct)!=0;..#i
280b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
280c0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
280d0 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  T.  /* If there 
280e0 69 73 20 61 72 65 20 61 20 73 65 71 75 65 6e 63  is are a sequenc
280f0 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20 64 6f  e of queries, do
28100 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f 6e 65   the earlier one
28110 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a 20 20  s first..  */.  
28120 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
28130 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74 69 53  .    rc = multiS
28140 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 2c  elect(pParse, p,
28150 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65 78 70   pDest);.    exp
28160 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70  lainSetInteger(p
28170 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
28180 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63 74  , iRestoreSelect
28190 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Id);.    return 
281a0 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rc;.  }.#endif..
281b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
281c0 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20 42 59   both a GROUP BY
281d0 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20 42 59   and an ORDER BY
281e0 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 79   clause and they
281f0 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e 74 69   are.  ** identi
28200 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61 62 6c  cal, then disabl
28210 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
28220 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68 65 20  lause since the 
28230 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20 77 69  GROUP BY.  ** wi
28240 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65 6e 74  ll cause element
28250 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20 69 6e  s to come out in
28260 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64   the correct ord
28270 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20 20 2a  er.  This is.  *
28280 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  * an optimizatio
28290 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63 74 20  n - the correct 
282a0 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20 72 65  answer should re
282b0 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73 73 2e  sult regardless.
282c0 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20 53 51  .  ** Use the SQ
282d0 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
282e0 72 20 66 6c 61 67 20 77 69 74 68 20 53 51 4c 49  r flag with SQLI
282f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
28300 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20 64 69  MIZER.  ** to di
28310 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74 69 6d  sable this optim
28320 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65 73 74  ization for test
28330 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 20 20  ing purposes..  
28340 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
28350 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72 65 28  ExprListCompare(
28360 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70 4f 72  p->pGroupBy, pOr
28370 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 0a 20 20  derBy, -1)==0.  
28380 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
28390 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
283a0 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79  , SQLITE_GroupBy
283b0 4f 72 64 65 72 29 20 29 7b 0a 20 20 20 20 70 4f  Order) ){.    pO
283c0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
283d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65  .  /* If the que
283e0 72 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 77  ry is DISTINCT w
283f0 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42 59 20  ith an ORDER BY 
28400 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  but is not an ag
28410 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a 20 20  gregate, and .  
28420 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65 63 74  ** if the select
28430 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73 61 6d  -list is the sam
28440 65 20 61 73 20 74 68 65 20 4f 52 44 45 52 20 42  e as the ORDER B
28450 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74 68 69  Y list, then thi
28460 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63 61 6e  s query.  ** can
28470 20 62 65 20 72 65 77 72 69 74 74 65 6e 20 61 73   be rewritten as
28480 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49 6e 20   a GROUP BY. In 
28490 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 69  other words, thi
284a0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
284b0 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54   SELECT DISTINCT
284c0 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 4f 52   xyz FROM ... OR
284d0 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a  DER BY xyz.  **.
284e0 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66 6f 72    ** is transfor
284f0 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  med to:.  **.  *
28500 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78 79 7a  *     SELECT xyz
28510 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55 50 20   FROM ... GROUP 
28520 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20 2a 2a  BY xyz.  **.  **
28530 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
28540 20 69 73 20 70 72 65 66 65 72 72 65 64 20 61 73   is preferred as
28550 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78 20   a single index 
28560 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65 29 20  (or temp-table) 
28570 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75 73 65  may be .  ** use
28580 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 4f  d for both the O
28590 52 44 45 52 20 42 59 20 61 6e 64 20 44 49 53 54  RDER BY and DIST
285a0 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e 67 2e  INCT processing.
285b0 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 0a   As originally .
285c0 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 68 65    ** written the
285d0 20 71 75 65 72 79 20 6d 75 73 74 20 75 73 65 20   query must use 
285e0 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  a temp-table for
285f0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   at least one of
28600 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20 2a 2a   the ORDER .  **
28610 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e 43 54   BY and DISTINCT
28620 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78 20 6f  , and an index o
28630 72 20 73 65 70 61 72 61 74 65 20 74 65 6d 70 2d  r separate temp-
28640 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20 6f 74  table for the ot
28650 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
28660 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28  (p->selFlags & (
28670 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41  SF_Distinct|SF_A
28680 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44  ggregate))==SF_D
28690 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26 20 73  istinct .   && s
286a0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 6f  qlite3ExprListCo
286b0 6d 70 61 72 65 28 70 4f 72 64 65 72 42 79 2c 20  mpare(pOrderBy, 
286c0 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 29 3d 3d  p->pEList, -1)==
286d0 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65  0.  ){.    p->se
286e0 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 44 69  lFlags &= ~SF_Di
286f0 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d 3e 70  stinct;.    p->p
28700 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
28710 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
28720 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 3b 0a   p->pEList, 0);.
28730 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70      pGroupBy = p
28740 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20  ->pGroupBy;.    
28750 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
28760 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68 61 74    /* Notice that
28770 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20 53 46   even thought SF
28780 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20 62 65  _Distinct has be
28790 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f 6d 20  en cleared from 
287a0 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20 20 20  p->selFlags,.   
287b0 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69 6e 63   ** the sDistinc
287c0 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74 69 6c  t.isTnct is stil
287d0 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c 20 69  l set.  Hence, i
287e0 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e 74 73  sTnct represents
287f0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72 69 67   the.    ** orig
28800 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f 66 20  inal setting of 
28810 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63 74 20  the SF_Distinct 
28820 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20 63 75  flag, not the cu
28830 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20 2a 2f  rrent setting */
28840 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 44 69  .    assert( sDi
28850 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 29 3b  stinct.isTnct );
28860 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
28870 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
28880 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
28890 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20 20 2a  this sorting.  *
288a0 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20 65 6e  * index might en
288b0 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75 73 65  d up being unuse
288c0 64 20 69 66 20 74 68 65 20 64 61 74 61 20 63 61  d if the data ca
288d0 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74 72 61  n be .  ** extra
288e0 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f 72 74  cted in pre-sort
288f0 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68  ed order.  If th
28900 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
28910 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 50  then the.  ** OP
28920 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69  _OpenEphemeral i
28930 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c 6c 20  nstruction will 
28940 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61 6e  be changed to an
28950 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a 20 20   OP_Noop once.  
28960 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f 75 74  ** we figure out
28970 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 69 6e   that the sortin
28980 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 6e  g index is not n
28990 65 65 64 65 64 2e 20 20 54 68 65 20 61 64 64 72  eeded.  The addr
289a0 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a 20 76  SortIndex.  ** v
289b0 61 72 69 61 62 6c 65 20 69 73 20 75 73 65 64 20  ariable is used 
289c0 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 68  to facilitate th
289d0 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a 2f 0a  at change..  */.
289e0 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
289f0 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70  {.    KeyInfo *p
28a00 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70 4b 65  KeyInfo;.    pKe
28a10 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
28a20 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
28a30 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 30 29  se, pOrderBy, 0)
28a40 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  ;.    pOrderBy->
28a50 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
28a60 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
28a70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
28a80 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65  ] = addrSortInde
28a90 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
28aa0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
28ab0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
28ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
28ae0 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
28af0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
28b00 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
28b30 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
28b40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
28b50 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31 3b 0a  SortIndex = -1;.
28b60 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
28b70 20 6f 75 74 70 75 74 20 69 73 20 64 65 73 74 69   output is desti
28b80 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70 6f 72  ned for a tempor
28b90 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65 6e 20  ary table, open 
28ba0 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  that table..  */
28bb0 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e 65 44  .  if( pDest->eD
28bc0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
28bd0 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
28be0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
28bf0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
28c00 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
28c10 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
28c20 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
28c30 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a 2f 0a  e limiter..  */.
28c40 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74 65 33    iEnd = sqlite3
28c50 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
28c60 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f  ;.  p->nSelectRo
28c70 77 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  w = LARGEST_INT6
28c80 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  4;.  computeLimi
28c90 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
28ca0 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69  e, p, iEnd);.  i
28cb0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  f( p->iLimit==0 
28cc0 26 26 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  && addrSortIndex
28cd0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
28ce0 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
28cf0 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f  ddrSortIndex)->o
28d00 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65  pcode = OP_Sorte
28d10 72 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e 73 65  rOpen;.    p->se
28d20 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
28d30 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  Sorter;.  }..  /
28d40 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c  * Open a virtual
28d50 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
28d60 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
28d70 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
28d80 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
28d90 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
28da0 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
28db0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
28dc0 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
28dd0 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
28de0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
28df0 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
28e00 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
28e30 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  bTnct, 0, 0,.   
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
28e60 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  ar*)keyInfoFromE
28e70 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
28e80 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 2c 0a 20  p->pEList, 0),. 
28e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
28eb0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
28ec0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
28ed0 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55 4e 4f  eP5(v, BTREE_UNO
28ee0 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73 44 69  RDERED);.    sDi
28ef0 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65  stinct.eTnctType
28f00 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
28f10 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20 20 7d  T_UNORDERED;.  }
28f20 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73 74 69  else{.    sDisti
28f30 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20 3d 20  nct.eTnctType = 
28f40 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e  WHERE_DISTINCT_N
28f50 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  OOP;.  }..  if( 
28f60 21 69 73 41 67 67 20 26 26 20 70 47 72 6f 75 70  !isAgg && pGroup
28f70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  By==0 ){.    /* 
28f80 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  No aggregate fun
28f90 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20 47 52  ctions and no GR
28fa0 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  OUP BY clause */
28fb0 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c 46 6c  .    u16 wctrlFl
28fc0 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e 63 74  ags = (sDistinct
28fd0 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52 45 5f  .isTnct ? WHERE_
28fe0 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 3a 20  WANT_DISTINCT : 
28ff0 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69  0);..    /* Begi
29000 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  n the database s
29010 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57 49 6e  can. */.    pWIn
29020 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  fo = sqlite3Wher
29030 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70  eBegin(pParse, p
29040 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c  TabList, pWhere,
29050 20 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e 70 45   pOrderBy, p->pE
29060 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  List,.          
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29080 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67 73 2c       wctrlFlags,
29090 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49   0);.    if( pWI
290a0 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  nfo==0 ) goto se
290b0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66  lect_end;.    if
290c0 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75  ( sqlite3WhereOu
290d0 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49  tputRowCount(pWI
290e0 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c 65 63  nfo) < p->nSelec
290f0 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 2d  tRow ){.      p-
29100 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 73 71  >nSelectRow = sq
29110 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70 75 74  lite3WhereOutput
29120 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66 6f 29  RowCount(pWInfo)
29130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29140 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
29150 20 26 26 20 73 71 6c 69 74 65 33 57 68 65 72 65   && sqlite3Where
29160 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
29170 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44 69 73  o) ){.      sDis
29180 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
29190 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73  = sqlite3WhereIs
291a0 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66 6f 29  Distinct(pWInfo)
291b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
291c0 70 4f 72 64 65 72 42 79 20 26 26 20 73 71 6c 69  pOrderBy && sqli
291d0 74 65 33 57 68 65 72 65 49 73 4f 72 64 65 72 65  te3WhereIsOrdere
291e0 64 28 70 57 49 6e 66 6f 29 20 29 20 70 4f 72 64  d(pWInfo) ) pOrd
291f0 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  erBy = 0;..    /
29200 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69 6e 64  * If sorting ind
29210 65 78 20 74 68 61 74 20 77 61 73 20 63 72 65 61  ex that was crea
29220 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 4f  ted by a prior O
29230 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
29240 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
29250 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e 6f 74  ion ended up not
29260 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c 20 74   being needed, t
29270 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65 20 4f  hen change the O
29280 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 0a  P_OpenEphemeral.
29290 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e 20 4f      ** into an O
292a0 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  P_Noop..    */. 
292b0 20 20 20 69 66 28 20 61 64 64 72 53 6f 72 74 49     if( addrSortI
292c0 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72 64 65  ndex>=0 && pOrde
292d0 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rBy==0 ){.      
292e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
292f0 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64 72 53  eToNoop(v, addrS
29300 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 20  ortIndex);.     
29310 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
29320 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a  [2] = -1;.    }.
29330 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
29340 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72 20 6c  standard inner l
29350 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65 6c 65  oop. */.    sele
29360 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
29370 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c 20 2d  se, p, pEList, -
29380 31 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 73 44  1, pOrderBy, &sD
29390 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74 2c 0a  istinct, pDest,.
293a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293b0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
293c0 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 70 57  ContinueLabel(pW
293d0 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  Info),.         
293e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
293f0 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62 65  e3WhereBreakLabe
29400 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20 20 20  l(pWInfo));..   
29410 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74 61   /* End the data
29420 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a  base scan loop..
29430 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
29440 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
29450 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
29460 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77 68   /* This case wh
29470 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20 61  en there exist a
29480 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
29490 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42 59  ns or a GROUP BY
294a0 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 6f   clause.    ** o
294b0 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e 61  r both */.    Na
294c0 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
294d0 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
294e0 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67  t for processing
294f0 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72   aggregate infor
29500 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  mation */.    in
29510 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20 20  t iAMem;        
29520 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61    /* First Mem a
29530 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72 69  ddress for stori
29540 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  ng current GROUP
29550 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69   BY */.    int i
29560 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  BMem;          /
29570 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64 72  * First Mem addr
29580 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75 73  ess for previous
29590 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20 20   GROUP BY */.   
295a0 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20 20   int iUseFlag;  
295b0 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
295c0 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61 67  ess holding flag
295d0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
295e0 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20 20   at least.      
295f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29600 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66 20    ** one row of 
29610 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 65  the input to the
29620 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73 20   aggregator has 
29630 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20 20  been.           
29640 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
29650 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 20  processed */.   
29660 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67 3b   int iAbortFlag;
29670 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64 72       /* Mem addr
29680 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65 73  ess which causes
29690 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66 20   query abort if 
296a0 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20 20  positive */.    
296b0 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74 3b  int groupBySort;
296c0 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d 65      /* Rows come
296d0 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e 20   from source in 
296e0 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20 2a  GROUP BY order *
296f0 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45 6e  /.    int addrEn
29700 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  d;        /* End
29710 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20 66   of processing f
29720 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  or this SELECT *
29730 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50 54  /.    int sortPT
29740 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73 65  ab = 0;   /* Pse
29750 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74 6f  udotable used to
29760 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67 20   decode sorting 
29770 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 69  results */.    i
29780 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b 20  nt sortOut = 0; 
29790 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65 67     /* Output reg
297a0 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73  ister from the s
297b0 6f 72 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  orter */..    /*
297c0 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64 20   Remove any and 
297d0 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74 77  all aliases betw
297e0 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73  een the result s
297f0 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  et and the.    *
29800 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  * GROUP BY claus
29810 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
29820 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
29830 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20 20      int k;      
29840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29850 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
29860 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63  r */.      struc
29870 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
29880 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72 20  *pItem;  /* For 
29890 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 70  looping over exp
298a0 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69 73  ression in a lis
298b0 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28  t */..      for(
298c0 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  k=p->pEList->nEx
298d0 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45 4c  pr, pItem=p->pEL
298e0 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d  ist->a; k>0; k--
298f0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
29900 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
29910 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  Alias = 0;.     
29920 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70   }.      for(k=p
29930 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20  GroupBy->nExpr, 
29940 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e  pItem=pGroupBy->
29950 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74  a; k>0; k--, pIt
29960 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70  em++){.        p
29970 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69 61 73  Item->u.x.iAlias
29980 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
29990 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
299a0 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d 3e 6e  ctRow>100 ) p->n
299b0 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30 30 3b  SelectRow = 100;
299c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
299d0 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
299e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20 20  = 1;.    }.. .  
299f0 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c 61    /* Create a la
29a00 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20 77  bel to jump to w
29a10 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 61  hen we want to a
29a20 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20 2a  bort the query *
29a30 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d 20  /.    addrEnd = 
29a40 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
29a50 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
29a60 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c 55   Convert TK_COLU
29a70 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54 4b  MN nodes into TK
29a80 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20  _AGG_COLUMN and 
29a90 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e 0a  make entries in.
29aa0 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f 20      ** sAggInfo 
29ab0 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f 46  for all TK_AGG_F
29ac0 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69 6e  UNCTION nodes in
29ad0 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
29ae0 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43  the.    ** SELEC
29af0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  T statement..   
29b00 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
29b10 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
29b20 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
29b30 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
29b40 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
29b50 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  = pTabList;.    
29b60 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20 26  sNC.pAggInfo = &
29b70 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73 41  sAggInfo;.    sA
29b80 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d 20 70  ggInfo.mnReg = p
29b90 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
29ba0 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72     sAggInfo.nSor
29bb0 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70 47 72  tingColumn = pGr
29bc0 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70 42 79  oupBy ? pGroupBy
29bd0 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b 0a 20  ->nExpr+1 : 0;. 
29be0 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47 72 6f     sAggInfo.pGro
29bf0 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42 79 3b  upBy = pGroupBy;
29c00 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
29c10 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26  AnalyzeAggList(&
29c20 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  sNC, pEList);.  
29c30 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
29c40 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43  lyzeAggList(&sNC
29c50 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  , pOrderBy);.   
29c60 20 69 66 28 20 70 48 61 76 69 6e 67 20 29 7b 0a   if( pHaving ){.
29c70 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29c80 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
29c90 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69 6e 67  es(&sNC, pHaving
29ca0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 41 67  );.    }.    sAg
29cb0 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c 61 74  gInfo.nAccumulat
29cc0 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e 6e 43  or = sAggInfo.nC
29cd0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72 28 69  olumn;.    for(i
29ce0 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f 2e 6e  =0; i<sAggInfo.n
29cf0 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Func; i++){.    
29d00 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
29d10 61 73 50 72 6f 70 65 72 74 79 28 73 41 67 67 49  asProperty(sAggI
29d20 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78  nfo.aFunc[i].pEx
29d30 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
29d40 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e  ) );.      sNC.n
29d50 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49 6e 41  cFlags |= NC_InA
29d60 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  ggFunc;.      sq
29d70 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
29d80 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 73 41  AggList(&sNC, sA
29d90 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e  ggInfo.aFunc[i].
29da0 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
29db0 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
29dc0 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67 67 46  gs &= ~NC_InAggF
29dd0 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  unc;.    }.    s
29de0 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20 3d 20  AggInfo.mxReg = 
29df0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
29e00 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
29e10 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 73 65  Failed ) goto se
29e20 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20 20 2f  lect_end;..    /
29e30 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  * Processing for
29e40 20 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68   aggregates with
29e50 20 47 52 4f 55 50 20 42 59 20 69 73 20 76 65 72   GROUP BY is ver
29e60 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e 64 0a  y different and.
29e70 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f 72 65      ** much more
29e80 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20 61 67   complex than ag
29e90 67 72 65 67 61 74 65 73 20 77 69 74 68 6f 75 74  gregates without
29ea0 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20 20 20   a GROUP BY..   
29eb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
29ec0 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 4b 65  upBy ){.      Ke
29ed0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
29ee0 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e 66 6f    /* Keying info
29ef0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
29f00 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73 65 20  group by clause 
29f10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 31 3b  */.      int j1;
29f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f30 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69 73 69  A-vs-B comparisi
29f40 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20 20 20  on jump */.     
29f50 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75 74 52   int addrOutputR
29f60 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ow;  /* Start of
29f70 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
29f80 20 6f 75 74 70 75 74 73 20 61 20 72 65 73 75 6c   outputs a resul
29f90 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  t row */.      i
29fa0 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f 77 3b  nt regOutputRow;
29fb0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64     /* Return add
29fc0 72 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f  ress register fo
29fd0 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  r output subrout
29fe0 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ine */.      int
29ff0 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b 20 20   addrSetAbort;  
2a000 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62 6f 72   /* Set the abor
2a010 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74 75 72  t flag and retur
2a020 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61  n */.      int a
2a030 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20 20 2f  ddrTopOfLoop;  /
2a040 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e 70  * Top of the inp
2a050 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  ut loop */.     
2a060 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69 6e 67   int addrSorting
2a070 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50 5f 4f  Idx; /* The OP_O
2a080 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66 6f 72  penEphemeral for
2a090 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69 6e 64   the sorting ind
2a0a0 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ex */.      int 
2a0b0 61 64 64 72 52 65 73 65 74 3b 20 20 20 20 20 20  addrReset;      
2a0c0 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20 66 6f  /* Subroutine fo
2a0d0 72 20 72 65 73 65 74 74 69 6e 67 20 74 68 65 20  r resetting the 
2a0e0 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f 0a 20  accumulator */. 
2a0f0 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 73 65       int regRese
2a100 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75  t;       /* Retu
2a110 72 6e 20 61 64 64 72 65 73 73 20 72 65 67 69 73  rn address regis
2a120 74 65 72 20 66 6f 72 20 72 65 73 65 74 20 73 75  ter for reset su
2a130 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20 20 20  broutine */..   
2a140 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
2a150 73 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  s a GROUP BY cla
2a160 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e 65 65  use we might nee
2a170 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  d a sorting inde
2a180 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 69 6d  x to.      ** im
2a190 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41 6c 6c  plement it.  All
2a1a0 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72 74 69  ocate that sorti
2a1b0 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20 20 49  ng index now.  I
2a1c0 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74 0a 20  f it turns out. 
2a1d0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
2a1e0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74 20 61  do not need it a
2a1f0 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20 4f 50  fter all, the OP
2a200 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e 73 74  _SorterOpen inst
2a210 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ruction.      **
2a220 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
2a230 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70 2e 20  ed into a Noop. 
2a240 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
2a250 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2a260 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e  gIdx = pParse->n
2a270 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70 4b 65  Tab++;.      pKe
2a280 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f 46  yInfo = keyInfoF
2a290 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72  romExprList(pPar
2a2a0 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 29  se, pGroupBy, 0)
2a2b0 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f 72 74  ;.      addrSort
2a2c0 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74 65 33  ingIdx = sqlite3
2a2d0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
2a2e0 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a 20 20  _SorterOpen, .  
2a2f0 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f          sAggInfo
2a300 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 41 67  .sortingIdx, sAg
2a310 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67 43 6f  gInfo.nSortingCo
2a320 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  lumn, .         
2a330 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65 79 49   0, (char*)pKeyI
2a340 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  nfo, P4_KEYINFO)
2a350 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
2a360 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f  ialize memory lo
2a370 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20  cations used by 
2a380 47 52 4f 55 50 20 42 59 20 61 67 67 72 65 67 61  GROUP BY aggrega
2a390 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20  te processing.  
2a3a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73      */.      iUs
2a3b0 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65  eFlag = ++pParse
2a3c0 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41  ->nMem;.      iA
2a3d0 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61  bortFlag = ++pPa
2a3e0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
2a3f0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20   regOutputRow = 
2a400 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2a410 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2a420 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
2a430 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
2a440 20 20 20 20 20 72 65 67 52 65 73 65 74 20 3d 20       regReset = 
2a450 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2a460 20 20 20 20 20 20 61 64 64 72 52 65 73 65 74 20        addrReset 
2a470 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
2a480 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
2a490 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d   iAMem = pParse-
2a4a0 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20  >nMem + 1;.     
2a4b0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2a4c0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2a4d0 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20  ;.      iBMem = 
2a4e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31  pParse->nMem + 1
2a4f0 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
2a500 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79  nMem += pGroupBy
2a510 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->nExpr;.      s
2a520 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2a530 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2a540 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  0, iAbortFlag);.
2a550 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2a560 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f  t((v, "clear abo
2a570 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2a580 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2a590 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2a5a0 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 0, iUseFlag);
2a5b0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2a5c0 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
2a5d0 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70   accumulator emp
2a5e0 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ty"));.      sql
2a5f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
2a600 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41  , OP_Null, 0, iA
2a610 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75  Mem, iAMem+pGrou
2a620 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a  pBy->nExpr-1);..
2a630 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61        /* Begin a
2a640 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
2a650 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72  extract all sour
2a660 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50  ce rows in GROUP
2a670 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20   BY order..     
2a680 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69   ** This might i
2a690 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72  nvolve two separ
2a6a0 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61  ate loops with a
2a6b0 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74  n OP_Sort in bet
2a6c0 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a  ween, or.      *
2a6d0 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  * it might be a 
2a6e0 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74  single loop that
2a6f0 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74   uses an index t
2a700 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d  o extract inform
2a710 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ation.      ** i
2a720 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72 64 65  n the right orde
2a730 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e  r to begin with.
2a740 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2a750 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a760 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72  2(v, OP_Gosub, r
2a770 65 67 52 65 73 65 74 2c 20 61 64 64 72 52 65 73  egReset, addrRes
2a780 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66  et);.      pWInf
2a790 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  o = sqlite3Where
2a7a0 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54  Begin(pParse, pT
2a7b0 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20  abList, pWhere, 
2a7c0 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 0a 20 20  pGroupBy, 0, .  
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
2a7f0 48 45 52 45 5f 47 52 4f 55 50 42 59 2c 20 30 29  HERE_GROUPBY, 0)
2a800 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
2a810 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
2a820 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
2a830 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65 49  f( sqlite3WhereI
2a840 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29  sOrdered(pWInfo)
2a850 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2a860 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69 73 20  he optimizer is 
2a870 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65 72 20  able to deliver 
2a880 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20 62 79  rows in group by
2a890 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20 20 20   order so.      
2a8a0 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74 20 68    ** we do not h
2a8b0 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20 54 68  ave to sort.  Th
2a8c0 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
2a8d0 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20 62 65  al table will be
2a8e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6e 63  .        ** canc
2a8f0 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65 63 61  elled later beca
2a900 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e 65 65  use we still nee
2a910 64 20 74 6f 20 75 73 65 20 74 68 65 20 70 4b 65  d to use the pKe
2a920 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20 2a 2f  yInfo.        */
2a930 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70 42 79  .        groupBy
2a940 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Sort = 0;.      
2a950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2a960 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d 69 6e  * Rows are comin
2a970 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74 65 72  g out in undeter
2a980 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20 57 65  mined order.  We
2a990 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a 20 20   have to push.  
2a9a0 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20 72 6f        ** each ro
2a9b0 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69 6e 67  w into a sorting
2a9c0 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e 61 74   index, terminat
2a9d0 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f 6f 70  e the first loop
2a9e0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
2a9f0 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20  n loop over the 
2aa00 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 69 6e  sorting index in
2aa10 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68   order to get th
2aa20 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20 20 20  e output.       
2aa30 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20 6f 72   ** in sorted or
2aa40 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  der.        */. 
2aa50 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 42 61         int regBa
2aa60 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se;.        int 
2aa70 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20 20 20  regRecord;.     
2aa80 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 20     int nCol;.   
2aa90 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75 70 42       int nGroupB
2aaa0 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78 70 6c  y;..        expl
2aab0 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61  ainTempTable(pPa
2aac0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
2aad0 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69 73 54    (sDistinct.isT
2aae0 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c  nct && (p->selFl
2aaf0 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63 74 29  ags&SF_Distinct)
2ab00 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
2ab10 20 20 20 20 20 20 20 20 20 20 20 22 44 49 53 54             "DIST
2ab20 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50 20 42  INCT" : "GROUP B
2ab30 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 67 72  Y");..        gr
2ab40 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b 0a 20  oupBySort = 1;. 
2ab50 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42 79 20         nGroupBy 
2ab60 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  = pGroupBy->nExp
2ab70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 20  r;.        nCol 
2ab80 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31 3b 0a  = nGroupBy + 1;.
2ab90 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f          j = nGro
2aba0 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20  upBy+1;.        
2abb0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49  for(i=0; i<sAggI
2abc0 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  nfo.nColumn; i++
2abd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2abe0 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 5b 69   sAggInfo.aCol[i
2abf0 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e  ].iSorterColumn>
2ac00 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =j ){.          
2ac10 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
2ac20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2ac30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ac40 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
2ac50 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2ac60 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
2ac70 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
2ac80 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
2ac90 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
2aca0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
2acb0 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
2acc0 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20 72  rse, pGroupBy, r
2acd0 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20 20 20  egBase, 0);.    
2ace0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2acf0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 71 75  ddOp2(v, OP_Sequ
2ad00 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f 2e 73  ence, sAggInfo.s
2ad10 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42 61 73  ortingIdx,regBas
2ad20 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20 20 20  e+nGroupBy);.   
2ad30 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75 70 42       j = nGroupB
2ad40 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  y+1;.        for
2ad50 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
2ad60 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  .nColumn; i++){.
2ad70 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2ad80 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43   AggInfo_col *pC
2ad90 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f 2e 61  ol = &sAggInfo.a
2ada0 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
2adb0 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53 6f 72    if( pCol->iSor
2adc0 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 7b 0a  terColumn>=j ){.
2add0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2ade0 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61 73 65  r1 = j + regBase
2adf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
2ae00 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20 20 20  t r2;..         
2ae10 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
2ae20 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
2ae30 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
2ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae50 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70           pCol->p
2ae60 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75  Tab, pCol->iColu
2ae70 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65  mn, pCol->iTable
2ae80 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  , r1, 0);.      
2ae90 20 20 20 20 20 20 69 66 28 20 72 31 21 3d 72 32        if( r1!=r2
2aea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2aeb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2aec0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
2aed0 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20   r2, r1);.      
2aee0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2aef0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 20      j++;.       
2af00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2af10 20 20 20 20 20 20 20 72 65 67 52 65 63 6f 72 64         regRecord
2af20 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
2af30 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
2af40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2af50 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
2af60 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42 61 73  keRecord, regBas
2af70 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65 63 6f  e, nCol, regReco
2af80 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  rd);.        sql
2af90 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2afa0 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
2afb0 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74  t, sAggInfo.sort
2afc0 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63 6f 72  ingIdx, regRecor
2afd0 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  d);.        sqli
2afe0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
2aff0 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
2b000 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2b010 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2b020 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  Range(pParse, re
2b030 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a 20 20  gBase, nCol);.  
2b040 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2b050 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20  reEnd(pWInfo);. 
2b060 20 20 20 20 20 20 20 73 41 67 67 49 6e 66 6f 2e         sAggInfo.
2b070 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62 20 3d  sortingIdxPTab =
2b080 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50 61 72   sortPTab = pPar
2b090 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
2b0a0 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20 73 71      sortOut = sq
2b0b0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
2b0c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
2b0d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2b0e0 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
2b0f0 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c 20 73  udo, sortPTab, s
2b100 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b 0a 20  ortOut, nCol);. 
2b110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2b120 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2b130 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67 67 49  orterSort, sAggI
2b140 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2b150 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20  addrEnd);.      
2b160 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
2b170 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f 72 74  , "GROUP BY sort
2b180 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73 41 67  "));.        sAg
2b190 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69 6e 67  gInfo.useSorting
2b1a0 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Idx = 1;.       
2b1b0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2b1c0 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2b1d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
2b1e0 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 63  * Evaluate the c
2b1f0 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42 59 20  urrent GROUP BY 
2b200 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72 65 20  terms and store 
2b210 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e 2e 2e  in b0, b1, b2...
2b220 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20 69 73  .      ** (b0 is
2b230 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2b240 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69 73 20   iBMem+0, b1 is 
2b250 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73 6f 20  iBMem+1, and so 
2b260 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a 2a 20  forth).      ** 
2b270 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74 68 65  Then compare the
2b280 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
2b290 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73 74 20  Y terms against 
2b2a0 74 68 65 20 47 52 4f 55 50 20 42 59 20 74 65 72  the GROUP BY ter
2b2b0 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ms.      ** from
2b2c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 6f   the previous ro
2b2d0 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  w currently stor
2b2e0 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20 61 32  ed in a0, a1, a2
2b2f0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ....      */.   
2b300 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70     addrTopOfLoop
2b310 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
2b320 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
2b330 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2b340 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2b350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f  );.      if( gro
2b360 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20  upBySort ){.    
2b370 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b380 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
2b390 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e 66 6f  erData, sAggInfo
2b3a0 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73 6f 72  .sortingIdx, sor
2b3b0 74 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tOut);.      }. 
2b3c0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2b3d0 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
2b3e0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
2b3f0 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74 20 29  f( groupBySort )
2b400 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2b410 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2b420 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f 72 74   OP_Column, sort
2b430 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d 2b 6a  PTab, j, iBMem+j
2b440 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2b450 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56   j==0 ) sqlite3V
2b460 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
2b470 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43 48 45  PFLAG_CLEARCACHE
2b480 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2b490 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41 67 67  {.          sAgg
2b4a0 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64 65 20  Info.directMode 
2b4b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 73  = 1;.          s
2b4c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
2b4d0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2d  Parse, pGroupBy-
2b4e0 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69 42 4d  >a[j].pExpr, iBM
2b4f0 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 7d  em+j);.        }
2b500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2b510 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2b520 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20  (v, OP_Compare, 
2b530 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20 70 47  iAMem, iBMem, pG
2b540 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c 0a 20  roupBy->nExpr,. 
2b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b560 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2b570 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65  sqlite3KeyInfoRe
2b580 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20 50 34 5f  f(pKeyInfo), P4_
2b590 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
2b5a0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
2b5b0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2b5c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b5d0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75  eAddOp3(v, OP_Ju
2b5e0 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b  mp, j1+1, 0, j1+
2b5f0 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  1);..      /* Ge
2b600 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
2b610 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74   runs whenever t
2b620 68 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e  he GROUP BY chan
2b630 67 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ges..      ** Ch
2b640 61 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f  anges in the GRO
2b650 55 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74  UP BY are detect
2b660 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
2b670 75 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a  us code.      **
2b680 20 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72   block.  If ther
2b690 65 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65  e were no change
2b6a0 73 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73  s, this block is
2b6b0 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20   skipped..      
2b6c0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  **.      ** This
2b6d0 20 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72   code copies cur
2b6e0 72 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65  rent group by te
2b6f0 72 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c  rms in b0,b1,b2,
2b700 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ....      ** ove
2b710 72 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20  r to a0,a1,a2.  
2b720 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
2b730 65 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74  e output subrout
2b740 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ine.      ** and
2b750 20 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72   resets the aggr
2b760 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
2b770 72 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70  r registers in p
2b780 72 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20  reparation.     
2b790 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74   ** for the next
2b7a0 20 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e   GROUP BY batch.
2b7b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2b7c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d  sqlite3ExprCodeM
2b7d0 6f 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65  ove(pParse, iBMe
2b7e0 6d 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70  m, iAMem, pGroup
2b7f0 42 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  By->nExpr);.    
2b800 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b810 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2b820 20 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61   regOutputRow, a
2b830 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  ddrOutputRow);. 
2b840 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2b850 28 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65  ((v, "output one
2b860 20 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73   row"));.      s
2b870 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2b880 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41  (v, OP_IfPos, iA
2b890 62 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e  bortFlag, addrEn
2b8a0 64 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  d);.      VdbeCo
2b8b0 6d 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b  mment((v, "check
2b8c0 20 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a   abort flag"));.
2b8d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b8e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2b8f0 73 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61  sub, regReset, a
2b900 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
2b910 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
2b920 20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61   "reset accumula
2b930 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
2b940 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67  * Update the agg
2b950 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74  regate accumulat
2b960 6f 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ors based on the
2b970 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20   content of.    
2b980 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2b990 20 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20   row.      */.  
2b9a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
2b9b0 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
2b9c0 20 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75        updateAccu
2b9d0 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
2b9e0 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
2b9f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2ba00 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
2ba10 72 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b  r, 1, iUseFlag);
2ba20 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
2ba30 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65  nt((v, "indicate
2ba40 20 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c   data in accumul
2ba50 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20  ator"));..      
2ba60 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f  /* End of the lo
2ba70 6f 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  op.      */.    
2ba80 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
2ba90 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
2baa0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2bab0 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
2bac0 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e   sAggInfo.sortin
2bad0 67 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c  gIdx, addrTopOfL
2bae0 6f 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oop);.      }els
2baf0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
2bb00 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66  e3WhereEnd(pWInf
2bb10 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
2bb20 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
2bb30 6f 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69  oop(v, addrSorti
2bb40 6e 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a  ngIdx);.      }.
2bb50 0a 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  .      /* Output
2bb60 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f   the final row o
2bb70 66 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a  f result.      *
2bb80 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  /.      sqlite3V
2bb90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
2bba0 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74  Gosub, regOutput
2bbb0 52 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52  Row, addrOutputR
2bbc0 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
2bbd0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70  omment((v, "outp
2bbe0 75 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b  ut final row"));
2bbf0 0a 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20  ..      /* Jump 
2bc00 6f 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74  over the subrout
2bc10 69 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ines.      */.  
2bc20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2bc30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
2bc40 2c 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a  , 0, addrEnd);..
2bc50 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
2bc60 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74  e a subroutine t
2bc70 68 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69  hat outputs a si
2bc80 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20  ngle row of the 
2bc90 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20  result.      ** 
2bca0 73 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f  set.  This subro
2bcb0 75 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b  utine first look
2bcc0 73 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61  s at the iUseFla
2bcd0 67 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a  g.  If iUseFlag.
2bce0 20 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73        ** is less
2bcf0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
2bd00 6f 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72  o zero, the subr
2bd10 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
2bd20 70 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20  p.  If.      ** 
2bd30 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63  the processing c
2bd40 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65  alls for the que
2bd50 72 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69  ry to abort, thi
2bd60 73 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20  s subroutine.   
2bd70 20 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73     ** increments
2bd80 20 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20   the iAbortFlag 
2bd90 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
2bda0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2bdb0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64   in.      ** ord
2bdc0 65 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65  er to signal the
2bdd0 20 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74   caller to abort
2bde0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2bdf0 20 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20   addrSetAbort = 
2be00 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
2be10 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
2be20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2be30 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2be40 2c 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 1, iAbortFlag)
2be50 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2be60 65 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f  ent((v, "set abo
2be70 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  rt flag"));.    
2be80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2be90 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e  Op1(v, OP_Return
2bea0 2c 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b  , regOutputRow);
2beb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2bec0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2bed0 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29  , addrOutputRow)
2bee0 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
2bef0 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
2bf00 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2bf10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bf20 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2bf30 5f 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67  _IfPos, iUseFlag
2bf40 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
2bf50 32 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  2);.      VdbeCo
2bf60 6d 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70  mment((v, "Group
2bf70 62 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61  by result genera
2bf80 74 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22  tor entry point"
2bf90 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
2bfa0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2bfb0 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74  P_Return, regOut
2bfc0 70 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66  putRow);.      f
2bfd0 69 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69  inalizeAggFuncti
2bfe0 6f 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67  ons(pParse, &sAg
2bff0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
2c000 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
2c010 28 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67  (pParse, pHaving
2c020 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b  , addrOutputRow+
2c030 31 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  1, SQLITE_JUMPIF
2c040 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c  NULL);.      sel
2c050 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
2c060 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
2c070 74 2c 20 2d 31 2c 20 70 4f 72 64 65 72 42 79 2c  t, -1, pOrderBy,
2c080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c090 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63         &sDistinc
2c0a0 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20  t, pDest,.      
2c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0c0 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c  addrOutputRow+1,
2c0d0 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a   addrSetAbort);.
2c0e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c0f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65  eAddOp1(v, OP_Re
2c100 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52  turn, regOutputR
2c110 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ow);.      VdbeC
2c120 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20  omment((v, "end 
2c130 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67  groupby result g
2c140 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20  enerator"));..  
2c150 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2c160 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
2c170 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65  t will reset the
2c180 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75   group-by accumu
2c190 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20  lator.      */. 
2c1a0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c1b0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2c1c0 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20  addrReset);.    
2c1d0 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74    resetAccumulat
2c1e0 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  or(pParse, &sAgg
2c1f0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2c200 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2c210 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
2c220 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20  Reset);.     .  
2c230 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72    } /* endif pGr
2c240 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67  oupBy.  Begin ag
2c250 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20  gregate queries 
2c260 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59  without GROUP BY
2c270 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a  : */.    else {.
2c280 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
2c290 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65  pDel = 0;.#ifnde
2c2a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  f SQLITE_OMIT_BT
2c2b0 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54  REECOUNT.      T
2c2c0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
2c2d0 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73    if( (pTab = is
2c2e0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26  SimpleCount(p, &
2c2f0 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b  sAggInfo))!=0 ){
2c300 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69  .        /* If i
2c310 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72  sSimpleCount() r
2c320 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
2c330 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75   to a Table stru
2c340 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20  cture, then.    
2c350 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73      ** the SQL s
2c360 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74  tatement is of t
2c370 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20  he form:.       
2c380 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
2c390 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
2c3a0 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20   FROM <tbl>.    
2c3b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2c3c0 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c  * where the Tabl
2c3d0 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75  e structure retu
2c3e0 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20  rned represents 
2c3f0 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20  table <tbl>..   
2c400 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2c410 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e  ** This statemen
2c420 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74  t is so common t
2c430 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69  hat it is optimi
2c440 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54  zed specially. T
2c450 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50  he.        ** OP
2c460 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69  _Count instructi
2c470 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65  on is executed e
2c480 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74  ither on the int
2c490 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20  key table that. 
2c4a0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
2c4b0 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20  ns the data for 
2c4c0 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f  table <tbl> or o
2c4d0 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64  n one of its ind
2c4e0 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20  exes. It.       
2c4f0 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f   ** is better to
2c500 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20   execute the op 
2c510 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20  on an index, as 
2c520 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f  indexes are almo
2c530 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  st.        ** al
2c540 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f  ways spread acro
2c550 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68  ss less pages th
2c560 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70  an their corresp
2c570 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20  onding tables.. 
2c580 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2c590 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20    const int iDb 
2c5a0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2c5b0 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
2c5c0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
2c5d0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
2c5e0 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72   int iCsr = pPar
2c5f0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20  se->nTab++;     
2c600 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61  /* Cursor to sca
2c610 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20  n b-tree */.    
2c620 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
2c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c640 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2c650 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2c660 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
2c670 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20   *pKeyInfo = 0; 
2c680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c690 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61   Keyinfo for sca
2c6a0 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20  nned index */.  
2c6b0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65        Index *pBe
2c6c0 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
2c6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
2c6e0 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73  st index found s
2c6f0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20  o far */.       
2c700 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61   int iRoot = pTa
2c710 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  b->tnum;        
2c720 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
2c730 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d  ge of scanned b-
2c740 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tree */..       
2c750 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
2c760 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
2c770 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
2c780 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
2c790 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
2c7a0 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62  b->tnum, 0, pTab
2c7b0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20  ->zName);..     
2c7c0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
2c7d0 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   the index that 
2c7e0 68 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73  has the lowest s
2c7f0 63 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20  can cost..      
2c800 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2c810 28 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20  (2011-04-15) Do 
2c820 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63  not do a full sc
2c830 61 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72  an of an unorder
2c840 65 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  ed index..      
2c850 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2c860 28 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20  (2013-10-03) Do 
2c870 6e 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e  not count the en
2c880 74 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69  tries in a parti
2c890 61 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  al index..      
2c8a0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
2c8b0 49 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20  In practice the 
2c8c0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
2c8d0 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  e will not be us
2c8e0 65 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a  ed. It is only .
2c8f0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65          ** passe
2c900 64 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65  d to keep OP_Ope
2c910 6e 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20  nRead happy..   
2c920 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2c930 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
2c940 61 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71  ab) ) pBest = sq
2c950 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
2c960 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
2c970 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
2c980 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
2c990 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
2c9a0 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t){.          if
2c9b0 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72  ( pIdx->bUnorder
2c9c0 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ed==0.          
2c9d0 20 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52   && pIdx->szIdxR
2c9e0 6f 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f  ow<pTab->szTabRo
2c9f0 77 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  w.           && 
2ca00 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68  pIdx->pPartIdxWh
2ca10 65 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ere==0.         
2ca20 20 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20    && (!pBest || 
2ca30 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  pIdx->szIdxRow<p
2ca40 42 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a  Best->szIdxRow).
2ca50 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
2ca60 20 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d           pBest =
2ca70 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20   pIdx;.         
2ca80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2ca90 20 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29       if( pBest )
2caa0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f  {.          iRoo
2cab0 74 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b  t = pBest->tnum;
2cac0 0a 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49  .          pKeyI
2cad0 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  nfo = sqlite3Key
2cae0 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
2caf0 73 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  se, pBest);.    
2cb00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2cb10 2a 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e  * Open a read-on
2cb20 6c 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75  ly cursor, execu
2cb30 74 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c  te the OP_Count,
2cb40 20 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f   close the curso
2cb50 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  r. */.        sq
2cb60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2cb70 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  nt(v, OP_OpenRea
2cb80 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20  d, iCsr, iRoot, 
2cb90 69 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  iDb, 1);.       
2cba0 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
2cbb0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2cbc0 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
2cbd0 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
2cbe0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
2cbf0 46 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  FO);.        }. 
2cc00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2cc10 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
2cc20 6f 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67  ount, iCsr, sAgg
2cc30 49 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d  Info.aFunc[0].iM
2cc40 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
2cc50 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2cc60 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72  , OP_Close, iCsr
2cc70 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61  );.        expla
2cc80 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50  inSimpleCount(pP
2cc90 61 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73  arse, pTab, pBes
2cca0 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  t);.      }else.
2ccb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2ccc0 5f 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54  _OMIT_BTREECOUNT
2ccd0 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   */.      {.    
2cce0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20      /* Check if 
2ccf0 74 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20  the query is of 
2cd00 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  one of the follo
2cd10 77 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20  wing forms:.    
2cd20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2cd30 2a 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  *   SELECT min(x
2cd40 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20  ) FROM ....     
2cd50 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d     **   SELECT m
2cd60 61 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20  ax(x) FROM .... 
2cd70 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2cd80 20 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74    ** If it is, t
2cd90 68 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65  hen ask the code
2cda0 20 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61   in where.c to a
2cdb0 74 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72  ttempt to sort r
2cdc0 65 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a  esults.        *
2cdd0 2a 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61  * as if there wa
2cde0 73 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78  s an "ORDER ON x
2cdf0 22 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78  " or "ORDER ON x
2ce00 20 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a   DESC" clause. .
2ce10 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68          ** If wh
2ce20 65 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f  ere.c is able to
2ce30 20 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73   produce results
2ce40 20 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20   sorted in this 
2ce50 6f 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20  order, then.    
2ce60 20 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20      ** add vdbe 
2ce70 63 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75  code to break ou
2ce80 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  t of the process
2ce90 69 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74  ing loop after t
2cea0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  he .        ** f
2ceb0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28  irst iteration (
2cec0 73 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20  since the first 
2ced0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
2cee0 20 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20   loop is .      
2cef0 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20    ** guaranteed 
2cf00 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
2cf10 65 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d  e row with the m
2cf20 69 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75  inimum or maximu
2cf30 6d 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  m .        ** va
2cf40 6c 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e  lue of x, the on
2cf50 6c 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29  ly row required)
2cf60 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2cf70 20 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61       ** A specia
2cf80 6c 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70  l flag must be p
2cf90 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
2cfa0 57 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20  WhereBegin() to 
2cfb0 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20  slightly.       
2cfc0 20 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76   ** modify behav
2cfd0 69 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ior as follows:.
2cfe0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2cff0 20 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65     **   + If the
2d000 20 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c   query is a "SEL
2d010 45 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65  ECT min(x)", the
2d020 6e 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64  n the loop coded
2d030 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   by.        **  
2d040 20 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c     where.c shoul
2d050 64 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76  d not iterate ov
2d060 65 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69  er any values wi
2d070 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a  th a NULL value.
2d080 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66          **     f
2d090 6f 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a  or x..        **
2d0a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20  .        **   + 
2d0b0 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f  The optimizer co
2d0c0 64 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74  de in where.c (t
2d0d0 68 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65  he thing that de
2d0e0 63 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20  cides which.    
2d0f0 20 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78      **     index
2d100 20 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75   or indices to u
2d110 73 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65  se) should place
2d120 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69   a different pri
2d130 6f 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20  ority on .      
2d140 20 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79    **     satisfy
2d150 69 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42  ing the 'ORDER B
2d160 59 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69  Y' clause than i
2d170 74 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20  t does in other 
2d180 63 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  cases..        *
2d190 2a 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63  *     Refer to c
2d1a0 6f 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ode and comments
2d1b0 20 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20   in where.c for 
2d1c0 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20  details..       
2d1d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
2d1e0 4c 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20  List *pMinMax = 
2d1f0 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c  0;.        u8 fl
2d200 61 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  ag = WHERE_ORDER
2d210 42 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20  BY_NORMAL;.     
2d220 20 20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65     .        asse
2d230 72 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d  rt( p->pGroupBy=
2d240 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
2d250 73 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b  sert( flag==0 );
2d260 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
2d270 70 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20  pHaving==0 ){.  
2d280 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d          flag = m
2d290 69 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67 67  inMaxQuery(&sAgg
2d2a0 49 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b  Info, &pMinMax);
2d2b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d2c0 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d     assert( flag=
2d2d0 3d 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d  =0 || (pMinMax!=
2d2e0 30 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45  0 && pMinMax->nE
2d2f0 78 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20  xpr==1) );..    
2d300 20 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a      if( flag ){.
2d310 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61            pMinMa
2d320 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  x = sqlite3ExprL
2d330 69 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d  istDup(db, pMinM
2d340 61 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ax, 0);.        
2d350 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78    pDel = pMinMax
2d360 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d370 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e  pMinMax && !db->
2d380 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
2d390 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e              pMin
2d3a0 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  Max->a[0].sortOr
2d3b0 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52  der = flag!=WHER
2d3c0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31  E_ORDERBY_MIN ?1
2d3d0 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  :0;.            
2d3e0 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45  pMinMax->a[0].pE
2d3f0 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
2d400 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UMN;.          }
2d410 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  .        }.  .  
2d420 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
2d430 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61  se runs if the a
2d440 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20  ggregate has no 
2d450 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
2d460 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a    The.        **
2d470 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d   processing is m
2d480 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63  uch simpler sinc
2d490 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  e there is only 
2d4a0 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20  a single row.   
2d4b0 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75       ** of outpu
2d4c0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
2d4d0 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d        resetAccum
2d4e0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
2d4f0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
2d500 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69     pWInfo = sqli
2d510 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50  te3WhereBegin(pP
2d520 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2d530 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c  pWhere, pMinMax,
2d540 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20  0,flag,0);.     
2d550 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30     if( pWInfo==0
2d560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2d570 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2d580 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
2d590 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
2d5a0 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20  lect_end;.      
2d5b0 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61    }.        upda
2d5c0 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50  teAccumulator(pP
2d5d0 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
2d5e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2d5f0 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20  ( pMinMax==0 || 
2d600 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d  pMinMax->nExpr==
2d610 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
2d620 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f   sqlite3WhereIsO
2d630 72 64 65 72 65 64 28 70 57 49 6e 66 6f 29 20 29  rdered(pWInfo) )
2d640 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2d650 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
2d660 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c   OP_Goto, 0, sql
2d670 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
2d680 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20  bel(pWInfo));.  
2d690 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
2d6a0 65 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79  ent((v, "%s() by
2d6b0 20 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20   index",.       
2d6c0 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d           (flag==
2d6d0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
2d6e0 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29  N?"min":"max")))
2d6f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2d700 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
2d710 45 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20  End(pWInfo);.   
2d720 20 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67       finalizeAgg
2d730 46 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65  Functions(pParse
2d740 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20  , &sAggInfo);.  
2d750 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72      }..      pOr
2d760 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
2d770 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
2d780 6c 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76  lse(pParse, pHav
2d790 69 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51  ing, addrEnd, SQ
2d7a0 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
2d7b0 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e  ;.      selectIn
2d7c0 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20  nerLoop(pParse, 
2d7d0 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31  p, p->pEList, -1
2d7e0 2c 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  , 0, 0, .       
2d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d800 44 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61  Dest, addrEnd, a
2d810 64 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73  ddrEnd);.      s
2d820 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2d830 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
2d840 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2d850 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2d860 6c 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  l(v, addrEnd);. 
2d870 20 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66     .  } /* endif
2d880 20 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79   aggregate query
2d890 20 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74   */..  if( sDist
2d8a0 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d  inct.eTnctType==
2d8b0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2d8c0 4e 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20  NORDERED ){.    
2d8d0 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65  explainTempTable
2d8e0 28 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e  (pParse, "DISTIN
2d8f0 43 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CT");.  }..  /* 
2d900 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f  If there is an O
2d910 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2d920 74 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20  then we need to 
2d930 73 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73  sort the results
2d940 0a 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74  .  ** and send t
2d950 68 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62  hem to the callb
2d960 61 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a  ack one by one..
2d970 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65    */.  if( pOrde
2d980 72 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  rBy ){.    expla
2d990 69 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72  inTempTable(pPar
2d9a0 73 65 2c 20 22 4f 52 44 45 52 20 42 59 22 29 3b  se, "ORDER BY");
2d9b0 0a 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72  .    generateSor
2d9c0 74 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c  tTail(pParse, p,
2d9d0 20 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70   v, pEList->nExp
2d9e0 72 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a  r, pDest);.  }..
2d9f0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
2da00 6f 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72  o skip this quer
2da10 79 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  y.  */.  sqlite3
2da20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2da30 28 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a  (v, iEnd);..  /*
2da40 20 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20   The SELECT was 
2da50 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64  successfully cod
2da60 65 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65  ed.   Set the re
2da70 74 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20  turn code to 0. 
2da80 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
2da90 6e 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a  no errors..  */.
2daa0 20 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20    rc = 0;..  /* 
2dab0 43 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f  Control jumps to
2dac0 20 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f   here if an erro
2dad0 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
2dae0 20 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a   above, or upon.
2daf0 20 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20    ** successful 
2db00 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45  coding of the SE
2db10 4c 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63  LECT..  */.selec
2db20 74 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e  t_end:.  explain
2db30 53 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73  SetInteger(pPars
2db40 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52  e->iSelectId, iR
2db50 65 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b  estoreSelectId);
2db60 0a 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20  ..  /* Identify 
2db70 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20  column names if 
2db80 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53  results of the S
2db90 45 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20  ELECT are to be 
2dba0 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69  output..  */.  i
2dbb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2dbc0 20 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74   && pDest->eDest
2dbd0 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a  ==SRT_Output ){.
2dbe0 20 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75      generateColu
2dbf0 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20  mnNames(pParse, 
2dc00 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
2dc10 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
2dc20 33 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67  3DbFree(db, sAgg
2dc30 49 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71  Info.aCol);.  sq
2dc40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2dc50 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b  sAggInfo.aFunc);
2dc60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2dc70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2dc80 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
2dc90 45 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47  EXPLAIN)./*.** G
2dca0 65 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d  enerate a human-
2dcb0 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70  readable descrip
2dcc0 74 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65  tion of a the Se
2dcd0 6c 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  lect object..*/.
2dce0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
2dcf0 61 69 6e 4f 6e 65 53 65 6c 65 63 74 28 56 64 62  ainOneSelect(Vdb
2dd00 65 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74  e *pVdbe, Select
2dd10 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 45   *p){.  sqlite3E
2dd20 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2dd30 62 65 2c 20 22 53 45 4c 45 43 54 20 22 29 3b 0a  be, "SELECT ");.
2dd40 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
2dd50 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74  s & (SF_Distinct
2dd60 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29  |SF_Aggregate) )
2dd70 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  {.    if( p->sel
2dd80 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69  Flags & SF_Disti
2dd90 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nct ){.      sql
2dda0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2ddb0 66 28 70 56 64 62 65 2c 20 22 44 49 53 54 49 4e  f(pVdbe, "DISTIN
2ddc0 43 54 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  CT ");.    }.   
2ddd0 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2dde0 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20   & SF_Aggregate 
2ddf0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2de00 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2de10 64 62 65 2c 20 22 61 67 67 5f 66 6c 61 67 20 22  dbe, "agg_flag "
2de20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2de30 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56  ite3ExplainNL(pV
2de40 64 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dbe);.    sqlite
2de50 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2de60 56 64 62 65 2c 20 22 20 20 20 22 29 3b 0a 20 20  Vdbe, "   ");.  
2de70 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  }.  sqlite3Expla
2de80 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65  inExprList(pVdbe
2de90 2c 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  , p->pEList);.  
2dea0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2deb0 28 70 56 64 62 65 29 3b 0a 20 20 69 66 28 20 70  (pVdbe);.  if( p
2dec0 2d 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72  ->pSrc && p->pSr
2ded0 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69  c->nSrc ){.    i
2dee0 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65  nt i;.    sqlite
2def0 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2df00 56 64 62 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a  Vdbe, "FROM ");.
2df10 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2df20 69 6e 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20  inPush(pVdbe);. 
2df30 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
2df40 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
2df50 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
2df60 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
2df70 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
2df80 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
2df90 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2dfa0 28 70 56 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20  (pVdbe, "{%d,*} 
2dfb0 3d 20 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72  = ", pItem->iCur
2dfc0 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  sor);.      if( 
2dfd0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
2dfe0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2dff0 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70  3ExplainSelect(p
2e000 56 64 62 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  Vdbe, pItem->pSe
2e010 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69  lect);.        i
2e020 66 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29  f( pItem->pTab )
2e030 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2e040 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2e050 28 70 56 64 62 65 2c 20 22 20 28 74 61 62 6e 61  (pVdbe, " (tabna
2e060 6d 65 3d 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e  me=%s)", pItem->
2e070 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
2e080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
2e090 6c 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a  lse if( pItem->z
2e0a0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
2e0b0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2e0c0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 22  intf(pVdbe, "%s"
2e0d0 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  , pItem->zName);
2e0e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e0f0 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
2e100 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2e110 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2e120 28 70 56 64 62 65 2c 20 22 20 28 41 53 20 25 73  (pVdbe, " (AS %s
2e130 29 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  )", pItem->zAlia
2e140 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
2e150 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69    if( pItem->joi
2e160 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20  ntype & JT_LEFT 
2e170 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e180 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2e190 70 56 64 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f  pVdbe, " LEFT-JO
2e1a0 49 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IN");.      }.  
2e1b0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2e1c0 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20  inNL(pVdbe);.   
2e1d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
2e1e0 70 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b  plainPop(pVdbe);
2e1f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57  .  }.  if( p->pW
2e200 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  here ){.    sqli
2e210 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2e220 28 70 56 64 62 65 2c 20 22 57 48 45 52 45 20 22  (pVdbe, "WHERE "
2e230 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2e240 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c  plainExpr(pVdbe,
2e250 20 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20   p->pWhere);.   
2e260 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2e270 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20  L(pVdbe);.  }.  
2e280 69 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20  if( p->pGroupBy 
2e290 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2e2a0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2e2b0 65 2c 20 22 47 52 4f 55 50 42 59 20 22 29 3b 0a  e, "GROUPBY ");.
2e2c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2e2d0 69 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65  inExprList(pVdbe
2e2e0 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  , p->pGroupBy);.
2e2f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2e300 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d  inNL(pVdbe);.  }
2e310 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e  .  if( p->pHavin
2e320 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
2e330 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2e340 64 62 65 2c 20 22 48 41 56 49 4e 47 20 22 29 3b  dbe, "HAVING ");
2e350 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2e360 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70  ainExpr(pVdbe, p
2e370 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
2e380 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2e390 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
2e3a0 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29  f( p->pOrderBy )
2e3b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2e3c0 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2e3d0 2c 20 22 4f 52 44 45 52 42 59 20 22 29 3b 0a 20  , "ORDERBY ");. 
2e3e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e3f0 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c  nExprList(pVdbe,
2e400 20 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20   p->pOrderBy);. 
2e410 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e420 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2e430 20 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20    if( p->pLimit 
2e440 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2e450 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2e460 65 2c 20 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20  e, "LIMIT ");.  
2e470 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e480 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70  Expr(pVdbe, p->p
2e490 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69  Limit);.    sqli
2e4a0 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2e4b0 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  be);.  }.  if( p
2e4c0 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
2e4d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
2e4e0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 46  rintf(pVdbe, "OF
2e4f0 46 53 45 54 20 22 29 3b 0a 20 20 20 20 73 71 6c  FSET ");.    sql
2e500 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
2e510 70 56 64 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65  pVdbe, p->pOffse
2e520 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
2e530 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b  xplainNL(pVdbe);
2e540 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
2e550 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74  te3ExplainSelect
2e560 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65  (Vdbe *pVdbe, Se
2e570 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  lect *p){.  if( 
2e580 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  p==0 ){.    sqli
2e590 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2e5a0 28 70 56 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73  (pVdbe, "(null-s
2e5b0 65 6c 65 63 74 29 22 29 3b 0a 20 20 20 20 72 65  elect)");.    re
2e5c0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
2e5d0 74 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70  te3ExplainPush(p
2e5e0 56 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Vdbe);.  while( 
2e5f0 70 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e  p ){.    explain
2e600 4f 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c  OneSelect(pVdbe,
2e610 20 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e   p);.    p = p->
2e620 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
2e630 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2e640 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e   sqlite3ExplainN
2e650 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71  L(pVdbe);.    sq
2e660 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2e670 74 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22  tf(pVdbe, "%s\n"
2e680 2c 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70  , selectOpName(p
2e690 2d 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71  ->op));.  }.  sq
2e6a0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
2e6b0 74 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29  tf(pVdbe, "END")
2e6c0 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
2e6d0 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a  inPop(pVdbe);.}.
2e6e0 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  ./* End of the s
2e6f0 74 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70  tructure debug p
2e700 72 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a  rinting code.***
2e710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
2e760 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
2e770 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45  LITE_ENABLE_TREE
2e780 5f 45 58 50 4c 41 49 4e 29 20 2a 2f 0a           _EXPLAIN) */.