/ Hex Artifact Content
Login

Artifact 28bff39f9bc5ec618b0719fe3f7b4be9f88b6f02:


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 20  fZero, iLimit); 
3c60: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
3c70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3c80: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64 64  AddOp2(v, OP_Add
3c90: 49 6d 6d 2c 20 69 4c 69 6d 69 74 2c 20 2d 31 29  Imm, iLimit, -1)
3ca0: 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
3cb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
3cc0: 76 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 20  v, OP_Goto);.   
3cd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
3ce0: 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
3cf0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
3d00: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4c 61 73 74  ddOp1(v, OP_Last
3d10: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75  , pOrderBy->iECu
3d20: 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
3d30: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
3d40: 4f 50 5f 44 65 6c 65 74 65 2c 20 70 4f 72 64 65  OP_Delete, pOrde
3d50: 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b 0a  rBy->iECursor);.
3d60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
3d70: 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 32  umpHere(v, addr2
3d80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
3d90: 41 64 64 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c  Add code to impl
3da0: 65 6d 65 6e 74 20 74 68 65 20 4f 46 46 53 45 54  ement the OFFSET
3db0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3dc0: 63 6f 64 65 4f 66 66 73 65 74 28 0a 20 20 56 64  codeOffset(.  Vd
3dd0: 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20  be *v,          
3de0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
3df0: 20 69 6e 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f   into this VM */
3e00: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 2c 20  .  int iOffset, 
3e10: 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
3e20: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 66 66   holding the off
3e30: 73 65 74 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  set counter */. 
3e40: 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 20 20   int iContinue  
3e50: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
3e60: 74 6f 20 73 6b 69 70 20 74 68 65 20 63 75 72 72  to skip the curr
3e70: 65 6e 74 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b  ent record */.){
3e80: 0a 20 20 69 66 28 20 69 4f 66 66 73 65 74 3e 30  .  if( iOffset>0
3e90: 20 26 26 20 69 43 6f 6e 74 69 6e 75 65 21 3d 30   && iContinue!=0
3ea0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64 64 72   ){.    int addr
3eb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
3ec0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 64  eAddOp2(v, OP_Ad
3ed0: 64 49 6d 6d 2c 20 69 4f 66 66 73 65 74 2c 20 2d  dImm, iOffset, -
3ee0: 31 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 73  1);.    addr = s
3ef0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
3f00: 28 76 2c 20 4f 50 5f 49 66 4e 65 67 2c 20 69 4f  (v, OP_IfNeg, iO
3f10: 66 66 73 65 74 29 3b 20 56 64 62 65 43 6f 76 65  ffset); VdbeCove
3f20: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
3f30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3f40: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43  , OP_Goto, 0, iC
3f50: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 56 64  ontinue);.    Vd
3f60: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73  beComment((v, "s
3f70: 6b 69 70 20 4f 46 46 53 45 54 20 72 65 63 6f 72  kip OFFSET recor
3f80: 64 73 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  ds"));.    sqlit
3f90: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3fa0: 2c 20 61 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  , addr);.  }.}..
3fb0: 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f 64 65 20 74  /*.** Add code t
3fc0: 68 61 74 20 77 69 6c 6c 20 63 68 65 63 6b 20 74  hat will check t
3fd0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
3fe0: 4e 20 72 65 67 69 73 74 65 72 73 20 73 74 61 72  N registers star
3ff0: 74 69 6e 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20  ting at iMem.** 
4000: 66 6f 72 6d 20 61 20 64 69 73 74 69 6e 63 74 20  form a distinct 
4010: 65 6e 74 72 79 2e 20 20 69 54 61 62 20 69 73 20  entry.  iTab is 
4020: 61 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  a sorting index 
4030: 74 68 61 74 20 68 6f 6c 64 73 20 70 72 65 76 69  that holds previ
4040: 6f 75 73 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f  ously.** seen co
4050: 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68  mbinations of th
4060: 65 20 4e 20 76 61 6c 75 65 73 2e 20 20 41 20 6e  e N values.  A n
4070: 65 77 20 65 6e 74 72 79 20 69 73 20 6d 61 64 65  ew entry is made
4080: 20 69 6e 20 69 54 61 62 0a 2a 2a 20 69 66 20 74   in iTab.** if t
4090: 68 65 20 63 75 72 72 65 6e 74 20 4e 20 76 61 6c  he current N val
40a0: 75 65 73 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a  ues are new..**.
40b0: 2a 2a 20 41 20 6a 75 6d 70 20 74 6f 20 61 64 64  ** A jump to add
40c0: 72 52 65 70 65 61 74 20 69 73 20 6d 61 64 65 20  rRepeat is made 
40d0: 61 6e 64 20 74 68 65 20 4e 2b 31 20 76 61 6c 75  and the N+1 valu
40e0: 65 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72  es are popped fr
40f0: 6f 6d 20 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20  om the.** stack 
4100: 69 66 20 74 68 65 20 74 6f 70 20 4e 20 65 6c 65  if the top N ele
4110: 6d 65 6e 74 73 20 61 72 65 20 6e 6f 74 20 64 69  ments are not di
4120: 73 74 69 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  stinct..*/.stati
4130: 63 20 76 6f 69 64 20 63 6f 64 65 44 69 73 74 69  c void codeDisti
4140: 6e 63 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nct(.  Parse *pP
4150: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
4160: 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65  sing and code ge
4170: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
4180: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20   */.  int iTab, 
4190: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 6f           /* A so
41a0: 72 74 69 6e 67 20 69 6e 64 65 78 20 75 73 65 64  rting index used
41b0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 64 69 73   to test for dis
41c0: 74 69 6e 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69  tinctness */.  i
41d0: 6e 74 20 61 64 64 72 52 65 70 65 61 74 2c 20 20  nt addrRepeat,  
41e0: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72    /* Jump to her
41f0: 65 20 69 66 20 6e 6f 74 20 64 69 73 74 69 6e 63  e if not distinc
4200: 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  t */.  int N,   
4210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4220: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
4230: 2a 2f 0a 20 20 69 6e 74 20 69 4d 65 6d 20 20 20  */.  int iMem   
4240: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
4250: 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20   element */.){. 
4260: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
4270: 72 31 3b 0a 0a 20 20 76 20 3d 20 70 50 61 72 73  r1;..  v = pPars
4280: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 72 31 20 3d  e->pVdbe;.  r1 =
4290: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
42a0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
42b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
42c0: 6e 74 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  nt(v, OP_Found, 
42d0: 69 54 61 62 2c 20 61 64 64 72 52 65 70 65 61 74  iTab, addrRepeat
42e0: 2c 20 69 4d 65 6d 2c 20 4e 29 3b 20 56 64 62 65  , iMem, N); Vdbe
42f0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
4300: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4310: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
4320: 64 2c 20 69 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b  d, iMem, N, r1);
4330: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4340: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
4350: 73 65 72 74 2c 20 69 54 61 62 2c 20 72 31 29 3b  sert, iTab, r1);
4360: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
4370: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
4380: 20 72 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66   r1);.}..#ifndef
4390: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
43a0: 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  QUERY./*.** Gene
43b0: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rate an error me
43c0: 73 73 61 67 65 20 77 68 65 6e 20 61 20 53 45 4c  ssage when a SEL
43d0: 45 43 54 20 69 73 20 75 73 65 64 20 77 69 74 68  ECT is used with
43e0: 69 6e 20 61 20 73 75 62 65 78 70 72 65 73 73 69  in a subexpressi
43f0: 6f 6e 0a 2a 2a 20 28 65 78 61 6d 70 6c 65 3a 20  on.** (example: 
4400: 20 22 61 20 49 4e 20 28 53 45 4c 45 43 54 20 2a   "a IN (SELECT *
4410: 20 46 52 4f 4d 20 74 61 62 6c 65 29 22 29 20 62   FROM table)") b
4420: 75 74 20 69 74 20 68 61 73 20 6d 6f 72 65 20 74  ut it has more t
4430: 68 61 6e 20 31 20 72 65 73 75 6c 74 0a 2a 2a 20  han 1 result.** 
4440: 63 6f 6c 75 6d 6e 2e 20 20 57 65 20 64 6f 20 74  column.  We do t
4450: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
4460: 69 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 20  ine because the 
4470: 65 72 72 6f 72 20 75 73 65 64 20 74 6f 20 6f 63  error used to oc
4480: 63 75 72 0a 2a 2a 20 69 6e 20 6d 75 6c 74 69 70  cur.** in multip
4490: 6c 65 20 70 6c 61 63 65 73 2e 20 20 28 54 68 65  le places.  (The
44a0: 20 65 72 72 6f 72 20 6f 6e 6c 79 20 6f 63 63 75   error only occu
44b0: 72 73 20 69 6e 20 6f 6e 65 20 70 6c 61 63 65 20  rs in one place 
44c0: 6e 6f 77 2c 20 62 75 74 20 77 65 0a 2a 2a 20 72  now, but we.** r
44d0: 65 74 61 69 6e 20 74 68 65 20 73 75 62 72 6f 75  etain the subrou
44e0: 74 69 6e 65 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  tine to minimize
44f0: 20 63 6f 64 65 20 64 69 73 72 75 70 74 69 6f 6e   code disruption
4500: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
4510: 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43 6f   checkForMultiCo
4520: 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72 28  lumnSelectError(
4530: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4540: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65  ,       /* Parse
4550: 20 63 6f 6e 74 65 78 74 2e 20 2a 2f 0a 20 20 53   context. */.  S
4560: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
4570: 2c 20 20 20 2f 2a 20 44 65 73 74 69 6e 61 74 69  ,   /* Destinati
4580: 6f 6e 20 6f 66 20 53 45 4c 45 43 54 20 72 65 73  on of SELECT res
4590: 75 6c 74 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ults */.  int nE
45a0: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 2f  xpr            /
45b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  * Number of resu
45c0: 6c 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  lt columns retur
45d0: 6e 65 64 20 62 79 20 53 45 4c 45 43 54 20 2a 2f  ned by SELECT */
45e0: 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65 73 74 20  .){.  int eDest 
45f0: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 0a  = pDest->eDest;.
4600: 20 20 69 66 28 20 6e 45 78 70 72 3e 31 20 26 26    if( nExpr>1 &&
4610: 20 28 65 44 65 73 74 3d 3d 53 52 54 5f 4d 65 6d   (eDest==SRT_Mem
4620: 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f 53   || eDest==SRT_S
4630: 65 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  et) ){.    sqlit
4640: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4650: 65 2c 20 22 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  e, "only a singl
4660: 65 20 72 65 73 75 6c 74 20 61 6c 6c 6f 77 65 64  e result allowed
4670: 20 66 6f 72 20 22 0a 20 20 20 20 20 20 20 22 61   for ".       "a
4680: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 73 20   SELECT that is 
4690: 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65  part of an expre
46a0: 73 73 69 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74  ssion");.    ret
46b0: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
46c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
46d0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
46e0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
46f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f   the following o
4700: 62 6a 65 63 74 20 69 73 20 75 73 65 64 20 74 6f  bject is used to
4710: 20 72 65 63 6f 72 64 20 69 6e 66 6f 72 6d 61 74   record informat
4720: 69 6f 6e 20 61 62 6f 75 74 0a 2a 2a 20 68 6f 77  ion about.** how
4730: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
4740: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
4750: 2c 20 74 6f 20 73 69 6d 70 6c 69 66 79 20 70 61  , to simplify pa
4760: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 66 6f 72  ssing that infor
4770: 6d 61 74 69 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74  mation.** into t
4780: 68 65 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c 6f  he selectInnerLo
4790: 6f 70 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  op() routine..*/
47a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
47b0: 44 69 73 74 69 6e 63 74 43 74 78 20 44 69 73 74  DistinctCtx Dist
47c0: 69 6e 63 74 43 74 78 3b 0a 73 74 72 75 63 74 20  inctCtx;.struct 
47d0: 44 69 73 74 69 6e 63 74 43 74 78 20 7b 0a 20 20  DistinctCtx {.  
47e0: 75 38 20 69 73 54 6e 63 74 3b 20 20 20 20 20 20  u8 isTnct;      
47f0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44  /* True if the D
4800: 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20  ISTINCT keyword 
4810: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
4820: 75 38 20 65 54 6e 63 74 54 79 70 65 3b 20 20 20  u8 eTnctType;   
4830: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
4840: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 2a 20 6f  ERE_DISTINCT_* o
4850: 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e  perators */.  in
4860: 74 20 74 61 62 54 6e 63 74 3b 20 20 20 20 2f 2a  t tabTnct;    /*
4870: 20 45 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   Ephemeral table
4880: 20 75 73 65 64 20 66 6f 72 20 44 49 53 54 49 4e   used for DISTIN
4890: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  CT processing */
48a0: 0a 20 20 69 6e 74 20 61 64 64 72 54 6e 63 74 3b  .  int addrTnct;
48b0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
48c0: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
48d0: 6c 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 61 62  l opcode for tab
48e0: 54 6e 63 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  Tnct */.};../*.*
48f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
4900: 65 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64  enerates the cod
4910: 65 20 66 6f 72 20 74 68 65 20 69 6e 73 69 64 65  e for the inside
4920: 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f   of the inner lo
4930: 6f 70 0a 2a 2a 20 6f 66 20 61 20 53 45 4c 45 43  op.** of a SELEC
4940: 54 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 72 63 54  T..**.** If srcT
4950: 61 62 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ab is negative, 
4960: 74 68 65 6e 20 74 68 65 20 70 45 4c 69 73 74 20  then the pEList 
4970: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
4980: 72 65 20 65 76 61 6c 75 61 74 65 64 20 69 6e 20  re evaluated in 
4990: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
49a0: 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 72   data for this r
49b0: 6f 77 2e 20 20 49 66 20 73 72 63 54 61 62 20 69  ow.  If srcTab i
49c0: 73 0a 2a 2a 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  s.** zero or mor
49d0: 65 2c 20 74 68 65 6e 20 64 61 74 61 20 69 73 20  e, then data is 
49e0: 70 75 6c 6c 65 64 20 66 72 6f 6d 20 73 72 63 54  pulled from srcT
49f0: 61 62 20 61 6e 64 20 70 45 4c 69 73 74 20 69 73  ab and pEList is
4a00: 20 75 73 65 64 20 6f 6e 6c 79 20 0a 2a 2a 20 74   used only .** t
4a10: 6f 20 67 65 74 20 6e 75 6d 62 65 72 20 63 6f 6c  o get number col
4a20: 75 6d 6e 73 20 61 6e 64 20 74 68 65 20 64 61 74  umns and the dat
4a30: 61 74 79 70 65 20 66 6f 72 20 65 61 63 68 20 63  atype for each c
4a40: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  olumn..*/.static
4a50: 20 76 6f 69 64 20 73 65 6c 65 63 74 49 6e 6e 65   void selectInne
4a60: 72 4c 6f 6f 70 28 0a 20 20 50 61 72 73 65 20 2a  rLoop(.  Parse *
4a70: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
4a80: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
4a90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
4aa0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
4ab0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c      /* The compl
4ac0: 65 74 65 20 73 65 6c 65 63 74 20 73 74 61 74 65  ete select state
4ad0: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
4ae0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4af0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  pEList,       /*
4b00: 20 4c 69 73 74 20 6f 66 20 76 61 6c 75 65 73 20   List of values 
4b10: 62 65 69 6e 67 20 65 78 74 72 61 63 74 65 64 20  being extracted 
4b20: 2a 2f 0a 20 20 69 6e 74 20 73 72 63 54 61 62 2c  */.  int srcTab,
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4b40: 50 75 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74  Pull data from t
4b50: 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45  his table */.  E
4b60: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
4b70: 79 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74  y,     /* If not
4b80: 20 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75   NULL, sort resu
4b90: 6c 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b  lts using this k
4ba0: 65 79 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74  ey */.  Distinct
4bb0: 43 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20  Ctx *pDistinct, 
4bc0: 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  /* If not NULL, 
4bd0: 69 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70  info on how to p
4be0: 72 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20  rocess DISTINCT 
4bf0: 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20  */.  SelectDest 
4c00: 2a 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20  *pDest,      /* 
4c10: 48 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f  How to dispose o
4c20: 66 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f  f the results */
4c30: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
4c40: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75  ,          /* Ju
4c50: 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69  mp here to conti
4c60: 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f  nue with next ro
4c70: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61  w */.  int iBrea
4c80: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k              /
4c90: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62  * Jump here to b
4ca0: 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  reak out of the 
4cb0: 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b  inner loop */.){
4cc0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4cd0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
4ce0: 74 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69  t i;.  int hasDi
4cf0: 73 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f  stinct;        /
4d00: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49  * True if the DI
4d10: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
4d20: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
4d30: 6e 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20  nt regResult;   
4d40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
4d50: 61 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f  art of memory ho
4d60: 6c 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74  lding result set
4d70: 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20   */.  int eDest 
4d80: 3d 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20  = pDest->eDest; 
4d90: 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70    /* How to disp
4da0: 6f 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a  ose of results *
4db0: 2f 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20  /.  int iParm = 
4dc0: 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20  pDest->iSDParm; 
4dd0: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
4de0: 74 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65  t to disposal me
4df0: 74 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  thod */.  int nR
4e00: 65 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20  esultCol;       
4e10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4e20: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
4e30: 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
4e40: 76 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  v );.  assert( p
4e50: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 68 61  EList!=0 );.  ha
4e60: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 44 69 73  sDistinct = pDis
4e70: 74 69 6e 63 74 20 3f 20 70 44 69 73 74 69 6e 63  tinct ? pDistinc
4e80: 74 2d 3e 65 54 6e 63 74 54 79 70 65 20 3a 20 57  t->eTnctType : W
4e90: 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f  HERE_DISTINCT_NO
4ea0: 4f 50 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  OP;.  if( pOrder
4eb0: 42 79 3d 3d 30 20 26 26 20 21 68 61 73 44 69 73  By==0 && !hasDis
4ec0: 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 63 6f 64  tinct ){.    cod
4ed0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
4ee0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
4ef0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 75 6c  );.  }..  /* Pul
4f00: 6c 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  l the requested 
4f10: 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a 20 20  columns..  */.  
4f20: 6e 52 65 73 75 6c 74 43 6f 6c 20 3d 20 70 45 4c  nResultCol = pEL
4f30: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 0a 20 20 69  ist->nExpr;..  i
4f40: 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d  f( pDest->iSdst=
4f50: 3d 30 20 29 7b 0a 20 20 20 20 70 44 65 73 74 2d  =0 ){.    pDest-
4f60: 3e 69 53 64 73 74 20 3d 20 70 50 61 72 73 65 2d  >iSdst = pParse-
4f70: 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61  >nMem+1;.    pPa
4f80: 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
4f90: 73 75 6c 74 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65  sultCol;.  }else
4fa0: 20 69 66 28 20 70 44 65 73 74 2d 3e 69 53 64 73   if( pDest->iSds
4fb0: 74 2b 6e 52 65 73 75 6c 74 43 6f 6c 20 3e 20 70  t+nResultCol > p
4fc0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 7b 0a 20  Parse->nMem ){. 
4fd0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e     /* This is an
4fe0: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
4ff0: 20 74 68 61 74 20 63 61 6e 20 72 65 73 75 6c 74   that can result
5000: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
5010: 68 65 6e 20 61 20 53 45 4c 45 43 54 0a 20 20 20  hen a SELECT.   
5020: 20 2a 2a 20 6f 6e 20 74 68 65 20 72 69 67 68 74   ** on the right
5030: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 6e  -hand side of an
5040: 20 49 4e 53 45 52 54 20 63 6f 6e 74 61 69 6e 73   INSERT contains
5050: 20 6d 6f 72 65 20 72 65 73 75 6c 74 20 63 6f 6c   more result col
5060: 75 6d 6e 73 20 74 68 61 6e 0a 20 20 20 20 2a 2a  umns than.    **
5070: 20 74 68 65 72 65 20 61 72 65 20 63 6f 6c 75 6d   there are colum
5080: 6e 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ns in the table 
5090: 6f 6e 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  on the left.  Th
50a0: 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
50b0: 63 61 75 67 68 74 0a 20 20 20 20 2a 2a 20 61 6e  caught.    ** an
50c0: 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72  d reported later
50d0: 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 74  .  But we need t
50e0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 65 6e 6f 75  o make sure enou
50f0: 67 68 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c  gh memory is all
5100: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 6f  ocated.    ** to
5110: 20 61 76 6f 69 64 20 6f 74 68 65 72 20 73 70 75   avoid other spu
5120: 72 69 6f 75 73 20 65 72 72 6f 72 73 20 69 6e 20  rious errors in 
5130: 74 68 65 20 6d 65 61 6e 74 69 6d 65 2e 20 2a 2f  the meantime. */
5140: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
5150: 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f 6c 3b  m += nResultCol;
5160: 0a 20 20 7d 0a 20 20 70 44 65 73 74 2d 3e 6e 53  .  }.  pDest->nS
5170: 64 73 74 20 3d 20 6e 52 65 73 75 6c 74 43 6f 6c  dst = nResultCol
5180: 3b 0a 20 20 72 65 67 52 65 73 75 6c 74 20 3d 20  ;.  regResult = 
5190: 70 44 65 73 74 2d 3e 69 53 64 73 74 3b 0a 20 20  pDest->iSdst;.  
51a0: 69 66 28 20 73 72 63 54 61 62 3e 3d 30 20 29 7b  if( srcTab>=0 ){
51b0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
51c0: 6e 52 65 73 75 6c 74 43 6f 6c 3b 20 69 2b 2b 29  nResultCol; i++)
51d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
51e0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
51f0: 43 6f 6c 75 6d 6e 2c 20 73 72 63 54 61 62 2c 20  Column, srcTab, 
5200: 69 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 29 3b  i, regResult+i);
5210: 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
5220: 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 45 4c  nt((v, "%s", pEL
5230: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
5240: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
5250: 20 69 66 28 20 65 44 65 73 74 21 3d 53 52 54 5f   if( eDest!=SRT_
5260: 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 2f 2a  Exists ){.    /*
5270: 20 49 66 20 74 68 65 20 64 65 73 74 69 6e 61 74   If the destinat
5280: 69 6f 6e 20 69 73 20 61 6e 20 45 58 49 53 54 53  ion is an EXISTS
5290: 28 2e 2e 2e 29 20 65 78 70 72 65 73 73 69 6f 6e  (...) expression
52a0: 2c 20 74 68 65 20 61 63 74 75 61 6c 0a 20 20 20  , the actual.   
52b0: 20 2a 2a 20 76 61 6c 75 65 73 20 72 65 74 75 72   ** values retur
52c0: 6e 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43  ned by the SELEC
52d0: 54 20 61 72 65 20 6e 6f 74 20 72 65 71 75 69 72  T are not requir
52e0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
52f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78  qlite3ExprCodeEx
5300: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
5310: 45 4c 69 73 74 2c 20 72 65 67 52 65 73 75 6c 74  EList, regResult
5320: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
5340: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
5350: 29 3f 53 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55  )?SQLITE_ECEL_DU
5360: 50 3a 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  P:0);.  }..  /* 
5370: 49 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  If the DISTINCT 
5380: 6b 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73  keyword was pres
5390: 65 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43  ent on the SELEC
53a0: 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  T statement.  **
53b0: 20 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61   and this row ha
53c0: 73 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f  s been seen befo
53d0: 72 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20  re, then do not 
53e0: 6d 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20  make this row.  
53f0: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  ** part of the r
5400: 65 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  esult..  */.  if
5410: 28 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b  ( hasDistinct ){
5420: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 44 69  .    switch( pDi
5430: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
5440: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
5450: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
5460: 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20  RDERED: {.      
5470: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20    VdbeOp *pOp;  
5480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
5490: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 20  longer required 
54a0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
54b0: 73 74 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  str. */.        
54c0: 69 6e 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20  int iJump;      
54d0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
54e0: 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20  destination */. 
54f0: 20 20 20 20 20 20 20 69 6e 74 20 72 65 67 50 72         int regPr
5500: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
5510: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63  * Previous row c
5520: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20  ontent */..     
5530: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73     /* Allocate s
5540: 70 61 63 65 20 66 6f 72 20 74 68 65 20 70 72 65  pace for the pre
5550: 76 69 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20  vious row */.   
5560: 20 20 20 20 20 72 65 67 50 72 65 76 20 3d 20 70       regPrev = p
5570: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20  Parse->nMem+1;. 
5580: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
5590: 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74 43 6f  Mem += nResultCo
55a0: 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l;..        /* C
55b0: 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 4f 70 65  hange the OP_Ope
55c0: 6e 45 70 68 65 6d 65 72 61 6c 20 63 6f 64 65 64  nEphemeral coded
55d0: 20 65 61 72 6c 69 65 72 20 74 6f 20 61 6e 20 4f   earlier to an O
55e0: 50 5f 4e 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a  P_Null.        *
55f0: 2a 20 73 65 74 73 20 74 68 65 20 4d 45 4d 5f 43  * sets the MEM_C
5600: 6c 65 61 72 65 64 20 62 69 74 20 6f 6e 20 74 68  leared bit on th
5610: 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72  e first register
5620: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
5630: 2a 2a 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75  ** previous valu
5640: 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  e.  This will ca
5650: 75 73 65 20 74 68 65 20 4f 50 5f 4e 65 20 62 65  use the OP_Ne be
5660: 6c 6f 77 20 74 6f 20 61 6c 77 61 79 73 0a 20 20  low to always.  
5670: 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 20 6f 6e        ** fail on
5680: 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
5690: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70  tion of the loop
56a0: 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69 72   even if the fir
56b0: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 6f  st.        ** ro
56c0: 77 20 69 73 20 61 6c 6c 20 4e 55 4c 4c 73 2e 0a  w is all NULLs..
56d0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
56e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
56f0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
5700: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
5710: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 20  t);.        pOp 
5720: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
5730: 4f 70 28 76 2c 20 70 44 69 73 74 69 6e 63 74 2d  Op(v, pDistinct-
5740: 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20 20 20 20  >addrTnct);.    
5750: 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
5760: 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20  = OP_Null;.     
5770: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 31 3b 0a     pOp->p1 = 1;.
5780: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
5790: 3d 20 72 65 67 50 72 65 76 3b 0a 0a 20 20 20 20  = regPrev;..    
57a0: 20 20 20 20 69 4a 75 6d 70 20 3d 20 73 71 6c 69      iJump = sqli
57b0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
57c0: 64 72 28 76 29 20 2b 20 6e 52 65 73 75 6c 74 43  dr(v) + nResultC
57d0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ol;.        for(
57e0: 69 3d 30 3b 20 69 3c 6e 52 65 73 75 6c 74 43 6f  i=0; i<nResultCo
57f0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
5800: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
5810: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
5820: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
5830: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
5840: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
5850: 28 20 69 3c 6e 52 65 73 75 6c 74 43 6f 6c 2d 31  ( i<nResultCol-1
5860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5880: 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65 67 52  3(v, OP_Ne, regR
5890: 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70 2c 20  esult+i, iJump, 
58a0: 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20  regPrev+i);.    
58b0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
58c0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
58d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
58e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
58f0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 45 71  eAddOp3(v, OP_Eq
5900: 2c 20 72 65 67 52 65 73 75 6c 74 2b 69 2c 20 69  , regResult+i, i
5910: 43 6f 6e 74 69 6e 75 65 2c 20 72 65 67 50 72 65  Continue, regPre
5920: 76 2b 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  v+i);.          
5930: 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
5940: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 7d 0a  );.           }.
5950: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5960: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
5970: 20 2d 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72   -1, (const char
5980: 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c   *)pColl, P4_COL
5990: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 20  LSEQ);.         
59a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
59b0: 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 4e  geP5(v, SQLITE_N
59c0: 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20 20 20 20  ULLEQ);.        
59d0: 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
59e0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  ( sqlite3VdbeCur
59f0: 72 65 6e 74 41 64 64 72 28 76 29 3d 3d 69 4a 75  rentAddr(v)==iJu
5a00: 6d 70 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  mp );.        sq
5a10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5a20: 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 52  v, OP_Copy, regR
5a30: 65 73 75 6c 74 2c 20 72 65 67 50 72 65 76 2c 20  esult, regPrev, 
5a40: 6e 52 65 73 75 6c 74 43 6f 6c 2d 31 29 3b 0a 20  nResultCol-1);. 
5a50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5a60: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 63 61 73      }..      cas
5a70: 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
5a80: 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
5a90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5aa0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 70 44  angeToNoop(v, pD
5ab0: 69 73 74 69 6e 63 74 2d 3e 61 64 64 72 54 6e 63  istinct->addrTnc
5ac0: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
5ad0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
5ae0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
5af0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 69       assert( pDi
5b00: 73 74 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70  stinct->eTnctTyp
5b10: 65 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43  e==WHERE_DISTINC
5b20: 54 5f 55 4e 4f 52 44 45 52 45 44 20 29 3b 0a 20  T_UNORDERED );. 
5b30: 20 20 20 20 20 20 20 63 6f 64 65 44 69 73 74 69         codeDisti
5b40: 6e 63 74 28 70 50 61 72 73 65 2c 20 70 44 69 73  nct(pParse, pDis
5b50: 74 69 6e 63 74 2d 3e 74 61 62 54 6e 63 74 2c 20  tinct->tabTnct, 
5b60: 69 43 6f 6e 74 69 6e 75 65 2c 20 6e 52 65 73 75  iContinue, nResu
5b70: 6c 74 43 6f 6c 2c 20 72 65 67 52 65 73 75 6c 74  ltCol, regResult
5b80: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5ba0: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
5bb0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ==0 ){.      cod
5bc0: 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e 69 4f  eOffset(v, p->iO
5bd0: 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e 75 65  ffset, iContinue
5be0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
5bf0: 73 77 69 74 63 68 28 20 65 44 65 73 74 20 29 7b  switch( eDest ){
5c00: 0a 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20  .    /* In this 
5c10: 6d 6f 64 65 2c 20 77 72 69 74 65 20 65 61 63 68  mode, write each
5c20: 20 71 75 65 72 79 20 72 65 73 75 6c 74 20 74 6f   query result to
5c30: 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
5c40: 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 2a 2a  temporary.    **
5c50: 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a 20 20   table iParm..  
5c60: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
5c70: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
5c80: 44 5f 53 45 4c 45 43 54 0a 20 20 20 20 63 61 73  D_SELECT.    cas
5c90: 65 20 53 52 54 5f 55 6e 69 6f 6e 3a 20 7b 0a 20  e SRT_Union: {. 
5ca0: 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20 20       int r1;.   
5cb0: 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
5cc0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5cd0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5ce0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5cf0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67  _MakeRecord, reg
5d00: 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43  Result, nResultC
5d10: 6f 6c 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73  ol, r1);.      s
5d20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
5d30: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
5d40: 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20  , iParm, r1);.  
5d50: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
5d60: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
5d70: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
5d80: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
5d90: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 72 65  * Construct a re
5da0: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 71 75  cord from the qu
5db0: 65 72 79 20 72 65 73 75 6c 74 2c 20 62 75 74 20  ery result, but 
5dc0: 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a  instead of.    *
5dd0: 2a 20 73 61 76 69 6e 67 20 74 68 61 74 20 72 65  * saving that re
5de0: 63 6f 72 64 2c 20 75 73 65 20 69 74 20 61 73 20  cord, use it as 
5df0: 61 20 6b 65 79 20 74 6f 20 64 65 6c 65 74 65 20  a key to delete 
5e00: 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d 0a 20 20  elements from.  
5e10: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61    ** the tempora
5e20: 72 79 20 74 61 62 6c 65 20 69 50 61 72 6d 2e 0a  ry table iParm..
5e30: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5e40: 53 52 54 5f 45 78 63 65 70 74 3a 20 7b 0a 20 20  SRT_Except: {.  
5e50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5e60: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 44  ddOp3(v, OP_IdxD
5e70: 65 6c 65 74 65 2c 20 69 50 61 72 6d 2c 20 72 65  elete, iParm, re
5e80: 67 52 65 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74  gResult, nResult
5e90: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Col);.      brea
5ea0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5eb0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
5ec0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
5ed0: 2f 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  /..    /* Store 
5ee0: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
5ef0: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
5f00: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
5f10: 20 20 63 61 73 65 20 53 52 54 5f 44 69 73 74 54    case SRT_DistT
5f20: 61 62 6c 65 3a 0a 20 20 20 20 63 61 73 65 20 53  able:.    case S
5f30: 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20 20 63 61  RT_Table:.    ca
5f40: 73 65 20 53 52 54 5f 45 70 68 65 6d 54 61 62 3a  se SRT_EphemTab:
5f50: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 20   {.      int r1 
5f60: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
5f70: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
5f80: 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65     testcase( eDe
5f90: 73 74 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b  st==SRT_Table );
5fa0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5fb0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65   eDest==SRT_Ephe
5fc0: 6d 54 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71  mTab );.      sq
5fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
5fe0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
5ff0: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6000: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 23 69  sultCol, r1);.#i
6010: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6020: 54 5f 43 54 45 0a 20 20 20 20 20 20 69 66 28 20  T_CTE.      if( 
6030: 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74 54  eDest==SRT_DistT
6040: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
6050: 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69 6e  /* If the destin
6060: 61 74 69 6f 6e 20 69 73 20 44 69 73 74 54 61 62  ation is DistTab
6070: 6c 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20  le, then cursor 
6080: 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70 65  (iParm+1) is ope
6090: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20  n.        ** on 
60a0: 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 69 6e 64  an ephemeral ind
60b0: 65 78 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ex. If the curre
60c0: 6e 74 20 72 6f 77 20 69 73 20 61 6c 72 65 61 64  nt row is alread
60d0: 79 20 70 72 65 73 65 6e 74 0a 20 20 20 20 20 20  y present.      
60e0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 69 6e 64 65    ** in the inde
60f0: 78 2c 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  x, do not write 
6100: 69 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  it to the output
6110: 2e 20 49 66 20 6e 6f 74 2c 20 61 64 64 20 74 68  . If not, add th
6120: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72  e.        ** cur
6130: 72 65 6e 74 20 72 6f 77 20 74 6f 20 74 68 65 20  rent row to the 
6140: 69 6e 64 65 78 20 61 6e 64 20 70 72 6f 63 65 65  index and procee
6150: 64 20 77 69 74 68 20 77 72 69 74 69 6e 67 20 69  d with writing i
6160: 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  t to the.       
6170: 20 2a 2a 20 6f 75 74 70 75 74 20 74 61 62 6c 65   ** output table
6180: 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   as well.  */.  
6190: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d        int addr =
61a0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
61b0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 34 3b 0a  entAddr(v) + 4;.
61c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
61d0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
61e0: 4f 50 5f 46 6f 75 6e 64 2c 20 69 50 61 72 6d 2b  OP_Found, iParm+
61f0: 31 2c 20 61 64 64 72 2c 20 72 31 2c 20 30 29 3b  1, addr, r1, 0);
6200: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6210: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6220: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6230: 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61  P_IdxInsert, iPa
6240: 72 6d 2b 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  rm+1, r1);.     
6250: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65     assert( pOrde
6260: 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rBy==0 );.      
6270: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
6280: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
6290: 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53         pushOntoS
62a0: 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f  orter(pParse, pO
62b0: 72 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a  rderBy, p, r1);.
62c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
62d0: 20 20 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71       int r2 = sq
62e0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
62f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
6300: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6310: 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69  p2(v, OP_NewRowi
6320: 64 2c 20 69 50 61 72 6d 2c 20 72 32 29 3b 0a 20  d, iParm, r2);. 
6330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
6340: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
6350: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
6360: 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20 20 73  , r2);.        s
6370: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6380: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
6390: 45 4e 44 29 3b 0a 20 20 20 20 20 20 20 20 73 71  END);.        sq
63a0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
63b0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b  Reg(pParse, r2);
63c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
63d0: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
63e0: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
63f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6400: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
6410: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6420: 52 59 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  RY.    /* If we 
6430: 61 72 65 20 63 72 65 61 74 69 6e 67 20 61 20 73  are creating a s
6440: 65 74 20 66 6f 72 20 61 6e 20 22 65 78 70 72 20  et for an "expr 
6450: 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
6460: 20 63 6f 6e 73 74 72 75 63 74 2c 0a 20 20 20 20   construct,.    
6470: 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 73 68  ** then there sh
6480: 6f 75 6c 64 20 62 65 20 61 20 73 69 6e 67 6c 65  ould be a single
6490: 20 69 74 65 6d 20 6f 6e 20 74 68 65 20 73 74 61   item on the sta
64a0: 63 6b 2e 20 20 57 72 69 74 65 20 74 68 69 73 0a  ck.  Write this.
64b0: 20 20 20 20 2a 2a 20 69 74 65 6d 20 69 6e 74 6f      ** item into
64c0: 20 74 68 65 20 73 65 74 20 74 61 62 6c 65 20 77   the set table w
64d0: 69 74 68 20 62 6f 67 75 73 20 64 61 74 61 2e 0a  ith bogus data..
64e0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
64f0: 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20 20  SRT_Set: {.     
6500: 20 61 73 73 65 72 74 28 20 6e 52 65 73 75 6c 74   assert( nResult
6510: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
6520: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 20 3d  pDest->affSdst =
6530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6540: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72     sqlite3Compar
6550: 65 41 66 66 69 6e 69 74 79 28 70 45 4c 69 73 74  eAffinity(pEList
6560: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44  ->a[0].pExpr, pD
6570: 65 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20  est->affSdst);. 
6580: 20 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42       if( pOrderB
6590: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  y ){.        /* 
65a0: 41 74 20 66 69 72 73 74 20 67 6c 61 6e 63 65 20  At first glance 
65b0: 79 6f 75 20 77 6f 75 6c 64 20 74 68 69 6e 6b 20  you would think 
65c0: 77 65 20 63 6f 75 6c 64 20 6f 70 74 69 6d 69 7a  we could optimiz
65d0: 65 20 6f 75 74 20 74 68 65 0a 20 20 20 20 20 20  e out the.      
65e0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 69 6e    ** ORDER BY in
65f0: 20 74 68 69 73 20 63 61 73 65 20 73 69 6e 63 65   this case since
6600: 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 65 6e   the order of en
6610: 74 72 69 65 73 20 69 6e 20 74 68 65 20 73 65 74  tries in the set
6620: 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73  .        ** does
6630: 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20 42 75   not matter.  Bu
6640: 74 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  t there might be
6650: 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2c   a LIMIT clause,
6660: 20 69 6e 20 77 68 69 63 68 0a 20 20 20 20 20 20   in which.      
6670: 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 6f 72    ** case the or
6680: 64 65 72 20 64 6f 65 73 20 6d 61 74 74 65 72 20  der does matter 
6690: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f  */.        pushO
66a0: 6e 74 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65  ntoSorter(pParse
66b0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72  , pOrderBy, p, r
66c0: 65 67 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20  egResult);.     
66d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
66e0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
66f0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
6700: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
6710: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
6720: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
6730: 72 65 67 52 65 73 75 6c 74 2c 31 2c 72 31 2c 20  regResult,1,r1, 
6740: 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
6750: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   1);.        sql
6760: 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
6770: 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
6780: 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 31  se, regResult, 1
6790: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
67a0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
67b0: 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 50  OP_IdxInsert, iP
67c0: 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  arm, r1);.      
67d0: 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
67e0: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
67f0: 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r1);.      }.   
6800: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6810: 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 79 20 72  .    /* If any r
6820: 6f 77 20 65 78 69 73 74 20 69 6e 20 74 68 65 20  ow exist in the 
6830: 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 63 6f  result set, reco
6840: 72 64 20 74 68 61 74 20 66 61 63 74 20 61 6e 64  rd that fact and
6850: 20 61 62 6f 72 74 2e 0a 20 20 20 20 2a 2f 0a 20   abort..    */. 
6860: 20 20 20 63 61 73 65 20 53 52 54 5f 45 78 69 73     case SRT_Exis
6870: 74 73 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ts: {.      sqli
6880: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6890: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
68a0: 69 50 61 72 6d 29 3b 0a 20 20 20 20 20 20 2f 2a  iParm);.      /*
68b0: 20 54 68 65 20 4c 49 4d 49 54 20 63 6c 61 75 73   The LIMIT claus
68c0: 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65  e will terminate
68d0: 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73   the loop for us
68e0: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
68f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
6900: 66 20 74 68 69 73 20 69 73 20 61 20 73 63 61 6c  f this is a scal
6910: 61 72 20 73 65 6c 65 63 74 20 74 68 61 74 20 69  ar select that i
6920: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  s part of an exp
6930: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 0a 20 20  ression, then.  
6940: 20 20 2a 2a 20 73 74 6f 72 65 20 74 68 65 20 72    ** store the r
6950: 65 73 75 6c 74 73 20 69 6e 20 74 68 65 20 61 70  esults in the ap
6960: 70 72 6f 70 72 69 61 74 65 20 6d 65 6d 6f 72 79  propriate memory
6970: 20 63 65 6c 6c 20 61 6e 64 20 62 72 65 61 6b 20   cell and break 
6980: 6f 75 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  out.    ** of th
6990: 65 20 73 63 61 6e 20 6c 6f 6f 70 2e 0a 20 20 20  e scan loop..   
69a0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52 54   */.    case SRT
69b0: 5f 4d 65 6d 3a 20 7b 0a 20 20 20 20 20 20 61 73  _Mem: {.      as
69c0: 73 65 72 74 28 20 6e 52 65 73 75 6c 74 43 6f 6c  sert( nResultCol
69d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
69e0: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
69f0: 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72       pushOntoSor
6a00: 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72 64  ter(pParse, pOrd
6a10: 65 72 42 79 2c 20 70 2c 20 72 65 67 52 65 73 75  erBy, p, regResu
6a20: 6c 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  lt);.      }else
6a30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6a40: 33 45 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50  3ExprCodeMove(pP
6a50: 61 72 73 65 2c 20 72 65 67 52 65 73 75 6c 74 2c  arse, regResult,
6a60: 20 69 50 61 72 6d 2c 20 31 29 3b 0a 20 20 20 20   iParm, 1);.    
6a70: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
6a80: 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 6a 75 6d   clause will jum
6a90: 70 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  p out of the loo
6aa0: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
6ab0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6ac0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
6ad0: 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
6ae0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
6af0: 0a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 43  ..    case SRT_C
6b00: 6f 72 6f 75 74 69 6e 65 3a 20 20 20 20 20 20 20  oroutine:       
6b10: 2f 2a 20 53 65 6e 64 20 64 61 74 61 20 74 6f 20  /* Send data to 
6b20: 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a  a co-routine */.
6b30: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4f 75 74      case SRT_Out
6b40: 70 75 74 3a 20 7b 20 20 20 20 20 20 20 20 2f 2a  put: {        /*
6b50: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
6b60: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  lts */.      tes
6b70: 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52  tcase( eDest==SR
6b80: 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20  T_Coroutine );. 
6b90: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
6ba0: 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74  Dest==SRT_Output
6bb0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   );.      if( pO
6bc0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
6bd0: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
6be0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
6bf0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  rse);.        sq
6c00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
6c10: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
6c20: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6c30: 73 75 6c 74 43 6f 6c 2c 20 72 31 29 3b 0a 20 20  sultCol, r1);.  
6c40: 20 20 20 20 20 20 70 75 73 68 4f 6e 74 6f 53 6f        pushOntoSo
6c50: 72 74 65 72 28 70 50 61 72 73 65 2c 20 70 4f 72  rter(pParse, pOr
6c60: 64 65 72 42 79 2c 20 70 2c 20 72 31 29 3b 0a 20  derBy, p, r1);. 
6c70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
6c80: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
6c90: 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  rse, r1);.      
6ca0: 7d 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 3d  }else if( eDest=
6cb0: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
6cc0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6cd0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6ce0: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
6cf0: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
6d00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
6d10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6d20: 28 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77  (v, OP_ResultRow
6d30: 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 52 65  , regResult, nRe
6d40: 73 75 6c 74 43 6f 6c 29 3b 0a 20 20 20 20 20 20  sultCol);.      
6d50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
6d60: 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
6d70: 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73 75  (pParse, regResu
6d80: 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c 29 3b  lt, nResultCol);
6d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
6da0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
6db0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6dc0: 5f 43 54 45 0a 20 20 20 20 2f 2a 20 57 72 69 74  _CTE.    /* Writ
6dd0: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
6de0: 74 6f 20 61 20 70 72 69 6f 72 69 74 79 20 71 75  to a priority qu
6df0: 65 75 65 20 74 68 61 74 20 69 73 20 6f 72 64 65  eue that is orde
6e00: 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 0a 20  r according to. 
6e10: 20 20 20 2a 2a 20 70 44 65 73 74 2d 3e 70 4f 72     ** pDest->pOr
6e20: 64 65 72 42 79 20 28 69 6e 20 70 53 4f 29 2e 20  derBy (in pSO). 
6e30: 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20   pDest->iSDParm 
6e40: 28 69 6e 20 69 50 61 72 6d 29 20 69 73 20 74 68  (in iParm) is th
6e50: 65 20 63 75 72 73 6f 72 20 66 6f 72 20 61 6e 0a  e cursor for an.
6e60: 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74      ** index wit
6e70: 68 20 70 53 4f 2d 3e 6e 45 78 70 72 2b 32 20 63  h pSO->nExpr+2 c
6e80: 6f 6c 75 6d 6e 73 2e 20 20 42 75 69 6c 64 20 61  olumns.  Build a
6e90: 20 6b 65 79 20 75 73 69 6e 67 20 70 53 4f 20 66   key using pSO f
6ea0: 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  or the first.   
6eb0: 20 2a 2a 20 70 53 4f 2d 3e 6e 45 78 70 72 20 63   ** pSO->nExpr c
6ec0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6d 61 6b  olumns, then mak
6ed0: 65 20 73 75 72 65 20 61 6c 6c 20 6b 65 79 73 20  e sure all keys 
6ee0: 61 72 65 20 75 6e 69 71 75 65 20 62 79 20 61 64  are unique by ad
6ef0: 64 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69  ding a.    ** fi
6f00: 6e 61 6c 20 4f 50 5f 53 65 71 75 65 6e 63 65 20  nal OP_Sequence 
6f10: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 6c 61 73  column.  The las
6f20: 74 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  t column is the 
6f30: 72 65 63 6f 72 64 20 61 73 20 61 20 62 6c 6f 62  record as a blob
6f40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
6f50: 65 20 53 52 54 5f 44 69 73 74 51 75 65 75 65 3a  e SRT_DistQueue:
6f60: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 51 75  .    case SRT_Qu
6f70: 65 75 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  eue: {.      int
6f80: 20 6e 4b 65 79 3b 0a 20 20 20 20 20 20 69 6e 74   nKey;.      int
6f90: 20 72 31 2c 20 72 32 2c 20 72 33 3b 0a 20 20 20   r1, r2, r3;.   
6fa0: 20 20 20 69 6e 74 20 61 64 64 72 54 65 73 74 20     int addrTest 
6fb0: 3d 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  = 0;.      ExprL
6fc0: 69 73 74 20 2a 70 53 4f 3b 0a 20 20 20 20 20 20  ist *pSO;.      
6fd0: 70 53 4f 20 3d 20 70 44 65 73 74 2d 3e 70 4f 72  pSO = pDest->pOr
6fe0: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 61 73 73  derBy;.      ass
6ff0: 65 72 74 28 20 70 53 4f 20 29 3b 0a 20 20 20 20  ert( pSO );.    
7000: 20 20 6e 4b 65 79 20 3d 20 70 53 4f 2d 3e 6e 45    nKey = pSO->nE
7010: 78 70 72 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  xpr;.      r1 = 
7020: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
7030: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
7040: 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
7050: 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
7060: 2c 20 6e 4b 65 79 2b 32 29 3b 0a 20 20 20 20 20  , nKey+2);.     
7070: 20 72 33 20 3d 20 72 32 2b 6e 4b 65 79 2b 31 3b   r3 = r2+nKey+1;
7080: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7090: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d  beAddOp3(v, OP_M
70a0: 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65  akeRecord, regRe
70b0: 73 75 6c 74 2c 20 6e 52 65 73 75 6c 74 43 6f 6c  sult, nResultCol
70c0: 2c 20 72 33 29 3b 0a 20 20 20 20 20 20 69 66 28  , r3);.      if(
70d0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 44 69 73 74   eDest==SRT_Dist
70e0: 51 75 65 75 65 20 29 7b 0a 20 20 20 20 20 20 20  Queue ){.       
70f0: 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74 69   /* If the desti
7100: 6e 61 74 69 6f 6e 20 69 73 20 44 69 73 74 51 75  nation is DistQu
7110: 65 75 65 2c 20 74 68 65 6e 20 63 75 72 73 6f 72  eue, then cursor
7120: 20 28 69 50 61 72 6d 2b 31 29 20 69 73 20 6f 70   (iParm+1) is op
7130: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  en.        ** on
7140: 20 61 20 73 65 63 6f 6e 64 20 65 70 68 65 6d 65   a second epheme
7150: 72 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 68  ral index that h
7160: 6f 6c 64 73 20 61 6c 6c 20 76 61 6c 75 65 73 20  olds all values 
7170: 65 76 65 72 79 20 70 72 65 76 69 6f 75 73 6c 79  every previously
7180: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
7190: 64 20 74 6f 20 74 68 65 20 71 75 65 75 65 2e 20  d to the queue. 
71a0: 20 4f 6e 6c 79 20 61 64 64 20 74 68 69 73 20 6e   Only add this n
71b0: 65 77 20 76 61 6c 75 65 20 69 66 20 69 74 20 68  ew value if it h
71c0: 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 0a  as never before.
71d0: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20          ** been 
71e0: 61 64 64 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  added */.       
71f0: 20 61 64 64 72 54 65 73 74 20 3d 20 73 71 6c 69   addrTest = sqli
7200: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
7210: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 50  (v, OP_Found, iP
7220: 61 72 6d 2b 31 2c 20 30 2c 20 72 33 2c 20 30 29  arm+1, 0, r3, 0)
7230: 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
7240: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
7250: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7260: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
7270: 73 65 72 74 2c 20 69 50 61 72 6d 2b 31 2c 20 72  sert, iParm+1, r
7280: 33 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  3);.        sqli
7290: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
72a0: 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45  v, OPFLAG_USESEE
72b0: 4b 52 45 53 55 4c 54 29 3b 0a 20 20 20 20 20 20  KRESULT);.      
72c0: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
72d0: 20 69 3c 6e 4b 65 79 3b 20 69 2b 2b 29 7b 0a 20   i<nKey; i++){. 
72e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
72f0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
7300: 43 6f 70 79 2c 0a 20 20 20 20 20 20 20 20 20 20  Copy,.          
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7320: 72 65 67 52 65 73 75 6c 74 20 2b 20 70 53 4f 2d  regResult + pSO-
7330: 3e 61 5b 69 5d 2e 75 2e 78 2e 69 4f 72 64 65 72  >a[i].u.x.iOrder
7340: 42 79 43 6f 6c 20 2d 20 31 2c 0a 20 20 20 20 20  ByCol - 1,.     
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 20 72 32 2b 69 29 3b 0a 20 20 20 20       r2+i);.    
7370: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
7380: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7390: 50 5f 53 65 71 75 65 6e 63 65 2c 20 69 50 61 72  P_Sequence, iPar
73a0: 6d 2c 20 72 32 2b 6e 4b 65 79 29 3b 0a 20 20 20  m, r2+nKey);.   
73b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
73c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp3(v, OP_MakeR
73d0: 65 63 6f 72 64 2c 20 72 32 2c 20 6e 4b 65 79 2b  ecord, r2, nKey+
73e0: 32 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71  2, r1);.      sq
73f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7400: 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
7410: 20 69 50 61 72 6d 2c 20 72 31 29 3b 0a 20 20 20   iParm, r1);.   
7420: 20 20 20 69 66 28 20 61 64 64 72 54 65 73 74 20     if( addrTest 
7430: 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  ) sqlite3VdbeJum
7440: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 65 73  pHere(v, addrTes
7450: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
7460: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
7470: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
7480: 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
7490: 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
74a0: 65 2c 20 72 32 2c 20 6e 4b 65 79 2b 32 29 3b 0a  e, r2, nKey+2);.
74b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
74c0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
74d0: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20 2a 2f 0a  ITE_OMIT_CTE */.
74e0: 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ...#if !defined(
74f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
7500: 47 45 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63  GER).    /* Disc
7510: 61 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e  ard the results.
7520: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
7530: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
7540: 65 6e 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20  ents inside.    
7550: 2a 2a 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61  ** the body of a
7560: 20 54 52 49 47 47 45 52 2e 20 20 54 68 65 20 70   TRIGGER.  The p
7570: 75 72 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73  urpose of such s
7580: 65 6c 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c  elects is to cal
7590: 6c 0a 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65  l.    ** user-de
75a0: 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20  fined functions 
75b0: 74 68 61 74 20 68 61 76 65 20 73 69 64 65 20 65  that have side e
75c0: 66 66 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e  ffects.  We do n
75d0: 6f 74 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61  ot care.    ** a
75e0: 62 6f 75 74 20 74 68 65 20 61 63 74 75 61 6c 20  bout the actual 
75f0: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
7600: 65 6c 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  elect..    */.  
7610: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
7620: 20 20 20 61 73 73 65 72 74 28 20 65 44 65 73 74     assert( eDest
7630: 3d 3d 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b  ==SRT_Discard );
7640: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7650: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
7660: 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65    /* Jump to the
7670: 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70   end of the loop
7680: 20 69 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73   if the LIMIT is
7690: 20 72 65 61 63 68 65 64 2e 20 20 45 78 63 65 70   reached.  Excep
76a0: 74 2c 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65  t, if.  ** there
76b0: 20 69 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e   is a sorter, in
76c0: 20 77 68 69 63 68 20 63 61 73 65 20 74 68 65 20   which case the 
76d0: 73 6f 72 74 65 72 20 68 61 73 20 61 6c 72 65 61  sorter has alrea
76e0: 64 79 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20  dy limited.  ** 
76f0: 74 68 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75  the output for u
7700: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f  s..  */.  if( pO
7710: 72 64 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e  rderBy==0 && p->
7720: 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  iLimit ){.    sq
7730: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7740: 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d  v, OP_IfZero, p-
7750: 3e 69 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c  >iLimit, iBreak,
7760: 20 2d 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61   -1); VdbeCovera
7770: 67 65 28 76 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ge(v);.  }.}../*
7780: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 4b  .** Allocate a K
7790: 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 73 75  eyInfo object su
77a0: 66 66 69 63 69 65 6e 74 20 66 6f 72 20 61 6e 20  fficient for an 
77b0: 69 6e 64 65 78 20 6f 66 20 4e 20 6b 65 79 20 63  index of N key c
77c0: 6f 6c 75 6d 6e 73 20 61 6e 64 0a 2a 2a 20 58 20  olumns and.** X 
77d0: 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  extra columns..*
77e0: 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
77f0: 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 73  e3KeyInfoAlloc(s
7800: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
7810: 4e 2c 20 69 6e 74 20 58 29 7b 0a 20 20 4b 65 79  N, int X){.  Key
7820: 49 6e 66 6f 20 2a 70 20 3d 20 73 71 6c 69 74 65  Info *p = sqlite
7830: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 30 2c  3DbMallocZero(0,
7840: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7850: 20 20 20 20 20 73 69 7a 65 6f 66 28 4b 65 79 49       sizeof(KeyI
7860: 6e 66 6f 29 20 2b 20 28 4e 2b 58 29 2a 28 73 69  nfo) + (N+X)*(si
7870: 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b 31  zeof(CollSeq*)+1
7880: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
7890: 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
78a0: 20 3d 20 28 75 38 2a 29 26 70 2d 3e 61 43 6f 6c   = (u8*)&p->aCol
78b0: 6c 5b 4e 2b 58 5d 3b 0a 20 20 20 20 70 2d 3e 6e  l[N+X];.    p->n
78c0: 46 69 65 6c 64 20 3d 20 28 75 31 36 29 4e 3b 0a  Field = (u16)N;.
78d0: 20 20 20 20 70 2d 3e 6e 58 46 69 65 6c 64 20 3d      p->nXField =
78e0: 20 28 75 31 36 29 58 3b 0a 20 20 20 20 70 2d 3e   (u16)X;.    p->
78f0: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
7900: 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20     p->db = db;. 
7910: 20 20 20 70 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a     p->nRef = 1;.
7920: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
7930: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
7940: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
7950: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c  p;.}../*.** Deal
7960: 6c 6f 63 61 74 65 20 61 20 4b 65 79 49 6e 66 6f  locate a KeyInfo
7970: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 76 6f 69 64 20   object.*/.void 
7980: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
7990: 72 65 66 28 4b 65 79 49 6e 66 6f 20 2a 70 29 7b  ref(KeyInfo *p){
79a0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
79b0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 52 65 66 3e  assert( p->nRef>
79c0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 66  0 );.    p->nRef
79d0: 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e  --;.    if( p->n
79e0: 52 65 66 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  Ref==0 ) sqlite3
79f0: 44 62 46 72 65 65 28 30 2c 20 70 29 3b 0a 20 20  DbFree(0, p);.  
7a00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
7a10: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 74 6f  a new pointer to
7a20: 20 61 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63   a KeyInfo objec
7a30: 74 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  t.*/.KeyInfo *sq
7a40: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
7a50: 4b 65 79 49 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  KeyInfo *p){.  i
7a60: 66 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  f( p ){.    asse
7a70: 72 74 28 20 70 2d 3e 6e 52 65 66 3e 30 20 29 3b  rt( p->nRef>0 );
7a80: 0a 20 20 20 20 70 2d 3e 6e 52 65 66 2b 2b 3b 0a  .    p->nRef++;.
7a90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
7aa0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
7ab0: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  _DEBUG./*.** Ret
7ac0: 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 4b 65  urn TRUE if a Ke
7ad0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 61 6e  yInfo object can
7ae0: 20 62 65 20 63 68 61 6e 67 65 2e 20 20 54 68 65   be change.  The
7af0: 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 0a   KeyInfo object.
7b00: 2a 2a 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 63  ** can only be c
7b10: 68 61 6e 67 65 64 20 69 66 20 74 68 69 73 20 69  hanged if this i
7b20: 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c 65 20  s just a single 
7b30: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
7b40: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
7b50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
7b60: 73 65 64 20 6f 6e 6c 79 20 69 6e 73 69 64 65 20  sed only inside 
7b70: 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74  of assert() stat
7b80: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
7b90: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
7ba0: 72 69 74 65 61 62 6c 65 28 4b 65 79 49 6e 66 6f  riteable(KeyInfo
7bb0: 20 2a 70 29 7b 20 72 65 74 75 72 6e 20 70 2d 3e   *p){ return p->
7bc0: 6e 52 65 66 3d 3d 31 3b 20 7d 0a 23 65 6e 64 69  nRef==1; }.#endi
7bd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
7be0: 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  G */../*.** Give
7bf0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  n an expression 
7c00: 6c 69 73 74 2c 20 67 65 6e 65 72 61 74 65 20 61  list, generate a
7c10: 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
7c20: 72 65 20 74 68 61 74 20 72 65 63 6f 72 64 73 0a  re that records.
7c30: 2a 2a 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  ** the collating
7c40: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 61   sequence for ea
7c50: 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ch expression in
7c60: 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e   that expression
7c70: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   list..**.** If 
7c80: 74 68 65 20 45 78 70 72 4c 69 73 74 20 69 73 20  the ExprList is 
7c90: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
7ca0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
7cb0: 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e  hen the resultin
7cc0: 67 0a 2a 2a 20 4b 65 79 49 6e 66 6f 20 73 74 72  g.** KeyInfo str
7cd0: 75 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70  ucture is approp
7ce0: 72 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61  riate for initia
7cf0: 6c 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c  lizing a virtual
7d00: 20 69 6e 64 65 78 20 74 6f 0a 2a 2a 20 69 6d 70   index to.** imp
7d10: 6c 65 6d 65 6e 74 20 74 68 61 74 20 63 6c 61 75  lement that clau
7d20: 73 65 2e 20 20 49 66 20 74 68 65 20 45 78 70 72  se.  If the Expr
7d30: 4c 69 73 74 20 69 73 20 74 68 65 20 72 65 73 75  List is the resu
7d40: 6c 74 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt set of a SELE
7d50: 43 54 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 4b  CT.** then the K
7d60: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
7d70: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
7d80: 66 6f 72 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  for initializing
7d90: 20 61 20 76 69 72 74 75 61 6c 0a 2a 2a 20 69 6e   a virtual.** in
7da0: 64 65 78 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  dex to implement
7db0: 20 61 20 44 49 53 54 49 4e 43 54 20 74 65 73 74   a DISTINCT test
7dc0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
7dd0: 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e 66   hold the KeyInf
7de0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  o structure is o
7df0: 62 74 61 69 6e 20 66 72 6f 6d 20 6d 61 6c 6c 6f  btain from mallo
7e00: 63 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 0a  c.  The calling.
7e10: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ** function is r
7e20: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 73  esponsible for s
7e30: 65 65 69 6e 67 20 74 68 61 74 20 74 68 69 73 20  eeing that this 
7e40: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 76 65  structure is eve
7e50: 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64  ntually.** freed
7e60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
7e70: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
7e80: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
7e90: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
7ea0: 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 6e 45 78   *pList, int nEx
7eb0: 74 72 61 29 7b 0a 20 20 69 6e 74 20 6e 45 78 70  tra){.  int nExp
7ec0: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
7ed0: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
7ee0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
7ef0: 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
7f00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
7f10: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 45 78 70    int i;..  nExp
7f20: 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  r = pList->nExpr
7f30: 3b 0a 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69  ;.  pInfo = sqli
7f40: 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
7f50: 64 62 2c 20 6e 45 78 70 72 2b 6e 45 78 74 72 61  db, nExpr+nExtra
7f60: 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 66  , 1);.  if( pInf
7f70: 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  o ){.    assert(
7f80: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
7f90: 73 57 72 69 74 65 61 62 6c 65 28 70 49 6e 66 6f  sWriteable(pInfo
7fa0: 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ) );.    for(i=0
7fb0: 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  , pItem=pList->a
7fc0: 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  ; i<nExpr; i++, 
7fd0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
7fe0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
7ff0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
8000: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
8010: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
8020: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
8030: 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
8040: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
8050: 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61  ;.      pInfo->a
8060: 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f 6c 6c 3b  Coll[i] = pColl;
8070: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 53  .      pInfo->aS
8080: 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
8090: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  tem->sortOrder;.
80a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
80b0: 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a 23 69 66  rn pInfo;.}..#if
80c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
80d0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
80e0: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f 66 20 74  ./*.** Name of t
80f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 70  he connection op
8100: 65 72 61 74 6f 72 2c 20 75 73 65 64 20 66 6f 72  erator, used for
8110: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 2e   error messages.
8120: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
8130: 20 63 68 61 72 20 2a 73 65 6c 65 63 74 4f 70 4e   char *selectOpN
8140: 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a 20 20 63  ame(int id){.  c
8150: 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69 74 63 68  har *z;.  switch
8160: 28 20 69 64 20 29 7b 0a 20 20 20 20 63 61 73 65  ( id ){.    case
8170: 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20 20 20 7a   TK_ALL:       z
8180: 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c 22 3b 20   = "UNION ALL"; 
8190: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
81a0: 65 20 54 4b 5f 49 4e 54 45 52 53 45 43 54 3a 20  e TK_INTERSECT: 
81b0: 7a 20 3d 20 22 49 4e 54 45 52 53 45 43 54 22 3b  z = "INTERSECT";
81c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
81d0: 73 65 20 54 4b 5f 45 58 43 45 50 54 3a 20 20 20  se TK_EXCEPT:   
81e0: 20 7a 20 3d 20 22 45 58 43 45 50 54 22 3b 20 20   z = "EXCEPT";  
81f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
8200: 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20 20 20  efault:         
8210: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22 3b 20 20    z = "UNION";  
8220: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
8230: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
8240: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8250: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
8260: 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECT */..#ifndef 
8270: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
8280: 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73  AIN./*.** Unless
8290: 20 61 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45   an "EXPLAIN QUE
82a0: 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64  RY PLAN" command
82b0: 20 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73   is being proces
82c0: 73 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  sed, this functi
82d0: 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  on.** is a no-op
82e0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
82f0: 61 64 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  adds a single ro
8300: 77 20 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74  w of output to t
8310: 68 65 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a  he EQP result,.*
8320: 2a 20 77 68 65 72 65 20 74 68 65 20 63 61 70 74  * where the capt
8330: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
8340: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 55 53 45  rm:.**.**   "USE
8350: 20 54 45 4d 50 20 42 2d 54 52 45 45 20 46 4f 52   TEMP B-TREE FOR
8360: 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72   xxx".**.** wher
8370: 65 20 78 78 78 20 69 73 20 6f 6e 65 20 6f 66 20  e xxx is one of 
8380: 22 44 49 53 54 49 4e 43 54 22 2c 20 22 4f 52 44  "DISTINCT", "ORD
8390: 45 52 20 42 59 22 20 6f 72 20 22 47 52 4f 55 50  ER BY" or "GROUP
83a0: 20 42 59 22 2e 20 45 78 61 63 74 6c 79 20 77 68   BY". Exactly wh
83b0: 69 63 68 0a 2a 2a 20 69 73 20 64 65 74 65 72 6d  ich.** is determ
83c0: 69 6e 65 64 20 62 79 20 74 68 65 20 7a 55 73 61  ined by the zUsa
83d0: 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ge argument..*/.
83e0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
83f0: 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 50 61 72  ainTempTable(Par
8400: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
8410: 74 20 63 68 61 72 20 2a 7a 55 73 61 67 65 29 7b  t char *zUsage){
8420: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65  .  if( pParse->e
8430: 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20  xplain==2 ){.   
8440: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
8450: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 63 68  e->pVdbe;.    ch
8460: 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ar *zMsg = sqlit
8470: 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
8480: 2d 3e 64 62 2c 20 22 55 53 45 20 54 45 4d 50 20  ->db, "USE TEMP 
8490: 42 2d 54 52 45 45 20 46 4f 52 20 25 73 22 2c 20  B-TREE FOR %s", 
84a0: 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 73 71 6c  zUsage);.    sql
84b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
84c0: 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70 50  , OP_Explain, pP
84d0: 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64 2c  arse->iSelectId,
84e0: 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34 5f   0, 0, zMsg, P4_
84f0: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
8500: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 65 78  ./*.** Assign ex
8510: 70 72 65 73 73 69 6f 6e 20 62 20 74 6f 20 6c 76  pression b to lv
8520: 61 6c 75 65 20 61 2e 20 41 20 73 65 63 6f 6e 64  alue a. A second
8530: 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73 69 6f 6e  , no-op, version
8540: 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 0a 2a   of this macro.*
8550: 2a 20 69 73 20 70 72 6f 76 69 64 65 64 20 77 68  * is provided wh
8560: 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  en SQLITE_OMIT_E
8570: 58 50 4c 41 49 4e 20 69 73 20 64 65 66 69 6e 65  XPLAIN is define
8580: 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74  d. This allows t
8590: 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e 20 73 71  he code.** in sq
85a0: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 20 74 6f  lite3Select() to
85b0: 20 61 73 73 69 67 6e 20 76 61 6c 75 65 73 20 74   assign values t
85c0: 6f 20 73 74 72 75 63 74 75 72 65 20 6d 65 6d 62  o structure memb
85d0: 65 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  er variables tha
85e0: 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69 73 74 20  t.** only exist 
85f0: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  if SQLITE_OMIT_E
8600: 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74 20 64 65  XPLAIN is not de
8610: 66 69 6e 65 64 20 77 69 74 68 6f 75 74 20 70 6f  fined without po
8620: 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63  lluting the.** c
8630: 6f 64 65 20 77 69 74 68 20 23 69 66 6e 64 65 66  ode with #ifndef
8640: 20 64 69 72 65 63 74 69 76 65 73 2e 0a 2a 2f 0a   directives..*/.
8650: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
8660: 53 65 74 49 6e 74 65 67 65 72 28 61 2c 20 62 29  SetInteger(a, b)
8670: 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65 0a 2f 2a   a = b..#else./*
8680: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
8690: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
86a0: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
86b0: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
86c0: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 54 65 6d  efine explainTem
86d0: 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23 20 64 65  pTable(y,z).# de
86e0: 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 65 74 49  fine explainSetI
86f0: 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23 65 6e 64  nteger(y,z).#end
8700: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
8710: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50  (SQLITE_OMIT_EXP
8720: 4c 41 49 4e 29 20 26 26 20 21 64 65 66 69 6e 65  LAIN) && !define
8730: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
8740: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 0a 2f  MPOUND_SELECT)./
8750: 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61 6e 20 22  *.** Unless an "
8760: 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
8770: 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 62  AN" command is b
8780: 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2c 20  eing processed, 
8790: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
87a0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 4f 74 68   is a no-op. Oth
87b0: 65 72 77 69 73 65 2c 20 69 74 20 61 64 64 73 20  erwise, it adds 
87c0: 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
87d0: 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 45 51  output to the EQ
87e0: 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20 77 68 65  P result,.** whe
87f0: 72 65 20 74 68 65 20 63 61 70 74 69 6f 6e 20 69  re the caption i
8800: 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  s of one of the 
8810: 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a  two forms:.**.**
8820: 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53 55     "COMPOSITE SU
8830: 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20 61  BQUERIES iSub1 a
8840: 6e 64 20 69 53 75 62 32 20 28 6f 70 29 22 0a 2a  nd iSub2 (op)".*
8850: 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45 20 53  *   "COMPOSITE S
8860: 55 42 51 55 45 52 49 45 53 20 69 53 75 62 31 20  UBQUERIES iSub1 
8870: 61 6e 64 20 69 53 75 62 32 20 55 53 49 4e 47 20  and iSub2 USING 
8880: 54 45 4d 50 20 42 2d 54 52 45 45 20 28 6f 70 29  TEMP B-TREE (op)
8890: 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 69 53  ".**.** where iS
88a0: 75 62 31 20 61 6e 64 20 69 53 75 62 32 20 61 72  ub1 and iSub2 ar
88b0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 73 20 70  e the integers p
88c0: 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 72  assed as the cor
88d0: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 66 75  responding.** fu
88e0: 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
88f0: 73 2c 20 61 6e 64 20 6f 70 20 69 73 20 74 68 65  s, and op is the
8900: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
8910: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 61  tion of the para
8920: 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  meter.** of the 
8930: 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68 65 20 70  same name. The p
8940: 61 72 61 6d 65 74 65 72 20 22 6f 70 22 20 6d 75  arameter "op" mu
8950: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 54 4b 5f  st be one of TK_
8960: 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54  UNION, TK_EXCEPT
8970: 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52 53 45 43  ,.** TK_INTERSEC
8980: 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20 54 68 65  T or TK_ALL. The
8990: 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 75   first form is u
89a0: 73 65 64 20 69 66 20 61 72 67 75 6d 65 6e 74 20  sed if argument 
89b0: 62 55 73 65 54 6d 70 20 69 73 20 0a 2a 2a 20 66  bUseTmp is .** f
89c0: 61 6c 73 65 2c 20 6f 72 20 74 68 65 20 73 65 63  alse, or the sec
89d0: 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69 74 20 69  ond form if it i
89e0: 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
89f0: 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 43 6f  c void explainCo
8a00: 6d 70 6f 73 69 74 65 28 0a 20 20 50 61 72 73 65  mposite(.  Parse
8a10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
8a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8a30: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
8a40: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a60: 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b 5f 55 4e   /* One of TK_UN
8a70: 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 20 65  ION, TK_EXCEPT e
8a80: 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  tc. */.  int iSu
8a90: 62 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  b1,             
8aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71           /* Subq
8ab0: 75 65 72 79 20 69 64 20 31 20 2a 2f 0a 20 20 69  uery id 1 */.  i
8ac0: 6e 74 20 69 53 75 62 32 2c 20 20 20 20 20 20 20  nt iSub2,       
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ae0: 2a 20 53 75 62 71 75 65 72 79 20 69 64 20 32 20  * Subquery id 2 
8af0: 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65 54 6d 70  */.  int bUseTmp
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
8b20: 61 20 74 65 6d 70 20 74 61 62 6c 65 20 77 61 73  a temp table was
8b30: 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73   used */.){.  as
8b40: 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 55 4e 49  sert( op==TK_UNI
8b50: 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 45 58 43  ON || op==TK_EXC
8b60: 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  EPT || op==TK_IN
8b70: 54 45 52 53 45 43 54 20 7c 7c 20 6f 70 3d 3d 54  TERSECT || op==T
8b80: 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66 28 20 70  K_ALL );.  if( p
8b90: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
8ba0: 32 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  2 ){.    Vdbe *v
8bb0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
8bc0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67  ;.    char *zMsg
8bd0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
8be0: 66 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  f(.        pPars
8bf0: 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f 55 4e 44  e->db, "COMPOUND
8c00: 20 53 55 42 51 55 45 52 49 45 53 20 25 64 20 41   SUBQUERIES %d A
8c10: 4e 44 20 25 64 20 25 73 28 25 73 29 22 2c 20 69  ND %d %s(%s)", i
8c20: 53 75 62 31 2c 20 69 53 75 62 32 2c 0a 20 20 20  Sub1, iSub2,.   
8c30: 20 20 20 20 20 62 55 73 65 54 6d 70 3f 22 55 53       bUseTmp?"US
8c40: 49 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20  ING TEMP B-TREE 
8c50: 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f 70 4e 61  ":"", selectOpNa
8c60: 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b 0a 20 20  me(op).    );.  
8c70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8c80: 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
8c90: 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65  n, pParse->iSele
8ca0: 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67  ctId, 0, 0, zMsg
8cb0: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
8cc0: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a 20 4e 6f   }.}.#else./* No
8cd0: 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  -op versions of 
8ce0: 74 68 65 20 65 78 70 6c 61 69 6e 58 58 58 28 29  the explainXXX()
8cf0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6d   functions and m
8d00: 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64 65 66 69  acros. */.# defi
8d10: 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73  ne explainCompos
8d20: 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23  ite(v,w,x,y,z).#
8d30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
8d40: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 77  the inner loop w
8d50: 61 73 20 67 65 6e 65 72 61 74 65 64 20 75 73 69  as generated usi
8d60: 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c 20 70 4f  ng a non-null pO
8d70: 72 64 65 72 42 79 20 61 72 67 75 6d 65 6e 74 2c  rderBy argument,
8d80: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 73  .** then the res
8d90: 75 6c 74 73 20 77 65 72 65 20 70 6c 61 63 65 64  ults were placed
8da0: 20 69 6e 20 61 20 73 6f 72 74 65 72 2e 20 20 41   in a sorter.  A
8db0: 66 74 65 72 20 74 68 65 20 6c 6f 6f 70 20 69 73  fter the loop is
8dc0: 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 77   terminated.** w
8dd0: 65 20 6e 65 65 64 20 74 6f 20 72 75 6e 20 74 68  e need to run th
8de0: 65 20 73 6f 72 74 65 72 20 61 6e 64 20 6f 75 74  e sorter and out
8df0: 70 75 74 20 74 68 65 20 72 65 73 75 6c 74 73 2e  put the results.
8e00: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
8e10: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  ** routine gener
8e20: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 6e 65  ates the code ne
8e30: 65 64 65 64 20 74 6f 20 64 6f 20 74 68 61 74 2e  eded to do that.
8e40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
8e50: 67 65 6e 65 72 61 74 65 53 6f 72 74 54 61 69 6c  generateSortTail
8e60: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8e70: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
8e80: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
8e90: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
8ea0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
8eb0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 56 64 62  atement */.  Vdb
8ec0: 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 2f  e *v,          /
8ed0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
8ee0: 69 6e 74 6f 20 74 68 69 73 20 56 44 42 45 20 2a  into this VDBE *
8ef0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  /.  int nColumn,
8f00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8f10: 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 64 61  of columns of da
8f20: 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
8f30: 73 74 20 2a 70 44 65 73 74 20 2f 2a 20 57 72 69  st *pDest /* Wri
8f40: 74 65 20 74 68 65 20 73 6f 72 74 65 64 20 72 65  te the sorted re
8f50: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
8f60: 0a 20 20 69 6e 74 20 61 64 64 72 42 72 65 61 6b  .  int addrBreak
8f70: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
8f80: 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 20 20 20  keLabel(v);     
8f90: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20  /* Jump here to 
8fa0: 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  exit loop */.  i
8fb0: 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 20  nt addrContinue 
8fc0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
8fd0: 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 4a  eLabel(v);  /* J
8fe0: 75 6d 70 20 68 65 72 65 20 66 6f 72 20 6e 65 78  ump here for nex
8ff0: 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74  t cycle */.  int
9000: 20 61 64 64 72 3b 0a 20 20 69 6e 74 20 69 54 61   addr;.  int iTa
9010: 62 3b 0a 20 20 69 6e 74 20 70 73 65 75 64 6f 54  b;.  int pseudoT
9020: 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 4c 69  ab = 0;.  ExprLi
9030: 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d 20 70  st *pOrderBy = p
9040: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 69  ->pOrderBy;..  i
9050: 6e 74 20 65 44 65 73 74 20 3d 20 70 44 65 73 74  nt eDest = pDest
9060: 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e 74 20 69  ->eDest;.  int i
9070: 50 61 72 6d 20 3d 20 70 44 65 73 74 2d 3e 69 53  Parm = pDest->iS
9080: 44 50 61 72 6d 3b 0a 0a 20 20 69 6e 74 20 72 65  DParm;..  int re
9090: 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72 65 67 52  gRow;.  int regR
90a0: 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62 20 3d 20  owid;..  iTab = 
90b0: 70 4f 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73  pOrderBy->iECurs
90c0: 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20 3d 20 73  or;.  regRow = s
90d0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
90e0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
90f0: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
9100: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
9110: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
9120: 20 70 73 65 75 64 6f 54 61 62 20 3d 20 70 50 61   pseudoTab = pPa
9130: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
9140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9150: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50 73 65  p3(v, OP_OpenPse
9160: 75 64 6f 2c 20 70 73 65 75 64 6f 54 61 62 2c 20  udo, pseudoTab, 
9170: 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75 6d 6e 29  regRow, nColumn)
9180: 3b 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  ;.    regRowid =
9190: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
91a0: 20 72 65 67 52 6f 77 69 64 20 3d 20 73 71 6c 69   regRowid = sqli
91b0: 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
91c0: 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  arse);.  }.  if(
91d0: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
91e0: 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  F_UseSorter ){. 
91f0: 20 20 20 69 6e 74 20 72 65 67 53 6f 72 74 4f 75     int regSortOu
9200: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
9210: 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70 74 61 62  em;.    int ptab
9220: 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  2 = pParse->nTab
9230: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
9240: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
9250: 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 74 61 62  OpenPseudo, ptab
9260: 32 2c 20 72 65 67 53 6f 72 74 4f 75 74 2c 20 70  2, regSortOut, p
9270: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
9280: 29 3b 0a 20 20 20 20 61 64 64 72 20 3d 20 31 20  );.    addr = 1 
9290: 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  + sqlite3VdbeAdd
92a0: 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
92b0: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
92c0: 42 72 65 61 6b 29 3b 0a 20 20 20 20 56 64 62 65  Break);.    Vdbe
92d0: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20  Coverage(v);.   
92e0: 20 63 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70   codeOffset(v, p
92f0: 2d 3e 69 4f 66 66 73 65 74 2c 20 61 64 64 72 43  ->iOffset, addrC
9300: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 73 71  ontinue);.    sq
9310: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
9320: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61  v, OP_SorterData
9330: 2c 20 69 54 61 62 2c 20 72 65 67 53 6f 72 74 4f  , iTab, regSortO
9340: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
9350: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
9360: 5f 43 6f 6c 75 6d 6e 2c 20 70 74 61 62 32 2c 20  _Column, ptab2, 
9370: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
9380: 31 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 20 20  1, regRow);.    
9390: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
93a0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c  eP5(v, OPFLAG_CL
93b0: 45 41 52 43 41 43 48 45 29 3b 0a 20 20 7d 65 6c  EARCACHE);.  }el
93c0: 73 65 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 31  se{.    addr = 1
93d0: 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
93e0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 2c  dOp2(v, OP_Sort,
93f0: 20 69 54 61 62 2c 20 61 64 64 72 42 72 65 61 6b   iTab, addrBreak
9400: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
9410: 76 29 3b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73  v);.    codeOffs
9420: 65 74 28 76 2c 20 70 2d 3e 69 4f 66 66 73 65 74  et(v, p->iOffset
9430: 2c 20 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b  , addrContinue);
9440: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9450: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp3(v, OP_Col
9460: 75 6d 6e 2c 20 69 54 61 62 2c 20 70 4f 72 64 65  umn, iTab, pOrde
9470: 72 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65  rBy->nExpr+1, re
9480: 67 52 6f 77 29 3b 0a 20 20 7d 0a 20 20 73 77 69  gRow);.  }.  swi
9490: 74 63 68 28 20 65 44 65 73 74 20 29 7b 0a 20 20  tch( eDest ){.  
94a0: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
94b0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
94c0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
94d0: 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74   testcase( eDest
94e0: 3d 3d 53 52 54 5f 54 61 62 6c 65 20 29 3b 0a 20  ==SRT_Table );. 
94f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
9500: 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
9510: 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
9520: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
9530: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50   OP_NewRowid, iP
9540: 61 72 6d 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  arm, regRowid);.
9550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9560: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
9570: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
9580: 52 6f 77 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  Row, regRowid);.
9590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
95a0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
95b0: 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20  LAG_APPEND);.   
95c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
95d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
95e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
95f0: 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
9600: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
9610: 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20  Column==1 );.   
9620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9630: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
9640: 65 63 6f 72 64 2c 20 72 65 67 52 6f 77 2c 20 31  ecord, regRow, 1
9650: 2c 20 72 65 67 52 6f 77 69 64 2c 0a 20 20 20 20  , regRowid,.    
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 20 20 20 26 70 44 65 73 74 2d 3e 61 66 66 53      &pDest->affS
9680: 64 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  dst, 1);.      s
9690: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
96a0: 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
96b0: 61 72 73 65 2c 20 72 65 67 52 6f 77 2c 20 31 29  arse, regRow, 1)
96c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
96d0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
96e0: 49 64 78 49 6e 73 65 72 74 2c 20 69 50 61 72 6d  IdxInsert, iParm
96f0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
9700: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9710: 20 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d      case SRT_Mem
9720: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
9730: 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a  ( nColumn==1 );.
9740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9750: 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
9760: 2c 20 72 65 67 52 6f 77 2c 20 69 50 61 72 6d 2c  , regRow, iParm,
9770: 20 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68   1);.      /* Th
9780: 65 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77  e LIMIT clause w
9790: 69 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68  ill terminate th
97a0: 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
97b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
97c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 64    }.#endif.    d
97d0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
97e0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 61 73 73  int i;.      ass
97f0: 65 72 74 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ert( eDest==SRT_
9800: 4f 75 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d  Output || eDest=
9810: 3d 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29  =SRT_Coroutine )
9820: 3b 20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ; .      testcas
9830: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  e( eDest==SRT_Ou
9840: 74 70 75 74 20 29 3b 0a 20 20 20 20 20 20 74 65  tput );.      te
9850: 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53  stcase( eDest==S
9860: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 3b 0a  RT_Coroutine );.
9870: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
9880: 3c 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  <nColumn; i++){.
9890: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
98a0: 72 65 67 52 6f 77 21 3d 70 44 65 73 74 2d 3e 69  regRow!=pDest->i
98b0: 53 64 73 74 2b 69 20 29 3b 0a 20 20 20 20 20 20  Sdst+i );.      
98c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
98d0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
98e0: 2c 20 70 73 65 75 64 6f 54 61 62 2c 20 69 2c 20  , pseudoTab, i, 
98f0: 70 44 65 73 74 2d 3e 69 53 64 73 74 2b 69 29 3b  pDest->iSdst+i);
9900: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
9910: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
9920: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
9930: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 43 4c 45  P5(v, OPFLAG_CLE
9940: 41 52 43 41 43 48 45 29 3b 0a 20 20 20 20 20 20  ARCACHE);.      
9950: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9960: 20 20 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54    if( eDest==SRT
9970: 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20  _Output ){.     
9980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9990: 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 73 75 6c  dOp2(v, OP_Resul
99a0: 74 52 6f 77 2c 20 70 44 65 73 74 2d 3e 69 53 64  tRow, pDest->iSd
99b0: 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  st, nColumn);.  
99c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
99d0: 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43 68  rCacheAffinityCh
99e0: 61 6e 67 65 28 70 50 61 72 73 65 2c 20 70 44 65  ange(pParse, pDe
99f0: 73 74 2d 3e 69 53 64 73 74 2c 20 6e 43 6f 6c 75  st->iSdst, nColu
9a00: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
9a10: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9a20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
9a30: 50 5f 59 69 65 6c 64 2c 20 70 44 65 73 74 2d 3e  P_Yield, pDest->
9a40: 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20 20  iSDParm);.      
9a50: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9a60: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9a70: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
9a80: 28 70 50 61 72 73 65 2c 20 72 65 67 52 6f 77 29  (pParse, regRow)
9a90: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
9aa0: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
9ab0: 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 0a 20 20  , regRowid);..  
9ac0: 2f 2a 20 54 68 65 20 62 6f 74 74 6f 6d 20 6f 66  /* The bottom of
9ad0: 20 74 68 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20   the loop.  */. 
9ae0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
9af0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72  lveLabel(v, addr
9b00: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28  Continue);.  if(
9b10: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
9b20: 46 5f 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20  F_UseSorter ){. 
9b30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9b40: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
9b50: 72 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64  rNext, iTab, add
9b60: 72 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  r); VdbeCoverage
9b70: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  (v);.  }else{.  
9b80: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9b90: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
9ba0: 69 54 61 62 2c 20 61 64 64 72 29 3b 20 56 64 62  iTab, addr); Vdb
9bb0: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
9bc0: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  }.  sqlite3VdbeR
9bd0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
9be0: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69 66 28  ddrBreak);.  if(
9bf0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
9c00: 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54  ut || eDest==SRT
9c10: 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20  _Coroutine ){.  
9c20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9c30: 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op2(v, OP_Close,
9c40: 20 70 73 65 75 64 6f 54 61 62 2c 20 30 29 3b 0a   pseudoTab, 0);.
9c50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
9c60: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
9c70: 20 61 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69   a string contai
9c80: 6e 69 6e 67 20 74 68 65 20 27 64 65 63 6c 61 72  ning the 'declar
9c90: 61 74 69 6f 6e 20 74 79 70 65 27 20 6f 66 20 74  ation type' of t
9ca0: 68 65 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  he.** expression
9cb0: 20 70 45 78 70 72 2e 20 54 68 65 20 73 74 72 69   pExpr. The stri
9cc0: 6e 67 20 6d 61 79 20 62 65 20 74 72 65 61 74 65  ng may be treate
9cd0: 64 20 61 73 20 73 74 61 74 69 63 20 62 79 20 74  d as static by t
9ce0: 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  he caller..**.**
9cf0: 20 41 6c 73 6f 20 74 72 79 20 74 6f 20 65 73 74   Also try to est
9d00: 69 6d 61 74 65 20 74 68 65 20 73 69 7a 65 20 6f  imate the size o
9d10: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 76  f the returned v
9d20: 61 6c 75 65 20 61 6e 64 20 72 65 74 75 72 6e 20  alue and return 
9d30: 74 68 61 74 0a 2a 2a 20 72 65 73 75 6c 74 20 69  that.** result i
9d40: 6e 20 2a 70 45 73 74 57 69 64 74 68 2e 0a 2a 2a  n *pEstWidth..**
9d50: 0a 2a 2a 20 54 68 65 20 64 65 63 6c 61 72 61 74  .** The declarat
9d60: 69 6f 6e 20 74 79 70 65 20 69 73 20 74 68 65 20  ion type is the 
9d70: 65 78 61 63 74 20 64 61 74 61 74 79 70 65 20 64  exact datatype d
9d80: 65 66 69 6e 69 74 69 6f 6e 20 65 78 74 72 61 63  efinition extrac
9d90: 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ted from the.** 
9da0: 6f 72 69 67 69 6e 61 6c 20 43 52 45 41 54 45 20  original CREATE 
9db0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
9dc0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
9dd0: 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 54  n is a column. T
9de0: 68 65 0a 2a 2a 20 64 65 63 6c 61 72 61 74 69 6f  he.** declaratio
9df0: 6e 20 74 79 70 65 20 66 6f 72 20 61 20 52 4f 57  n type for a ROW
9e00: 49 44 20 66 69 65 6c 64 20 69 73 20 49 4e 54 45  ID field is INTE
9e10: 47 45 52 2e 20 45 78 61 63 74 6c 79 20 77 68 65  GER. Exactly whe
9e20: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
9e30: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
9e40: 20 61 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65   a column can be
9e50: 20 63 6f 6d 70 6c 65 78 20 69 6e 20 74 68 65 20   complex in the 
9e60: 70 72 65 73 65 6e 63 65 20 6f 66 20 73 75 62 71  presence of subq
9e70: 75 65 72 69 65 73 2e 20 54 68 65 0a 2a 2a 20 72  ueries. The.** r
9e80: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
9e90: 73 69 6f 6e 20 69 6e 20 61 6c 6c 20 6f 66 20 74  sion in all of t
9ea0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 45 4c  he following SEL
9eb0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ECT statements i
9ec0: 73 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64  s .** considered
9ed0: 20 61 20 63 6f 6c 75 6d 6e 20 62 79 20 74 68 69   a column by thi
9ee0: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
9ef0: 2a 20 20 20 53 45 4c 45 43 54 20 63 6f 6c 20 46  *   SELECT col F
9f00: 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20 53 45  ROM tbl;.**   SE
9f10: 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63 6f 6c  LECT (SELECT col
9f20: 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a 2a 20 20 20   FROM tbl;.**   
9f30: 53 45 4c 45 43 54 20 28 53 45 4c 45 43 54 20 63  SELECT (SELECT c
9f40: 6f 6c 20 46 52 4f 4d 20 74 62 6c 29 3b 0a 2a 2a  ol FROM tbl);.**
9f50: 20 20 20 53 45 4c 45 43 54 20 61 62 63 20 46 52     SELECT abc FR
9f60: 4f 4d 20 28 53 45 4c 45 43 54 20 63 6f 6c 20 41  OM (SELECT col A
9f70: 53 20 61 62 63 20 46 52 4f 4d 20 74 62 6c 29 3b  S abc FROM tbl);
9f80: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 64 65 63 6c  .** .** The decl
9f90: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
9fa0: 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   any expression 
9fb0: 6f 74 68 65 72 20 74 68 61 6e 20 61 20 63 6f 6c  other than a col
9fc0: 75 6d 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  umn is NULL..**.
9fd0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9fe0: 68 61 73 20 65 69 74 68 65 72 20 33 20 6f 72 20  has either 3 or 
9ff0: 36 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 70  6 parameters dep
a000: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
a010: 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
a020: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
a030: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 20 63 6f  LUMN_METADATA co
a040: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
a050: 6e 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 23 69  n is used..*/.#i
a060: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a070: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
a080: 54 41 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75  TA.# define colu
a090: 6d 6e 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45  mnType(A,B,C,D,E
a0a0: 2c 46 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d  ,F) columnTypeIm
a0b0: 70 6c 28 41 2c 42 2c 43 2c 44 2c 45 2c 46 29 0a  pl(A,B,C,D,E,F).
a0c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
a0d0: 72 20 2a 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70  r *columnTypeImp
a0e0: 6c 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  l(.  NameContext
a0f0: 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72 20 2a   *pNC, .  Expr *
a100: 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74 20 63  pExpr,.  const c
a110: 68 61 72 20 2a 2a 70 7a 4f 72 69 67 44 62 2c 0a  har **pzOrigDb,.
a120: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
a130: 7a 4f 72 69 67 54 61 62 2c 0a 20 20 63 6f 6e 73  zOrigTab,.  cons
a140: 74 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 43  t char **pzOrigC
a150: 6f 6c 2c 0a 20 20 75 38 20 2a 70 45 73 74 57 69  ol,.  u8 *pEstWi
a160: 64 74 68 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f  dth.){.  char co
a170: 6e 73 74 20 2a 7a 4f 72 69 67 44 62 20 3d 20 30  nst *zOrigDb = 0
a180: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
a190: 7a 4f 72 69 67 54 61 62 20 3d 20 30 3b 0a 20 20  zOrigTab = 0;.  
a1a0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4f 72 69  char const *zOri
a1b0: 67 43 6f 6c 20 3d 20 30 3b 0a 23 65 6c 73 65 20  gCol = 0;.#else 
a1c0: 2f 2a 20 69 66 20 21 64 65 66 69 6e 65 64 28 53  /* if !defined(S
a1d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
a1e0: 55 4d 4e 5f 4d 45 54 41 44 41 54 41 29 20 2a 2f  UMN_METADATA) */
a1f0: 0a 23 20 64 65 66 69 6e 65 20 63 6f 6c 75 6d 6e  .# define column
a200: 54 79 70 65 28 41 2c 42 2c 43 2c 44 2c 45 2c 46  Type(A,B,C,D,E,F
a210: 29 20 63 6f 6c 75 6d 6e 54 79 70 65 49 6d 70 6c  ) columnTypeImpl
a220: 28 41 2c 42 2c 46 29 0a 73 74 61 74 69 63 20 63  (A,B,F).static c
a230: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d  onst char *colum
a240: 6e 54 79 70 65 49 6d 70 6c 28 0a 20 20 4e 61 6d  nTypeImpl(.  Nam
a250: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 0a  eContext *pNC, .
a260: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 0a 20    Expr *pExpr,. 
a270: 20 75 38 20 2a 70 45 73 74 57 69 64 74 68 0a 29   u8 *pEstWidth.)
a280: 7b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  {.#endif /* !def
a290: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
a2a0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
a2b0: 54 41 29 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  TA) */.  char co
a2c0: 6e 73 74 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  nst *zType = 0;.
a2d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 75 38 20 65 73    int j;.  u8 es
a2e0: 74 57 69 64 74 68 20 3d 20 31 3b 0a 0a 20 20 69  tWidth = 1;..  i
a2f0: 66 28 20 4e 45 56 45 52 28 70 45 78 70 72 3d 3d  f( NEVER(pExpr==
a300: 30 29 20 7c 7c 20 70 4e 43 2d 3e 70 53 72 63 4c  0) || pNC->pSrcL
a310: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
a320: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
a330: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
a340: 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
a350: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
a360: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LUMN: {.      /*
a370: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
a380: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63  is a column. Loc
a390: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 68  ate the table th
a3a0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e  e column is bein
a3b0: 67 0a 20 20 20 20 20 20 2a 2a 20 65 78 74 72 61  g.      ** extra
a3c0: 63 74 65 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d  cted from in Nam
a3d0: 65 43 6f 6e 74 65 78 74 2e 70 53 72 63 4c 69 73  eContext.pSrcLis
a3e0: 74 2e 20 54 68 69 73 20 74 61 62 6c 65 20 6d 61  t. This table ma
a3f0: 79 20 62 65 20 72 65 61 6c 0a 20 20 20 20 20 20  y be real.      
a400: 2a 2a 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ** database tabl
a410: 65 20 6f 72 20 61 20 73 75 62 71 75 65 72 79 2e  e or a subquery.
a420: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a430: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
a440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a450: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 63  able structure c
a460: 6f 6c 75 6d 6e 20 69 73 20 65 78 74 72 61 63 74  olumn is extract
a470: 65 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20  ed from */.     
a480: 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b   Select *pS = 0;
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a4a0: 53 65 6c 65 63 74 20 74 68 65 20 63 6f 6c 75 6d  Select the colum
a4b0: 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  n is extracted f
a4c0: 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  rom */.      int
a4d0: 20 69 43 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69   iCol = pExpr->i
a4e0: 43 6f 6c 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65  Column;  /* Inde
a4f0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  x of column in p
a500: 54 61 62 20 2a 2f 0a 20 20 20 20 20 20 74 65 73  Tab */.      tes
a510: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
a520: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
a530: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
a540: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
a550: 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20  _COLUMN );.     
a560: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 21   while( pNC && !
a570: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
a580: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
a590: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
a5a0: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  t;.        for(j
a5b0: 3d 30 3b 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  =0;j<pTabList->n
a5c0: 53 72 63 20 26 26 20 70 54 61 62 4c 69 73 74 2d  Src && pTabList-
a5d0: 3e 61 5b 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70  >a[j].iCursor!=p
a5e0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b  Expr->iTable;j++
a5f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a  );.        if( j
a600: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20  <pTabList->nSrc 
a610: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
a620: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
a630: 6a 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  j].pTab;.       
a640: 20 20 20 70 53 20 3d 20 70 54 61 62 4c 69 73 74     pS = pTabList
a650: 2d 3e 61 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[j].pSelect;.
a660: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a670: 20 20 20 20 20 20 20 20 20 70 4e 43 20 3d 20 70           pNC = p
a680: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  NC->pNext;.     
a690: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
a6a0: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
a6b0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74  ){.        /* At
a6c0: 20 6f 6e 65 20 74 69 6d 65 2c 20 63 6f 64 65 20   one time, code 
a6d0: 73 75 63 68 20 61 73 20 22 53 45 4c 45 43 54 20  such as "SELECT 
a6e0: 6e 65 77 2e 78 22 20 77 69 74 68 69 6e 20 61 20  new.x" within a 
a6f0: 74 72 69 67 67 65 72 20 77 6f 75 6c 64 0a 20 20  trigger would.  
a700: 20 20 20 20 20 20 2a 2a 20 63 61 75 73 65 20 74        ** cause t
a710: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f  his condition to
a720: 20 72 75 6e 2e 20 20 53 69 6e 63 65 20 74 68 65   run.  Since the
a730: 6e 2c 20 77 65 20 68 61 76 65 20 72 65 73 74 72  n, we have restr
a740: 75 63 74 75 72 65 64 20 68 6f 77 0a 20 20 20 20  uctured how.    
a750: 20 20 20 20 2a 2a 20 74 72 69 67 67 65 72 20 63      ** trigger c
a760: 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74 65 64  ode is generated
a770: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 63 6f 6e   and so this con
a780: 64 69 74 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e  dition is no lon
a790: 67 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ger .        ** 
a7a0: 70 6f 73 73 69 62 6c 65 2e 20 48 6f 77 65 76 65  possible. Howeve
a7b0: 72 2c 20 69 74 20 63 61 6e 20 73 74 69 6c 6c 20  r, it can still 
a7c0: 62 65 20 74 72 75 65 20 66 6f 72 20 73 74 61 74  be true for stat
a7d0: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20  ements like.    
a7e0: 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
a7f0: 77 69 6e 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a  wing:.        **
a800: 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 43 52  .        **   CR
a810: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 63 6f  EATE TABLE t1(co
a820: 6c 20 49 4e 54 45 47 45 52 29 3b 0a 20 20 20 20  l INTEGER);.    
a830: 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
a840: 28 53 45 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20  (SELECT t1.col) 
a850: 46 52 4f 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20  FROM FROM t1;.  
a860: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
a870: 20 2a 2a 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54   ** when columnT
a880: 79 70 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ype() is called 
a890: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
a8a0: 6e 20 22 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68  n "t1.col" in th
a8b0: 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 75  e .        ** su
a8c0: 62 2d 73 65 6c 65 63 74 2e 20 49 6e 20 74 68 69  b-select. In thi
a8d0: 73 20 63 61 73 65 2c 20 73 65 74 20 74 68 65 20  s case, set the 
a8e0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e  column type to N
a8f0: 55 4c 4c 2c 20 65 76 65 6e 0a 20 20 20 20 20 20  ULL, even.      
a900: 20 20 2a 2a 20 74 68 6f 75 67 68 20 69 74 20 73    ** though it s
a910: 68 6f 75 6c 64 20 72 65 61 6c 6c 79 20 62 65 20  hould really be 
a920: 22 49 4e 54 45 47 45 52 22 2e 0a 20 20 20 20 20  "INTEGER"..     
a930: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
a940: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 70   This is not a p
a950: 72 6f 62 6c 65 6d 2c 20 61 73 20 74 68 65 20 63  roblem, as the c
a960: 6f 6c 75 6d 6e 20 74 79 70 65 20 6f 66 20 22 74  olumn type of "t
a970: 31 2e 63 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a  1.col" is never.
a980: 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 64 2e          ** used.
a990: 20 57 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   When columnType
a9a0: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
a9b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 0a  the expression .
a9c0: 20 20 20 20 20 20 20 20 2a 2a 20 22 28 53 45 4c          ** "(SEL
a9d0: 45 43 54 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68  ECT t1.col)", th
a9e0: 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 20 69  e correct type i
a9f0: 73 20 72 65 74 75 72 6e 65 64 20 28 73 65 65 20  s returned (see 
aa00: 74 68 65 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20  the TK_SELECT.  
aa10: 20 20 20 20 20 20 2a 2a 20 62 72 61 6e 63 68 20        ** branch 
aa20: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20  below.  */.     
aa30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aa40: 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
aa50: 20 70 54 61 62 20 26 26 20 70 45 78 70 72 2d 3e   pTab && pExpr->
aa60: 70 54 61 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20  pTab==pTab );.  
aa70: 20 20 20 20 69 66 28 20 70 53 20 29 7b 0a 20 20      if( pS ){.  
aa80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 74 61        /* The "ta
aa90: 62 6c 65 22 20 69 73 20 61 63 74 75 61 6c 6c 79  ble" is actually
aaa0: 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 6f 72   a sub-select or
aab0: 20 61 20 76 69 65 77 20 69 6e 20 74 68 65 20 46   a view in the F
aac0: 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 20 20 20  ROM clause.     
aad0: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c     ** of the SEL
aae0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 52  ECT statement. R
aaf0: 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61 72  eturn the declar
ab00: 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f  ation type and o
ab10: 72 69 67 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  rigin.        **
ab20: 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 72 65   data for the re
ab30: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20  sult-set column 
ab40: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
ab50: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
ab60: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
ab70: 30 20 26 26 20 41 4c 57 41 59 53 28 69 43 6f 6c  0 && ALWAYS(iCol
ab80: 3c 70 53 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  <pS->pEList->nEx
ab90: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
aba0: 20 2f 2a 20 49 66 20 69 43 6f 6c 20 69 73 20 6c   /* If iCol is l
abb0: 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
abc0: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
abd0: 6f 6e 20 72 65 71 75 65 73 74 73 20 74 68 65 0a  on requests the.
abe0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 77            ** row
abf0: 69 64 20 6f 66 20 74 68 65 20 73 75 62 2d 73 65  id of the sub-se
ac00: 6c 65 63 74 20 6f 72 20 76 69 65 77 2e 20 54 68  lect or view. Th
ac10: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
ac20: 20 6c 65 67 61 6c 20 28 73 65 65 20 0a 20 20 20   legal (see .   
ac30: 20 20 20 20 20 20 20 2a 2a 20 74 65 73 74 20 63         ** test c
ac40: 61 73 65 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d  ase misc2.2.2) -
ac50: 20 69 74 20 61 6c 77 61 79 73 20 65 76 61 6c 75   it always evalu
ac60: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20  ates to NULL..  
ac70: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
ac80: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
ac90: 20 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20   sNC;.          
aca0: 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45  Expr *p = pS->pE
acb0: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45  List->a[iCol].pE
acc0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73  xpr;.          s
acd0: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
ace0: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 20 20  ->pSrc;.        
acf0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e    sNC.pNext = pN
ad00: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43  C;.          sNC
ad10: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
ad20: 50 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20  Parse;.         
ad30: 20 7a 54 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54   zType = columnT
ad40: 79 70 65 28 26 73 4e 43 2c 20 70 2c 26 7a 4f 72  ype(&sNC, p,&zOr
ad50: 69 67 44 62 2c 26 7a 4f 72 69 67 54 61 62 2c 26  igDb,&zOrigTab,&
ad60: 7a 4f 72 69 67 43 6f 6c 2c 20 26 65 73 74 57 69  zOrigCol, &estWi
ad70: 64 74 68 29 3b 20 0a 20 20 20 20 20 20 20 20 7d  dth); .        }
ad80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ad90: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29   pTab->pSchema )
ada0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72  {.        /* A r
adb0: 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  eal table */.   
adc0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
add0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ade0: 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d 20  iCol<0 ) iCol = 
adf0: 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
ae00: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
ae10: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
ae20: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
ae30: 6e 43 6f 6c 29 20 29 3b 0a 23 69 66 64 65 66 20  nCol) );.#ifdef 
ae40: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
ae50: 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20  LUMN_METADATA.  
ae60: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30        if( iCol<0
ae70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54   ){.          zT
ae80: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
ae90: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
aea0: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
aeb0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
aec0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
aed0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
aee0: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
aef0: 20 20 7a 4f 72 69 67 43 6f 6c 20 3d 20 70 54 61    zOrigCol = pTa
af00: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
af10: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 65  ame;.          e
af20: 73 74 57 69 64 74 68 20 3d 20 70 54 61 62 2d 3e  stWidth = pTab->
af30: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74  aCol[iCol].szEst
af40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
af50: 20 20 20 20 7a 4f 72 69 67 54 61 62 20 3d 20 70      zOrigTab = p
af60: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
af70: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 70 50 61      if( pNC->pPa
af80: 72 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rse ){.         
af90: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
afa0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
afb0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c  pNC->pParse->db,
afc0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
afd0: 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67  .          zOrig
afe0: 44 62 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  Db = pNC->pParse
aff0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
b000: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Name;.        }.
b010: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66  #else.        if
b020: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
b030: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 49        zType = "I
b040: 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 20 20 20  NTEGER";.       
b050: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b060: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
b070: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
b080: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 73 74 57  ;.          estW
b090: 69 64 74 68 20 3d 20 70 54 61 62 2d 3e 61 43 6f  idth = pTab->aCo
b0a0: 6c 5b 69 43 6f 6c 5d 2e 73 7a 45 73 74 3b 0a 20  l[iCol].szEst;. 
b0b0: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
b0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
b0d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
b0e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
b0f0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
b100: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
b110: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
b120: 73 73 69 6f 6e 20 69 73 20 61 20 73 75 62 2d 73  ssion is a sub-s
b130: 65 6c 65 63 74 2e 20 52 65 74 75 72 6e 20 74 68  elect. Return th
b140: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
b150: 70 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  pe and.      ** 
b160: 6f 72 69 67 69 6e 20 69 6e 66 6f 20 66 6f 72 20  origin info for 
b170: 74 68 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  the single colum
b180: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
b190: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
b1a0: 54 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  T.      ** state
b1b0: 6d 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ment..      */. 
b1c0: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
b1d0: 20 73 4e 43 3b 0a 20 20 20 20 20 20 53 65 6c 65   sNC;.      Sele
b1e0: 63 74 20 2a 70 53 20 3d 20 70 45 78 70 72 2d 3e  ct *pS = pExpr->
b1f0: 78 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  x.pSelect;.     
b200: 20 45 78 70 72 20 2a 70 20 3d 20 70 53 2d 3e 70   Expr *p = pS->p
b210: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
b220: 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
b230: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
b240: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
b250: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73  lect) );.      s
b260: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  NC.pSrcList = pS
b270: 2d 3e 70 53 72 63 3b 0a 20 20 20 20 20 20 73 4e  ->pSrc;.      sN
b280: 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a 20  C.pNext = pNC;. 
b290: 20 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20       sNC.pParse 
b2a0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
b2b0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c       zType = col
b2c0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
b2d0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
b2e0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
b2f0: 20 26 65 73 74 57 69 64 74 68 29 3b 20 0a 20 20   &estWidth); .  
b300: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b310: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66  .#endif.  }..#if
b320: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b330: 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
b340: 41 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67  A  .  if( pzOrig
b350: 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  Db ){.    assert
b360: 28 20 70 7a 4f 72 69 67 54 61 62 20 26 26 20 70  ( pzOrigTab && p
b370: 7a 4f 72 69 67 43 6f 6c 20 29 3b 0a 20 20 20 20  zOrigCol );.    
b380: 2a 70 7a 4f 72 69 67 44 62 20 3d 20 7a 4f 72 69  *pzOrigDb = zOri
b390: 67 44 62 3b 0a 20 20 20 20 2a 70 7a 4f 72 69 67  gDb;.    *pzOrig
b3a0: 54 61 62 20 3d 20 7a 4f 72 69 67 54 61 62 3b 0a  Tab = zOrigTab;.
b3b0: 20 20 20 20 2a 70 7a 4f 72 69 67 43 6f 6c 20 3d      *pzOrigCol =
b3c0: 20 7a 4f 72 69 67 43 6f 6c 3b 0a 20 20 7d 0a 23   zOrigCol;.  }.#
b3d0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 73 74  endif.  if( pEst
b3e0: 57 69 64 74 68 20 29 20 2a 70 45 73 74 57 69 64  Width ) *pEstWid
b3f0: 74 68 20 3d 20 65 73 74 57 69 64 74 68 3b 0a 20  th = estWidth;. 
b400: 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a 7d   return zType;.}
b410: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
b420: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
b430: 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74 68  tell the VDBE th
b440: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
b450: 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  pes of columns.*
b460: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
b470: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  set..*/.static v
b480: 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  oid generateColu
b490: 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73 65  mnTypes(.  Parse
b4a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
b4b0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
b4c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
b4d0: 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  TabList,  /* Lis
b4e0: 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a 20  t of tables */. 
b4f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
b500: 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69  t    /* Expressi
b510: 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68 65  ons defining the
b520: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 29   result set */.)
b530: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
b540: 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
b550: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
b560: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
b570: 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  i;.  NameContext
b580: 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72 63   sNC;.  sNC.pSrc
b590: 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
b5a0: 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20  .  sNC.pParse = 
b5b0: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
b5c0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
b5d0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
b5e0: 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e  pr *p = pEList->
b5f0: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
b600: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
b610: 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
b620: 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
b630: 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e 73  ETADATA.    cons
b640: 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62 20  t char *zOrigDb 
b650: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  = 0;.    const c
b660: 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d 20  har *zOrigTab = 
b670: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
b680: 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30 3b  r *zOrigCol = 0;
b690: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f 6c  .    zType = col
b6a0: 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70 2c  umnType(&sNC, p,
b6b0: 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72 69   &zOrigDb, &zOri
b6c0: 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c 2c  gTab, &zOrigCol,
b6d0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65   0);..    /* The
b6e0: 20 76 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20   vdbe must make 
b6f0: 69 74 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20  its own copy of 
b700: 74 68 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20  the column-type 
b710: 61 6e 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a  and other .    *
b720: 2a 20 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69  * column specifi
b730: 63 20 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61  c strings, in ca
b740: 73 65 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  se the schema is
b750: 20 72 65 73 65 74 20 62 65 66 6f 72 65 20 74 68   reset before th
b760: 69 73 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  is.    ** virtua
b770: 6c 20 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c  l machine is del
b780: 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
b790: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
b7a0: 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c  olName(v, i, COL
b7b0: 4e 41 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a  NAME_DATABASE, z
b7c0: 4f 72 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54  OrigDb, SQLITE_T
b7d0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73  RANSIENT);.    s
b7e0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
b7f0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
b800: 4d 45 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54  ME_TABLE, zOrigT
b810: 61 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ab, SQLITE_TRANS
b820: 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  IENT);.    sqlit
b830: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
b840: 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43  (v, i, COLNAME_C
b850: 4f 4c 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c  OLUMN, zOrigCol,
b860: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
b870: 54 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54  T);.#else.    zT
b880: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
b890: 28 26 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20  (&sNC, p, 0, 0, 
b8a0: 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
b8b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
b8c0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
b8d0: 4c 4e 41 4d 45 5f 44 45 43 4c 54 59 50 45 2c 20  LNAME_DECLTYPE, 
b8e0: 7a 54 79 70 65 2c 20 53 51 4c 49 54 45 5f 54 52  zType, SQLITE_TR
b8f0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 23 65  ANSIENT);.  }.#e
b900: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
b910: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43  (SQLITE_OMIT_DEC
b920: 4c 54 59 50 45 29 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  LTYPE) */.}../*.
b930: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b940: 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c 20   that will tell 
b950: 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61 6d  the VDBE the nam
b960: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  es of columns.**
b970: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
b980: 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  et.  This inform
b990: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
b9a0: 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a 20   provide the.** 
b9b0: 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20 69  azCol[] values i
b9c0: 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  n the callback..
b9d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
b9e0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
b9f0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
ba00: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
ba10: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
ba20: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
ba30: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
ba40: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70 72  tables */.  Expr
ba50: 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20 20  List *pEList    
ba60: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20 64  /* Expressions d
ba70: 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73 75  efining the resu
ba80: 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 56  lt set */.){.  V
ba90: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
baa0: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 2c  >pVdbe;.  int i,
bab0: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   j;.  sqlite3 *d
bac0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
bad0: 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73 2c    int fullNames,
bae0: 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23 69   shortNames;..#i
baf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bb00: 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20 49  T_EXPLAIN.  /* I
bb10: 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50  f this is an EXP
bb20: 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73 20  LAIN, skip this 
bb30: 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70 50  step */.  if( pP
bb40: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
bb50: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
bb60: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
bb70: 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53  Parse->colNamesS
bb80: 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d 30  et || NEVER(v==0
bb90: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
bba0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
bbb0: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d    pParse->colNam
bbc0: 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75 6c  esSet = 1;.  ful
bbd0: 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66 6c  lNames = (db->fl
bbe0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
bbf0: 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a 20  lColNames)!=0;. 
bc00: 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28 64   shortNames = (d
bc10: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
bc20: 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 29  E_ShortColNames)
bc30: 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  !=0;.  sqlite3Vd
bc40: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c 20  beSetNumCols(v, 
bc50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
bc60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
bc70: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
bc80: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20  {.    Expr *p;. 
bc90: 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61     p = pEList->a
bca0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
bcb0: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29  f( NEVER(p==0) )
bcc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
bcd0: 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  f( pEList->a[i].
bce0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 63  zName ){.      c
bcf0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45 4c  har *zName = pEL
bd00: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b  ist->a[i].zName;
bd10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bd20: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20  beSetColName(v, 
bd30: 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c  i, COLNAME_NAME,
bd40: 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 54   zName, SQLITE_T
bd50: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
bd60: 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70 3d  else if( (p->op=
bd70: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 2d  =TK_COLUMN || p-
bd80: 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55  >op==TK_AGG_COLU
bd90: 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74 20  MN) && pTabList 
bda0: 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  ){.      Table *
bdb0: 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61 72  pTab;.      char
bdc0: 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69 6e   *zCol;.      in
bdd0: 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f 6c  t iCol = p->iCol
bde0: 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  umn;.      for(j
bdf0: 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54 61  =0; ALWAYS(j<pTa
be00: 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a 2b  bList->nSrc); j+
be10: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
be20: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 69  pTabList->a[j].i
be30: 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62 6c  Cursor==p->iTabl
be40: 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  e ) break;.     
be50: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
be60: 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   j<pTabList->nSr
be70: 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  c );.      pTab 
be80: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  = pTabList->a[j]
be90: 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28  .pTab;.      if(
bea0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
beb0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
bec0: 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c      assert( iCol
bed0: 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d 30  ==-1 || (iCol>=0
bee0: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
bef0: 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69 66  Col) );.      if
bf00: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
bf10: 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77 69      zCol = "rowi
bf20: 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  d";.      }else{
bf30: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  .        zCol = 
bf40: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
bf50: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  .zName;.      }.
bf60: 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72 74        if( !short
bf70: 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e 61  Names && !fullNa
bf80: 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  mes ){.        s
bf90: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
bfa0: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
bfb0: 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20 20  ME_NAME, .      
bfc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 53        sqlite3DbS
bfd0: 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74  trDup(db, pEList
bfe0: 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20 53  ->a[i].zSpan), S
bff0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
c000: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c010: 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20 20  fullNames ){.   
c020: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
c030: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e   = 0;.        zN
c040: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
c050: 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22  intf(db, "%s.%s"
c060: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
c070: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Col);.        sq
c080: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
c090: 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d  ame(v, i, COLNAM
c0a0: 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20 53  E_NAME, zName, S
c0b0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b 0a  QLITE_DYNAMIC);.
c0c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c0e0: 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c  SetColName(v, i,
c0f0: 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 7a   COLNAME_NAME, z
c100: 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  Col, SQLITE_TRAN
c110: 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d 0a  SIENT);.      }.
c120: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c130: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
c140: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53   pEList->a[i].zS
c150: 70 61 6e 3b 0a 20 20 20 20 20 20 7a 20 3d 20 7a  pan;.      z = z
c160: 3d 3d 30 20 3f 20 73 71 6c 69 74 65 33 4d 50 72  ==0 ? sqlite3MPr
c170: 69 6e 74 66 28 64 62 2c 20 22 63 6f 6c 75 6d 6e  intf(db, "column
c180: 25 64 22 2c 20 69 2b 31 29 20 3a 20 73 71 6c 69  %d", i+1) : sqli
c190: 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20  te3DbStrDup(db, 
c1a0: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
c1b0: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
c1c0: 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41  v, i, COLNAME_NA
c1d0: 4d 45 2c 20 7a 2c 20 53 51 4c 49 54 45 5f 44 59  ME, z, SQLITE_DY
c1e0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20  NAMIC);.    }.  
c1f0: 7d 0a 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75  }.  generateColu
c200: 6d 6e 54 79 70 65 73 28 70 50 61 72 73 65 2c 20  mnTypes(pParse, 
c210: 70 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74  pTabList, pEList
c220: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  );.}../*.** Give
c230: 6e 20 61 20 61 6e 20 65 78 70 72 65 73 73 69 6f  n a an expressio
c240: 6e 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73  n list (which is
c250: 20 72 65 61 6c 6c 79 20 74 68 65 20 6c 69 73 74   really the list
c260: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 0a   of expressions.
c270: 2a 2a 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ** that form the
c280: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
c290: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c2a0: 74 29 20 63 6f 6d 70 75 74 65 20 61 70 70 72 6f  t) compute appro
c2b0: 70 72 69 61 74 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  priate.** column
c2c0: 20 6e 61 6d 65 73 20 66 6f 72 20 61 20 74 61 62   names for a tab
c2d0: 6c 65 20 74 68 61 74 20 77 6f 75 6c 64 20 68 6f  le that would ho
c2e0: 6c 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ld the expressio
c2f0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c  n list..**.** Al
c300: 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 77  l column names w
c310: 69 6c 6c 20 62 65 20 75 6e 69 71 75 65 2e 0a 2a  ill be unique..*
c320: 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 63 6f  *.** Only the co
c330: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 63  lumn names are c
c340: 6f 6d 70 75 74 65 64 2e 20 20 43 6f 6c 75 6d 6e  omputed.  Column
c350: 2e 7a 54 79 70 65 2c 20 43 6f 6c 75 6d 6e 2e 7a  .zType, Column.z
c360: 43 6f 6c 6c 2c 0a 2a 2a 20 61 6e 64 20 6f 74 68  Coll,.** and oth
c370: 65 72 20 66 69 65 6c 64 73 20 6f 66 20 43 6f 6c  er fields of Col
c380: 75 6d 6e 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  umn are zeroed..
c390: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
c3a0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
c3b0: 73 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  s.  If a memory 
c3c0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
c3d0: 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 73 74 6f 72   occurs,.** stor
c3e0: 65 20 4e 55 4c 4c 20 69 6e 20 2a 70 61 43 6f 6c  e NULL in *paCol
c3f0: 20 61 6e 64 20 30 20 69 6e 20 2a 70 6e 43 6f 6c   and 0 in *pnCol
c400: 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
c410: 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61  TE_NOMEM..*/.sta
c420: 74 69 63 20 69 6e 74 20 73 65 6c 65 63 74 43 6f  tic int selectCo
c430: 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
c440: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
c450: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
c460: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c470: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c480: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
c490: 45 78 70 72 20 6c 69 73 74 20 66 72 6f 6d 20 77  Expr list from w
c4a0: 68 69 63 68 20 74 6f 20 64 65 72 69 76 65 20 63  hich to derive c
c4b0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
c4c0: 20 69 31 36 20 2a 70 6e 43 6f 6c 2c 20 20 20 20   i16 *pnCol,    
c4d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
c4e0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
c4f0: 63 6f 6c 75 6d 6e 73 20 68 65 72 65 20 2a 2f 0a  columns here */.
c500: 20 20 43 6f 6c 75 6d 6e 20 2a 2a 70 61 43 6f 6c    Column **paCol
c510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
c520: 74 65 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d  te the new colum
c530: 6e 20 6c 69 73 74 20 68 65 72 65 20 2a 2f 0a 29  n list here */.)
c540: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
c550: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
c560: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
c570: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
c580: 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
c590: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
c5a0: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
c5b0: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
c5c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
c5d0: 65 78 20 61 64 64 65 64 20 74 6f 20 6d 61 6b 65  ex added to make
c5e0: 20 74 68 65 20 6e 61 6d 65 20 75 6e 69 71 75 65   the name unique
c5f0: 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43   */.  Column *aC
c600: 6f 6c 2c 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20  ol, *pCol;      
c610: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
c620: 20 6f 76 65 72 20 72 65 73 75 6c 74 20 63 6f 6c   over result col
c630: 75 6d 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  umns */.  int nC
c640: 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
c650: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c660: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
c670: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
c680: 20 20 45 78 70 72 20 2a 70 3b 20 20 20 20 20 20    Expr *p;      
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c6a0: 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
c6b0: 61 20 73 69 6e 67 6c 65 20 72 65 73 75 6c 74 20  a single result 
c6c0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
c6d0: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
c6e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
c6f0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  n name */.  int 
c700: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
c710: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
c720: 6f 66 20 6e 61 6d 65 20 69 6e 20 7a 4e 61 6d 65  of name in zName
c730: 5b 5d 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 4c  [] */..  if( pEL
c740: 69 73 74 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 20  ist ){.    nCol 
c750: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
c760: 0a 20 20 20 20 61 43 6f 6c 20 3d 20 73 71 6c 69  .    aCol = sqli
c770: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
c780: 64 62 2c 20 73 69 7a 65 6f 66 28 61 43 6f 6c 5b  db, sizeof(aCol[
c790: 30 5d 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 74  0])*nCol);.    t
c7a0: 65 73 74 63 61 73 65 28 20 61 43 6f 6c 3d 3d 30  estcase( aCol==0
c7b0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
c7c0: 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 61   nCol = 0;.    a
c7d0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  Col = 0;.  }.  *
c7e0: 70 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  pnCol = nCol;.  
c7f0: 2a 70 61 43 6f 6c 20 3d 20 61 43 6f 6c 3b 0a 0a  *paCol = aCol;..
c800: 20 20 66 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d    for(i=0, pCol=
c810: 61 43 6f 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  aCol; i<nCol; i+
c820: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
c830: 2f 2a 20 47 65 74 20 61 6e 20 61 70 70 72 6f 70  /* Get an approp
c840: 72 69 61 74 65 20 6e 61 6d 65 20 66 6f 72 20 74  riate name for t
c850: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 2a 2f  he column.    */
c860: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
c870: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
c880: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
c890: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e  pr);.    if( (zN
c8a0: 61 6d 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ame = pEList->a[
c8b0: 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  i].zName)!=0 ){.
c8c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
c8d0: 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20  column contains 
c8e0: 61 6e 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70  an "AS <name>" p
c8f0: 68 72 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65  hrase, use <name
c900: 3e 20 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f  > as the name */
c910: 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
c920: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c930: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b, zName);.    }
c940: 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
c950: 20 2a 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20   *pColExpr = p; 
c960: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c970: 6f 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 72  on that is the r
c980: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d  esult column nam
c990: 65 20 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65  e */.      Table
c9a0: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
c9b0: 2f 2a 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61  /* Table associa
c9c0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 65 78  ted with this ex
c9d0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
c9e0: 20 20 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70    while( pColExp
c9f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b  r->op==TK_DOT ){
ca00: 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70  .        pColExp
ca10: 72 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52  r = pColExpr->pR
ca20: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73  ight;.        as
ca30: 73 65 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d  sert( pColExpr!=
ca40: 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
ca50: 20 20 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d     if( pColExpr-
ca60: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
ca70: 26 20 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70  & ALWAYS(pColExp
ca80: 72 2d 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20  r->pTab!=0) ){. 
ca90: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f         /* For co
caa0: 6c 75 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f  lumns use the co
cab0: 6c 75 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a  lumn name name *
cac0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  /.        int iC
cad0: 6f 6c 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69  ol = pColExpr->i
cae0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
caf0: 70 54 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d  pTab = pColExpr-
cb00: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69  >pTab;.        i
cb10: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
cb20: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
cb30: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
cb40: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
cb50: 62 2c 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20  b, "%s",.       
cb60: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d            iCol>=
cb70: 30 20 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  0 ? pTab->aCol[i
cb80: 43 6f 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f  Col].zName : "ro
cb90: 77 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  wid");.      }el
cba0: 73 65 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d  se if( pColExpr-
cbb0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
cbc0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
cbd0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
cbe0: 43 6f 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  ColExpr, EP_IntV
cbf0: 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
cc00: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
cc10: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
cc20: 2c 20 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54  , pColExpr->u.zT
cc30: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
cc40: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55  se{.        /* U
cc50: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
cc60: 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75  text of the colu
cc70: 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  mn expression as
cc80: 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20   its name */.   
cc90: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
cca0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
ccb0: 22 25 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  "%s", pEList->a[
ccc0: 69 5d 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20  i].zSpan);.     
ccd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
cce0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ccf0: 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
cd00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
cd10: 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  me);.      break
cd20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
cd30: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f  Make sure the co
cd40: 6c 75 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69  lumn name is uni
cd50: 71 75 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d  que.  If the nam
cd60: 65 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c  e is not unique,
cd70: 0a 20 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61  .    ** append a
cd80: 20 69 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20   integer to the 
cd90: 6e 61 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20  name so that it 
cda0: 62 65 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a  becomes unique..
cdb0: 20 20 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65      */.    nName
cdc0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
cdd0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66  30(zName);.    f
cde0: 6f 72 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b  or(j=cnt=0; j<i;
cdf0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
ce00: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ce10: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a  aCol[j].zName, z
ce20: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
ce30: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61      char *zNewNa
ce40: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  me;.        int 
ce50: 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b  k;.        for(k
ce60: 3d 6e 4e 61 6d 65 2d 31 3b 20 6b 3e 31 20 26 26  =nName-1; k>1 &&
ce70: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
ce80: 7a 4e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b  zName[k]); k--){
ce90: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  }.        if( zN
cea0: 61 6d 65 5b 6b 5d 3d 3d 27 3a 27 20 29 20 6e 4e  ame[k]==':' ) nN
ceb0: 61 6d 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20  ame = k;.       
cec0: 20 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20   zName[nName] = 
ced0: 30 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77 4e  0;.        zNewN
cee0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  ame = sqlite3MPr
cef0: 69 6e 74 66 28 64 62 2c 20 22 25 73 3a 25 64 22  intf(db, "%s:%d"
cf00: 2c 20 7a 4e 61 6d 65 2c 20 2b 2b 63 6e 74 29 3b  , zName, ++cnt);
cf10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cf20: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
cf30: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  );.        zName
cf40: 20 3d 20 7a 4e 65 77 4e 61 6d 65 3b 0a 20 20 20   = zNewName;.   
cf50: 20 20 20 20 20 6a 20 3d 20 2d 31 3b 0a 20 20 20       j = -1;.   
cf60: 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d       if( zName==
cf70: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
cf80: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f   }.    }.    pCo
cf90: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  l->zName = zName
cfa0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e  ;.  }.  if( db->
cfb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
cfc0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 69      for(j=0; j<i
cfd0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; j++){.      sq
cfe0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
cff0: 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 29 3b 0a  aCol[j].zName);.
d000: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
d010: 33 44 62 46 72 65 65 28 64 62 2c 20 61 43 6f 6c  3DbFree(db, aCol
d020: 29 3b 0a 20 20 20 20 2a 70 61 43 6f 6c 20 3d 20  );.    *paCol = 
d030: 30 3b 0a 20 20 20 20 2a 70 6e 43 6f 6c 20 3d 20  0;.    *pnCol = 
d040: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
d050: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
d060: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d070: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  OK;.}../*.** Add
d080: 20 74 79 70 65 20 61 6e 64 20 63 6f 6c 6c 61 74   type and collat
d090: 69 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ion information 
d0a0: 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74  to a column list
d0b0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 20 53   based on.** a S
d0c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
d0d0: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 6c 75  .** .** The colu
d0e0: 6d 6e 20 6c 69 73 74 20 70 72 65 73 75 6d 61 62  mn list presumab
d0f0: 6c 79 20 63 61 6d 65 20 66 72 6f 6d 20 73 65 6c  ly came from sel
d100: 65 63 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 46 72  ectColumnNamesFr
d110: 6f 6d 45 78 70 72 4c 69 73 74 28 29 2e 0a 2a 2a  omExprList()..**
d120: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
d130: 20 68 61 73 20 6f 6e 6c 79 20 6e 61 6d 65 73 2c   has only names,
d140: 20 6e 6f 74 20 74 79 70 65 73 20 6f 72 20 63 6f   not types or co
d150: 6c 6c 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 0a  llations.  This.
d160: 2a 2a 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20  ** routine goes 
d170: 74 68 72 6f 75 67 68 20 61 6e 64 20 61 64 64 73  through and adds
d180: 20 74 68 65 20 74 79 70 65 73 20 61 6e 64 20 63   the types and c
d190: 6f 6c 6c 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  ollations..**.**
d1a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
d1b0: 71 75 69 72 65 73 20 74 68 61 74 20 61 6c 6c 20  quires that all 
d1c0: 69 64 65 6e 74 69 66 69 65 72 73 20 69 6e 20 74  identifiers in t
d1d0: 68 65 20 53 45 4c 45 43 54 0a 2a 2a 20 73 74 61  he SELECT.** sta
d1e0: 74 65 6d 65 6e 74 20 62 65 20 72 65 73 6f 6c 76  tement be resolv
d1f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
d200: 69 64 20 73 65 6c 65 63 74 41 64 64 43 6f 6c 75  id selectAddColu
d210: 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74 69  mnTypeAndCollati
d220: 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  on(.  Parse *pPa
d230: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
d240: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 73 20  arsing contexts 
d250: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
d260: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  ,          /* Ad
d270: 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e  d column type in
d280: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
d290: 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c  s table */.  Sel
d2a0: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
d2b0: 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65     /* SELECT use
d2c0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  d to determine t
d2d0: 79 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69  ypes and collati
d2e0: 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ons */.){.  sqli
d2f0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d300: 2d 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74  ->db;.  NameCont
d310: 65 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d  ext sNC;.  Colum
d320: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53  n *pCol;.  CollS
d330: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74  eq *pColl;.  int
d340: 20 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20   i;.  Expr *p;. 
d350: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
d360: 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 75 36 34 20  _item *a;.  u64 
d370: 73 7a 41 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73  szAll = 0;..  as
d380: 73 65 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30  sert( pSelect!=0
d390: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
d3a0: 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
d3b0: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21   & SF_Resolved)!
d3c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d3d0: 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c  pTab->nCol==pSel
d3e0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
d3f0: 70 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  pr || db->malloc
d400: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
d410: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
d420: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6d 65 6d   ) return;.  mem
d430: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
d440: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 73 4e 43  eof(sNC));.  sNC
d450: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
d460: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 61 20 3d  ect->pSrc;.  a =
d470: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
d480: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
d490: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
d4a0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
d4b0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
d4c0: 20 70 20 3d 20 61 5b 69 5d 2e 70 45 78 70 72 3b   p = a[i].pExpr;
d4d0: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  .    pCol->zType
d4e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
d4f0: 75 70 28 64 62 2c 20 63 6f 6c 75 6d 6e 54 79 70  up(db, columnTyp
d500: 65 28 26 73 4e 43 2c 20 70 2c 30 2c 30 2c 30 2c  e(&sNC, p,0,0,0,
d510: 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 29 3b   &pCol->szEst));
d520: 0a 20 20 20 20 73 7a 41 6c 6c 20 2b 3d 20 70 43  .    szAll += pC
d530: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 20 20 70  ol->szEst;.    p
d540: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
d550: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
d560: 69 74 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ity(p);.    if( 
d570: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
d580: 30 20 29 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  0 ) pCol->affini
d590: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
d5a0: 4e 4f 4e 45 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  NONE;.    pColl 
d5b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
d5c0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 29 3b  lSeq(pParse, p);
d5d0: 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
d5e0: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 43  {.      pCol->zC
d5f0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  oll = sqlite3DbS
d600: 74 72 44 75 70 28 64 62 2c 20 70 43 6f 6c 6c 2d  trDup(db, pColl-
d610: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
d620: 20 7d 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62   }.  pTab->szTab
d630: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
d640: 45 73 74 28 73 7a 41 6c 6c 2a 34 29 3b 0a 7d 0a  Est(szAll*4);.}.
d650: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 53  ./*.** Given a S
d660: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
d670: 20 67 65 6e 65 72 61 74 65 20 61 20 54 61 62 6c   generate a Tabl
d680: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
d690: 20 64 65 73 63 72 69 62 65 73 0a 2a 2a 20 74 68   describes.** th
d6a0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
d6b0: 74 68 61 74 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a  that SELECT..*/.
d6c0: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 52 65  Table *sqlite3Re
d6d0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
d6e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
d6f0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b  elect *pSelect){
d700: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
d710: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d720: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
d730: 74 20 73 61 76 65 64 46 6c 61 67 73 3b 0a 0a 20  t savedFlags;.. 
d740: 20 73 61 76 65 64 46 6c 61 67 73 20 3d 20 64 62   savedFlags = db
d750: 2d 3e 66 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 66  ->flags;.  db->f
d760: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
d770: 46 75 6c 6c 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20  FullColNames;.  
d780: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
d790: 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
d7a0: 73 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  s;.  sqlite3Sele
d7b0: 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70  ctPrep(pParse, p
d7c0: 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66  Select, 0);.  if
d7d0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
d7e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
d7f0: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
d800: 69 6f 72 20 29 20 70 53 65 6c 65 63 74 20 3d 20  ior ) pSelect = 
d810: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
d820: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73  .  db->flags = s
d830: 61 76 65 64 46 6c 61 67 73 3b 0a 20 20 70 54 61  avedFlags;.  pTa
d840: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  b = sqlite3DbMal
d850: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
d860: 6f 66 28 54 61 62 6c 65 29 20 29 3b 0a 20 20 69  of(Table) );.  i
d870: 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
d880: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d890: 20 20 2f 2a 20 54 68 65 20 73 71 6c 69 74 65 33    /* The sqlite3
d8a0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
d8b0: 74 28 29 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  t() is only used
d8c0: 20 6e 20 63 6f 6e 74 65 78 74 73 20 77 68 65 72   n contexts wher
d8d0: 65 20 6c 6f 6f 6b 61 73 69 64 65 0a 20 20 2a 2a  e lookaside.  **
d8e0: 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
d8f0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
d900: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
d910: 3d 3d 30 20 29 3b 0a 20 20 70 54 61 62 2d 3e 6e  ==0 );.  pTab->n
d920: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 2d  Ref = 1;.  pTab-
d930: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 70 54  >zName = 0;.  pT
d940: 61 62 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30  ab->nRowEst = 10
d950: 34 38 35 37 36 3b 0a 20 20 73 65 6c 65 63 74 43  48576;.  selectC
d960: 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69  olumnsFromExprLi
d970: 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  st(pParse, pSele
d980: 63 74 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61  ct->pEList, &pTa
d990: 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e  b->nCol, &pTab->
d9a0: 61 43 6f 6c 29 3b 0a 20 20 73 65 6c 65 63 74 41  aCol);.  selectA
d9b0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43  ddColumnTypeAndC
d9c0: 6f 6c 6c 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  ollation(pParse,
d9d0: 20 70 54 61 62 2c 20 70 53 65 6c 65 63 74 29 3b   pTab, pSelect);
d9e0: 0a 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d  .  pTab->iPKey =
d9f0: 20 2d 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   -1;.  if( db->m
da00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
da10: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
da20: 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b  Table(db, pTab);
da30: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
da40: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62   }.  return pTab
da50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
da60: 20 56 44 42 45 20 66 6f 72 20 74 68 65 20 67 69   VDBE for the gi
da70: 76 65 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65  ven parser conte
da80: 78 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  xt.  Create a ne
da90: 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
daa0: 72 79 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  ry..** If an err
dab0: 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
dac0: 6e 20 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65  n NULL and leave
dad0: 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50   a message in pP
dae0: 61 72 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73  arse..*/.Vdbe *s
daf0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 50 61  qlite3GetVdbe(Pa
db00: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
db10: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
db20: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76  ->pVdbe;.  if( v
db30: 3d 3d 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70  ==0 ){.    v = p
db40: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73  Parse->pVdbe = s
db50: 71 6c 69 74 65 33 56 64 62 65 43 72 65 61 74 65  qlite3VdbeCreate
db60: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
db70: 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62  ( v ) sqlite3Vdb
db80: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 49 6e  eAddOp0(v, OP_In
db90: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  it);.    if( pPa
dba0: 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65 6c 3d 3d  rse->pToplevel==
dbb0: 30 0a 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69  0.     && Optimi
dbc0: 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 50  zationEnabled(pP
dbd0: 61 72 73 65 2d 3e 64 62 2c 53 51 4c 49 54 45 5f  arse->db,SQLITE_
dbe0: 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 29 0a  FactorOutConst).
dbf0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 50 61      ){.      pPa
dc00: 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
dc10: 6f 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  or = 1;.    }.. 
dc20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 76 3b 0a 7d   }.  return v;.}
dc30: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  .../*.** Compute
dc40: 20 74 68 65 20 69 4c 69 6d 69 74 20 61 6e 64 20   the iLimit and 
dc50: 69 4f 66 66 73 65 74 20 66 69 65 6c 64 73 20 6f  iOffset fields o
dc60: 66 20 74 68 65 20 53 45 4c 45 43 54 20 62 61 73  f the SELECT bas
dc70: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 70 4c 69  ed on the.** pLi
dc80: 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74 20  mit and pOffset 
dc90: 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 70 4c  expressions.  pL
dca0: 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65 74  imit and pOffset
dcb0: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 72 65 73   hold the expres
dcc0: 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74 20 61 70  sions.** that ap
dcd0: 70 65 61 72 20 69 6e 20 74 68 65 20 6f 72 69 67  pear in the orig
dce0: 69 6e 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  inal SQL stateme
dcf0: 6e 74 20 61 66 74 65 72 20 74 68 65 20 4c 49 4d  nt after the LIM
dd00: 49 54 20 61 6e 64 20 4f 46 46 53 45 54 0a 2a 2a  IT and OFFSET.**
dd10: 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 4e   keywords.  Or N
dd20: 55 4c 4c 20 69 66 20 74 68 6f 73 65 20 6b 65 79  ULL if those key
dd30: 77 6f 72 64 73 20 61 72 65 20 6f 6d 69 74 74 65  words are omitte
dd40: 64 2e 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f  d. iLimit and iO
dd50: 66 66 73 65 74 20 0a 2a 2a 20 61 72 65 20 74 68  ffset .** are th
dd60: 65 20 69 6e 74 65 67 65 72 20 6d 65 6d 6f 72 79  e integer memory
dd70: 20 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72   register number
dd80: 73 20 66 6f 72 20 63 6f 75 6e 74 65 72 73 20 75  s for counters u
dd90: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 0a  sed to compute .
dda0: 2a 2a 20 74 68 65 20 6c 69 6d 69 74 20 61 6e 64  ** the limit and
ddb0: 20 6f 66 66 73 65 74 2e 20 20 49 66 20 74 68 65   offset.  If the
ddc0: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 61  re is no limit a
ddd0: 6e 64 2f 6f 72 20 6f 66 66 73 65 74 2c 20 74 68  nd/or offset, th
dde0: 65 6e 20 0a 2a 2a 20 69 4c 69 6d 69 74 20 61 6e  en .** iLimit an
ddf0: 64 20 69 4f 66 66 73 65 74 20 61 72 65 20 6e 65  d iOffset are ne
de00: 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  gative..**.** Th
de10: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 61 6e 67  is routine chang
de20: 65 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  es the values of
de30: 20 69 4c 69 6d 69 74 20 61 6e 64 20 69 4f 66 66   iLimit and iOff
de40: 73 65 74 20 6f 6e 6c 79 20 69 66 0a 2a 2a 20 61  set only if.** a
de50: 20 6c 69 6d 69 74 20 6f 72 20 6f 66 66 73 65 74   limit or offset
de60: 20 69 73 20 64 65 66 69 6e 65 64 20 62 79 20 70   is defined by p
de70: 4c 69 6d 69 74 20 61 6e 64 20 70 4f 66 66 73 65  Limit and pOffse
de80: 74 2e 20 20 69 4c 69 6d 69 74 20 61 6e 64 0a 2a  t.  iLimit and.*
de90: 2a 20 69 4f 66 66 73 65 74 20 73 68 6f 75 6c 64  * iOffset should
dea0: 20 68 61 76 65 20 62 65 65 6e 20 70 72 65 73 65   have been prese
deb0: 74 20 74 6f 20 61 70 70 72 6f 70 72 69 61 74 65  t to appropriate
dec0: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 73 20   default values 
ded0: 28 7a 65 72 6f 29 0a 2a 2a 20 70 72 69 6f 72 20  (zero).** prior 
dee0: 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
def0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
df00: 68 65 20 69 4f 66 66 73 65 74 20 72 65 67 69 73  he iOffset regis
df10: 74 65 72 20 28 69 66 20 69 74 20 65 78 69 73 74  ter (if it exist
df20: 73 29 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  s) is initialize
df30: 64 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a 2a  d to the value.*
df40: 2a 20 6f 66 20 74 68 65 20 4f 46 46 53 45 54 2e  * of the OFFSET.
df50: 20 20 54 68 65 20 69 4c 69 6d 69 74 20 72 65 67    The iLimit reg
df60: 69 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c  ister is initial
df70: 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2e 20 20  ized to LIMIT.  
df80: 52 65 67 69 73 74 65 72 0a 2a 2a 20 69 4f 66 66  Register.** iOff
df90: 73 65 74 2b 31 20 69 73 20 69 6e 69 74 69 61 6c  set+1 is initial
dfa0: 69 7a 65 64 20 74 6f 20 4c 49 4d 49 54 2b 4f 46  ized to LIMIT+OF
dfb0: 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  FSET..**.** Only
dfc0: 20 69 66 20 70 4c 69 6d 69 74 21 3d 30 20 6f 72   if pLimit!=0 or
dfd0: 20 70 4f 66 66 73 65 74 21 3d 30 20 64 6f 20 74   pOffset!=0 do t
dfe0: 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65  he limit registe
dff0: 72 73 20 67 65 74 0a 2a 2a 20 72 65 64 65 66 69  rs get.** redefi
e000: 6e 65 64 2e 20 20 54 68 65 20 55 4e 49 4f 4e 20  ned.  The UNION 
e010: 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 75 73 65  ALL operator use
e020: 73 20 74 68 69 73 20 70 72 6f 70 65 72 74 79 20  s this property 
e030: 74 6f 20 66 6f 72 63 65 0a 2a 2a 20 74 68 65 20  to force.** the 
e040: 72 65 75 73 65 20 6f 66 20 74 68 65 20 73 61 6d  reuse of the sam
e050: 65 20 6c 69 6d 69 74 20 61 6e 64 20 6f 66 66 73  e limit and offs
e060: 65 74 20 72 65 67 69 73 74 65 72 73 20 61 63 72  et registers acr
e070: 6f 73 73 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  oss multiple.** 
e080: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e090: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
e0a0: 64 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65  d computeLimitRe
e0b0: 67 69 73 74 65 72 73 28 50 61 72 73 65 20 2a 70  gisters(Parse *p
e0c0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
e0d0: 2c 20 69 6e 74 20 69 42 72 65 61 6b 29 7b 0a 20  , int iBreak){. 
e0e0: 20 56 64 62 65 20 2a 76 20 3d 20 30 3b 0a 20 20   Vdbe *v = 0;.  
e0f0: 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a  int iLimit = 0;.
e100: 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a 20    int iOffset;. 
e110: 20 69 6e 74 20 61 64 64 72 31 2c 20 6e 3b 0a 20   int addr1, n;. 
e120: 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 20 29   if( p->iLimit )
e130: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a   return;..  /* .
e140: 20 20 2a 2a 20 22 4c 49 4d 49 54 20 2d 31 22 20    ** "LIMIT -1" 
e150: 61 6c 77 61 79 73 20 73 68 6f 77 73 20 61 6c 6c  always shows all
e160: 20 72 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73   rows.  There is
e170: 20 73 6f 6d 65 0a 20 20 2a 2a 20 63 6f 6e 74 72   some.  ** contr
e180: 6f 76 65 72 73 79 20 61 62 6f 75 74 20 77 68 61  oversy about wha
e190: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  t the correct be
e1a0: 68 61 76 69 6f 72 20 73 68 6f 75 6c 64 20 62 65  havior should be
e1b0: 2e 0a 20 20 2a 2a 20 54 68 65 20 63 75 72 72 65  ..  ** The curre
e1c0: 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
e1d0: 6e 20 69 6e 74 65 72 70 72 65 74 73 20 22 4c 49  n interprets "LI
e1e0: 4d 49 54 20 30 22 20 74 6f 20 6d 65 61 6e 0a 20  MIT 0" to mean. 
e1f0: 20 2a 2a 20 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a   ** no rows..  *
e200: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  /.  sqlite3ExprC
e210: 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
e220: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
e230: 70 4f 66 66 73 65 74 3d 3d 30 20 7c 7c 20 70 2d  pOffset==0 || p-
e240: 3e 70 4c 69 6d 69 74 21 3d 30 20 29 3b 0a 20 20  >pLimit!=0 );.  
e250: 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29 7b  if( p->pLimit ){
e260: 0a 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d  .    p->iLimit =
e270: 20 69 4c 69 6d 69 74 20 3d 20 2b 2b 70 50 61 72   iLimit = ++pPar
e280: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 76 20  se->nMem;.    v 
e290: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
e2a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 61 73  (pParse);.    as
e2b0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
e2c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
e2d0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
e2e0: 69 6d 69 74 2c 20 26 6e 29 20 29 7b 0a 20 20 20  imit, &n) ){.   
e2f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e300: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
e310: 65 72 2c 20 6e 2c 20 69 4c 69 6d 69 74 29 3b 0a  er, n, iLimit);.
e320: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
e330: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
e340: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 69  nter"));.      i
e350: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
e360: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e370: 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
e380: 20 30 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20   0, iBreak);.   
e390: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3e 3d     }else if( n>=
e3a0: 30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52  0 && p->nSelectR
e3b0: 6f 77 3e 28 75 36 34 29 6e 20 29 7b 0a 20 20 20  ow>(u64)n ){.   
e3c0: 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52       p->nSelectR
e3d0: 6f 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  ow = n;.      }.
e3e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e3f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e400: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4c 69 6d  (pParse, p->pLim
e410: 69 74 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  it, iLimit);.   
e420: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e430: 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp1(v, OP_MustB
e440: 65 49 6e 74 2c 20 69 4c 69 6d 69 74 29 3b 20 56  eInt, iLimit); V
e450: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
e460: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
e470: 74 28 28 76 2c 20 22 4c 49 4d 49 54 20 63 6f 75  t((v, "LIMIT cou
e480: 6e 74 65 72 22 29 29 3b 0a 20 20 20 20 20 20 73  nter"));.      s
e490: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e4a0: 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 69  (v, OP_IfZero, i
e4b0: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 29 3b 20  Limit, iBreak); 
e4c0: 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
e4d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
e4e0: 2d 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20  ->pOffset ){.   
e4f0: 20 20 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20     p->iOffset = 
e500: 69 4f 66 66 73 65 74 20 3d 20 2b 2b 70 50 61 72  iOffset = ++pPar
e510: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
e520: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 20  pParse->nMem++; 
e530: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
e540: 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 20   extra register 
e550: 66 6f 72 20 6c 69 6d 69 74 2b 6f 66 66 73 65 74  for limit+offset
e560: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
e570: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
e580: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 2c 20 69 4f  , p->pOffset, iO
e590: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
e5a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
e5b0: 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c  v, OP_MustBeInt,
e5c0: 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62 65 43   iOffset); VdbeC
e5d0: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
e5e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
e5f0: 2c 20 22 4f 46 46 53 45 54 20 63 6f 75 6e 74 65  , "OFFSET counte
e600: 72 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72  r"));.      addr
e610: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
e620: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
e630: 73 2c 20 69 4f 66 66 73 65 74 29 3b 20 56 64 62  s, iOffset); Vdb
e640: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
e650: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e660: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
e670: 67 65 72 2c 20 30 2c 20 69 4f 66 66 73 65 74 29  ger, 0, iOffset)
e680: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e690: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
e6a0: 64 64 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ddr1);.      sql
e6b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
e6c0: 2c 20 4f 50 5f 41 64 64 2c 20 69 4c 69 6d 69 74  , OP_Add, iLimit
e6d0: 2c 20 69 4f 66 66 73 65 74 2c 20 69 4f 66 66 73  , iOffset, iOffs
e6e0: 65 74 2b 31 29 3b 0a 20 20 20 20 20 20 56 64 62  et+1);.      Vdb
e6f0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49  eComment((v, "LI
e700: 4d 49 54 2b 4f 46 46 53 45 54 22 29 29 3b 0a 20  MIT+OFFSET"));. 
e710: 20 20 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c       addr1 = sql
e720: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
e730: 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 4c 69 6d  , OP_IfPos, iLim
e740: 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  it); VdbeCoverag
e750: 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(v);.      sqli
e760: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
e770: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 2d 31 2c   OP_Integer, -1,
e780: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
e790: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
e7a0: 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
e7b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
e7c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e7d0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
e7e0: 43 54 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  CT./*.** Return 
e7f0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
e800: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
e810: 63 65 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d  ce for the iCol-
e820: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 0a 2a 2a 20  th column of.** 
e830: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 66  the result set f
e840: 6f 72 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 2d  or the compound-
e850: 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74  select statement
e860: 20 22 70 22 2e 20 20 52 65 74 75 72 6e 20 4e 55   "p".  Return NU
e870: 4c 4c 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  LL if.** the col
e880: 75 6d 6e 20 68 61 73 20 6e 6f 20 64 65 66 61 75  umn has no defau
e890: 6c 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  lt collating seq
e8a0: 75 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uence..**.** The
e8b0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
e8c0: 6e 63 65 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  nce for the comp
e8d0: 6f 75 6e 64 20 73 65 6c 65 63 74 20 69 73 20 74  ound select is t
e8e0: 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  aken from the.**
e8f0: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 20   left-most term 
e900: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 74 68  of the select th
e910: 61 74 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69  at has a collati
e920: 6e 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2f 0a  ng sequence..*/.
e930: 73 74 61 74 69 63 20 43 6f 6c 6c 53 65 71 20 2a  static CollSeq *
e940: 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53  multiSelectCollS
e950: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
e960: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
e970: 20 69 43 6f 6c 29 7b 0a 20 20 43 6f 6c 6c 53 65   iCol){.  CollSe
e980: 71 20 2a 70 52 65 74 3b 0a 20 20 69 66 28 20 70  q *pRet;.  if( p
e990: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
e9a0: 70 52 65 74 20 3d 20 6d 75 6c 74 69 53 65 6c 65  pRet = multiSele
e9b0: 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  ctCollSeq(pParse
e9c0: 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20 69 43 6f  , p->pPrior, iCo
e9d0: 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  l);.  }else{.   
e9e0: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   pRet = 0;.  }. 
e9f0: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
ea00: 20 29 3b 0a 20 20 69 66 28 20 70 52 65 74 3d 3d   );.  if( pRet==
ea10: 30 20 26 26 20 69 43 6f 6c 3c 70 2d 3e 70 45 4c  0 && iCol<p->pEL
ea20: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
ea30: 20 20 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33    pRet = sqlite3
ea40: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
ea50: 73 65 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  se, p->pEList->a
ea60: 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 29 3b 0a 20  [iCol].pExpr);. 
ea70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74   }.  return pRet
ea80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
ea90: 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
eaa0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
eab0: 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
eac0: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  s a compound SEL
ead0: 45 43 54 0a 2a 2a 20 77 69 74 68 20 61 6e 20 4f  ECT.** with an O
eae0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20  RDER BY clause. 
eaf0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
eb00: 6c 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75  locates and retu
eb10: 72 6e 73 20 61 20 4b 65 79 49 6e 66 6f 0a 2a 2a  rns a KeyInfo.**
eb20: 20 73 74 72 75 63 74 75 72 65 20 73 75 69 74 61   structure suita
eb30: 62 6c 65 20 66 6f 72 20 69 6d 70 6c 65 6d 65 6e  ble for implemen
eb40: 74 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ting the ORDER B
eb50: 59 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  Y..**.** Space t
eb60: 6f 20 68 6f 6c 64 20 74 68 65 20 4b 65 79 49 6e  o hold the KeyIn
eb70: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
eb80: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
eb90: 6c 6c 6f 63 2e 20 54 68 65 20 63 61 6c 6c 69 6e  lloc. The callin
eba0: 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  g.** function is
ebb0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
ebc0: 20 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 74   ensuring that t
ebd0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
ebe0: 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
ebf0: 72 65 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  reed..*/.static 
ec00: 4b 65 79 49 6e 66 6f 20 2a 6d 75 6c 74 69 53 65  KeyInfo *multiSe
ec10: 6c 65 63 74 4f 72 64 65 72 42 79 4b 65 79 49 6e  lectOrderByKeyIn
ec20: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
ec30: 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  , Select *p, int
ec40: 20 6e 45 78 74 72 61 29 7b 0a 20 20 45 78 70 72   nExtra){.  Expr
ec50: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20 3d  List *pOrderBy =
ec60: 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20   p->pOrderBy;.  
ec70: 69 6e 74 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  int nOrderBy = p
ec80: 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
ec90: 72 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r;.  sqlite3 *db
eca0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
ecb0: 20 4b 65 79 49 6e 66 6f 20 2a 70 52 65 74 20 3d   KeyInfo *pRet =
ecc0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
ecd0: 6c 6c 6f 63 28 64 62 2c 20 6e 4f 72 64 65 72 42  lloc(db, nOrderB
ece0: 79 2b 6e 45 78 74 72 61 2c 20 31 29 3b 0a 20 20  y+nExtra, 1);.  
ecf0: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
ed00: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
ed10: 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
ed20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
ed30: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
ed40: 20 2a 70 49 74 65 6d 20 3d 20 26 70 4f 72 64 65   *pItem = &pOrde
ed50: 72 42 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  rBy->a[i];.     
ed60: 20 45 78 70 72 20 2a 70 54 65 72 6d 20 3d 20 70   Expr *pTerm = p
ed70: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
ed80: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
ed90: 6c 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  l;..      if( pT
eda0: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  erm->flags & EP_
edb0: 43 6f 6c 6c 61 74 65 20 29 7b 0a 20 20 20 20 20  Collate ){.     
edc0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
edd0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
ede0: 61 72 73 65 2c 20 70 54 65 72 6d 29 3b 0a 20 20  arse, pTerm);.  
edf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ee00: 20 20 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69     pColl = multi
ee10: 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50  SelectCollSeq(pP
ee20: 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d 2d 3e  arse, p, pItem->
ee30: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d  u.x.iOrderByCol-
ee40: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
ee50: 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c 6c  pColl==0 ) pColl
ee60: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
ee70: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65 72  ;.        pOrder
ee80: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d  By->a[i].pExpr =
ee90: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
eea0: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
eeb0: 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
eec0: 54 65 72 6d 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  Term, pColl->zNa
eed0: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
eee0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
eef0: 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
ef00: 61 62 6c 65 28 70 52 65 74 29 20 29 3b 0a 20 20  able(pRet) );.  
ef10: 20 20 20 20 70 52 65 74 2d 3e 61 43 6f 6c 6c 5b      pRet->aColl[
ef20: 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
ef30: 20 20 70 52 65 74 2d 3e 61 53 6f 72 74 4f 72 64    pRet->aSortOrd
ef40: 65 72 5b 69 5d 20 3d 20 70 4f 72 64 65 72 42 79  er[i] = pOrderBy
ef50: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
ef60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
ef70: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23  eturn pRet;.}..#
ef80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ef90: 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 54 68 69  IT_CTE./*.** Thi
efa0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
efb0: 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 74 6f  tes VDBE code to
efc0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e   compute the con
efd0: 74 65 6e 74 20 6f 66 20 61 20 57 49 54 48 20 52  tent of a WITH R
efe0: 45 43 55 52 53 49 56 45 0a 2a 2a 20 71 75 65 72  ECURSIVE.** quer
eff0: 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 2a  y of the form:.*
f000: 2a 0a 2a 2a 20 20 20 3c 72 65 63 75 72 73 69 76  *.**   <recursiv
f010: 65 2d 74 61 62 6c 65 3e 20 41 53 20 28 3c 73 65  e-table> AS (<se
f020: 74 75 70 2d 71 75 65 72 79 3e 20 55 4e 49 4f 4e  tup-query> UNION
f030: 20 5b 41 4c 4c 5d 20 3c 72 65 63 75 72 73 69 76   [ALL] <recursiv
f040: 65 2d 71 75 65 72 79 3e 29 0a 2a 2a 20 20 20 20  e-query>).**    
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f060: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
f070: 5f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 5c  _/             \
f080: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f  _______________/
f090: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
f0b0: 3e 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20  >pPrior         
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 0a 2a               p.*
f0d0: 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  *.**.** There is
f0e0: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 72 65 66   exactly one ref
f0f0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 72 65  erence to the re
f100: 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20 69 6e  cursive-table in
f110: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
f120: 0a 2a 2a 20 6f 66 20 72 65 63 75 72 73 69 76 65  .** of recursive
f130: 2d 71 75 65 72 79 2c 20 6d 61 72 6b 65 64 20 77  -query, marked w
f140: 69 74 68 20 74 68 65 20 53 72 63 4c 69 73 74 2d  ith the SrcList-
f150: 3e 61 5b 5d 2e 69 73 52 65 63 75 72 73 69 76 65  >a[].isRecursive
f160: 20 66 6c 61 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   flag..**.** The
f170: 20 73 65 74 75 70 2d 71 75 65 72 79 20 72 75 6e   setup-query run
f180: 73 20 6f 6e 63 65 20 74 6f 20 67 65 6e 65 72 61  s once to genera
f190: 74 65 20 61 6e 20 69 6e 69 74 69 61 6c 20 73 65  te an initial se
f1a0: 74 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 67  t of rows that g
f1b0: 6f 0a 2a 2a 20 69 6e 74 6f 20 61 20 51 75 65 75  o.** into a Queu
f1c0: 65 20 74 61 62 6c 65 2e 20 20 52 6f 77 73 20 61  e table.  Rows a
f1d0: 72 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  re extracted fro
f1e0: 6d 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  m the Queue tabl
f1f0: 65 20 6f 6e 65 20 62 79 0a 2a 2a 20 6f 6e 65 2e  e one by.** one.
f200: 20 20 45 61 63 68 20 72 6f 77 20 65 78 74 72 61    Each row extra
f210: 63 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 20  cted from Queue 
f220: 69 73 20 6f 75 74 70 75 74 20 74 6f 20 70 44 65  is output to pDe
f230: 73 74 2e 20 20 54 68 65 6e 20 74 68 65 20 73 69  st.  Then the si
f240: 6e 67 6c 65 0a 2a 2a 20 65 78 74 72 61 63 74 65  ngle.** extracte
f250: 64 20 72 6f 77 20 28 6e 6f 77 20 69 6e 20 74 68  d row (now in th
f260: 65 20 69 43 75 72 72 65 6e 74 20 74 61 62 6c 65  e iCurrent table
f270: 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  ) becomes the co
f280: 6e 74 65 6e 74 20 6f 66 20 74 68 65 0a 2a 2a 20  ntent of the.** 
f290: 72 65 63 75 72 73 69 76 65 2d 74 61 62 6c 65 20  recursive-table 
f2a0: 66 6f 72 20 61 20 72 65 63 75 72 73 69 76 65 2d  for a recursive-
f2b0: 71 75 65 72 79 20 72 75 6e 2e 20 20 54 68 65 20  query run.  The 
f2c0: 6f 75 74 70 75 74 20 6f 66 20 74 68 65 20 72 65  output of the re
f2d0: 63 75 72 73 69 76 65 2d 71 75 65 72 79 0a 2a 2a  cursive-query.**
f2e0: 20 69 73 20 61 64 64 65 64 20 62 61 63 6b 20 69   is added back i
f2f0: 6e 74 6f 20 74 68 65 20 51 75 65 75 65 20 74 61  nto the Queue ta
f300: 62 6c 65 2e 20 20 54 68 65 6e 20 61 6e 6f 74 68  ble.  Then anoth
f310: 65 72 20 72 6f 77 20 69 73 20 65 78 74 72 61 63  er row is extrac
f320: 74 65 64 20 66 72 6f 6d 20 51 75 65 75 65 0a 2a  ted from Queue.*
f330: 2a 20 61 6e 64 20 74 68 65 20 69 74 65 72 61 74  * and the iterat
f340: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 20 75 6e  ion continues un
f350: 74 69 6c 20 74 68 65 20 51 75 65 75 65 20 74 61  til the Queue ta
f360: 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2a  ble is empty..**
f370: 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 70 6f  .** If the compo
f380: 75 6e 64 20 71 75 65 72 79 20 6f 70 65 72 61 74  und query operat
f390: 6f 72 20 69 73 20 55 4e 49 4f 4e 20 74 68 65 6e  or is UNION then
f3a0: 20 6e 6f 20 64 75 70 6c 69 63 61 74 65 20 72 6f   no duplicate ro
f3b0: 77 73 20 61 72 65 20 65 76 65 72 0a 2a 2a 20 69  ws are ever.** i
f3c0: 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
f3d0: 20 51 75 65 75 65 20 74 61 62 6c 65 2e 20 20 54   Queue table.  T
f3e0: 68 65 20 69 44 69 73 74 69 6e 63 74 20 74 61 62  he iDistinct tab
f3f0: 6c 65 20 6b 65 65 70 73 20 61 20 63 6f 70 79 20  le keeps a copy 
f400: 6f 66 20 61 6c 6c 20 72 6f 77 73 0a 2a 2a 20 74  of all rows.** t
f410: 68 61 74 20 68 61 76 65 20 65 76 65 72 20 62 65  hat have ever be
f420: 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
f430: 20 51 75 65 75 65 20 61 6e 64 20 63 61 75 73 65   Queue and cause
f440: 73 20 64 75 70 6c 69 63 61 74 65 73 20 74 6f 20  s duplicates to 
f450: 62 65 0a 2a 2a 20 64 69 73 63 61 72 64 65 64 2e  be.** discarded.
f460: 20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 6f    If the operato
f470: 72 20 69 73 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20  r is UNION ALL, 
f480: 74 68 65 6e 20 64 75 70 6c 69 63 61 74 65 73 20  then duplicates 
f490: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 20  are allowed..** 
f4a0: 0a 2a 2a 20 49 66 20 74 68 65 20 71 75 65 72 79  .** If the query
f4b0: 20 68 61 73 20 61 6e 20 4f 52 44 45 52 20 42 59   has an ORDER BY
f4c0: 2c 20 74 68 65 6e 20 65 6e 74 72 69 65 73 20 69  , then entries i
f4d0: 6e 20 74 68 65 20 51 75 65 75 65 20 74 61 62 6c  n the Queue tabl
f4e0: 65 20 61 72 65 20 6b 65 70 74 20 69 6e 0a 2a 2a  e are kept in.**
f4f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 20   ORDER BY order 
f500: 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 65 6e  and the first en
f510: 74 72 79 20 69 73 20 65 78 74 72 61 63 74 65 64  try is extracted
f520: 20 66 6f 72 20 65 61 63 68 20 63 79 63 6c 65 2e   for each cycle.
f530: 20 20 57 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 20    Without.** an 
f540: 4f 52 44 45 52 20 42 59 2c 20 74 68 65 20 51 75  ORDER BY, the Qu
f550: 65 75 65 20 74 61 62 6c 65 20 69 73 20 6a 75 73  eue table is jus
f560: 74 20 61 20 46 49 46 4f 2e 0a 2a 2a 0a 2a 2a 20  t a FIFO..**.** 
f570: 49 66 20 61 20 4c 49 4d 49 54 20 63 6c 61 75 73  If a LIMIT claus
f580: 65 20 69 73 20 70 72 6f 76 69 64 65 64 2c 20 74  e is provided, t
f590: 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 69 6f  hen the iteratio
f5a0: 6e 20 73 74 6f 70 73 20 61 66 74 65 72 20 4c 49  n stops after LI
f5b0: 4d 49 54 20 72 6f 77 73 0a 2a 2a 20 68 61 76 65  MIT rows.** have
f5c0: 20 62 65 65 6e 20 6f 75 74 70 75 74 20 74 6f 20   been output to 
f5d0: 70 44 65 73 74 2e 20 20 41 20 4c 49 4d 49 54 20  pDest.  A LIMIT 
f5e0: 6f 66 20 7a 65 72 6f 20 6d 65 61 6e 73 20 74 6f  of zero means to
f5f0: 20 6f 75 74 70 75 74 20 6e 6f 20 72 6f 77 73 20   output no rows 
f600: 61 6e 64 20 61 0a 2a 2a 20 6e 65 67 61 74 69 76  and a.** negativ
f610: 65 20 4c 49 4d 49 54 20 6d 65 61 6e 73 20 74 6f  e LIMIT means to
f620: 20 6f 75 74 70 75 74 20 61 6c 6c 20 72 6f 77 73   output all rows
f630: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 61  .  If there is a
f640: 6c 73 6f 20 61 6e 20 4f 46 46 53 45 54 20 63 6c  lso an OFFSET cl
f650: 61 75 73 65 0a 2a 2a 20 77 69 74 68 20 61 20 70  ause.** with a p
f660: 6f 73 69 74 69 76 65 20 76 61 6c 75 65 2c 20 74  ositive value, t
f670: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 4f 46  hen the first OF
f680: 46 53 45 54 20 6f 75 74 70 75 74 73 20 61 72 65  FSET outputs are
f690: 20 64 69 73 63 61 72 64 65 64 20 72 61 74 68 65   discarded rathe
f6a0: 72 0a 2a 2a 20 74 68 61 6e 20 62 65 69 6e 67 20  r.** than being 
f6b0: 73 65 6e 74 20 74 6f 20 70 44 65 73 74 2e 20 20  sent to pDest.  
f6c0: 54 68 65 20 4c 49 4d 49 54 20 63 6f 75 6e 74 20  The LIMIT count 
f6d0: 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 75  does not begin u
f6e0: 6e 74 69 6c 20 61 66 74 65 72 20 4f 46 46 53 45  ntil after OFFSE
f6f0: 54 0a 2a 2a 20 72 6f 77 73 20 68 61 76 65 20 62  T.** rows have b
f700: 65 65 6e 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a  een skipped..*/.
f710: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 6e 65  static void gene
f720: 72 61 74 65 57 69 74 68 52 65 63 75 72 73 69 76  rateWithRecursiv
f730: 65 51 75 65 72 79 28 0a 20 20 50 61 72 73 65 20  eQuery(.  Parse 
f740: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
f750: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
f760: 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
f770: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
f780: 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 53   The recursive S
f790: 45 4c 45 43 54 20 74 6f 20 62 65 20 63 6f 64 65  ELECT to be code
f7a0: 64 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  d */.  SelectDes
f7b0: 74 20 2a 70 44 65 73 74 20 20 20 20 20 2f 2a 20  t *pDest     /* 
f7c0: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
f7d0: 71 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f  query results */
f7e0: 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  .){.  SrcList *p
f7f0: 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 20 20  Src = p->pSrc;  
f800: 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
f810: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 72 65  clause of the re
f820: 63 75 72 73 69 76 65 20 71 75 65 72 79 20 2a 2f  cursive query */
f830: 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d  .  int nCol = p-
f840: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
f850: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
f860: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 63  lumns in the rec
f870: 75 72 73 69 76 65 20 74 61 62 6c 65 20 2a 2f 0a  ursive table */.
f880: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
f890: 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
f8a0: 2f 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  /* The prepared 
f8b0: 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72 20  statement under 
f8c0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
f8d0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 74 75 70    Select *pSetup
f8e0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 20 20 20   = p->pPrior;   
f8f0: 2f 2a 20 54 68 65 20 73 65 74 75 70 20 71 75 65  /* The setup que
f900: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ry */.  int addr
f910: 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Top;            
f920: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
f930: 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  the loop */.  in
f940: 74 20 61 64 64 72 43 6f 6e 74 2c 20 61 64 64 72  t addrCont, addr
f950: 42 72 65 61 6b 3b 20 20 20 20 20 20 2f 2a 20 43  Break;      /* C
f960: 4f 4e 54 49 4e 55 45 20 61 6e 64 20 42 52 45 41  ONTINUE and BREA
f970: 4b 20 61 64 64 72 65 73 73 65 73 20 2a 2f 0a 20  K addresses */. 
f980: 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
f990: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
f9a0: 2a 20 54 68 65 20 43 75 72 72 65 6e 74 20 74 61  * The Current ta
f9b0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ble */.  int reg
f9c0: 43 75 72 72 65 6e 74 3b 20 20 20 20 20 20 20 20  Current;        
f9d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
f9e0: 65 72 20 68 6f 6c 64 69 6e 67 20 43 75 72 72 65  er holding Curre
f9f0: 6e 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nt table */.  in
fa00: 74 20 69 51 75 65 75 65 3b 20 20 20 20 20 20 20  t iQueue;       
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fa20: 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
fa30: 2f 0a 20 20 69 6e 74 20 69 44 69 73 74 69 6e 63  /.  int iDistinc
fa40: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
fa50: 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 75    /* To ensure u
fa60: 6e 69 71 75 65 20 72 65 73 75 6c 74 73 20 69 66  nique results if
fa70: 20 55 4e 49 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20   UNION */.  int 
fa80: 65 44 65 73 74 20 3d 20 53 52 54 5f 54 61 62 6c  eDest = SRT_Tabl
fa90: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77  e;        /* How
faa0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 51 75 65   to write to Que
fab0: 75 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ue */.  SelectDe
fac0: 73 74 20 64 65 73 74 51 75 65 75 65 3b 20 20 20  st destQueue;   
fad0: 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 44        /* SelectD
fae0: 65 73 74 20 74 61 72 67 65 74 74 69 6e 67 20 74  est targetting t
faf0: 68 65 20 51 75 65 75 65 20 74 61 62 6c 65 20 2a  he Queue table *
fb00: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb20: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
fb30: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  r */.  int rc;  
fb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb50: 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
fb60: 6f 64 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ode */.  ExprLis
fb70: 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 20  t *pOrderBy;    
fb80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52         /* The OR
fb90: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
fba0: 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 2c  .  Expr *pLimit,
fbb0: 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 20 20 20   *pOffset;      
fbc0: 20 2f 2a 20 53 61 76 65 64 20 4c 49 4d 49 54 20   /* Saved LIMIT 
fbd0: 61 6e 64 20 4f 46 46 53 45 54 20 2a 2f 0a 20 20  and OFFSET */.  
fbe0: 69 6e 74 20 72 65 67 4c 69 6d 69 74 2c 20 72 65  int regLimit, re
fbf0: 67 4f 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a  gOffset;      /*
fc00: 20 52 65 67 69 73 74 65 72 73 20 75 73 65 64 20   Registers used 
fc10: 62 79 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  by LIMIT and OFF
fc20: 53 45 54 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74  SET */..  /* Obt
fc30: 61 69 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f  ain authorizatio
fc40: 6e 20 74 6f 20 64 6f 20 61 20 72 65 63 75 72 73  n to do a recurs
fc50: 69 76 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  ive query */.  i
fc60: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
fc70: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
fc80: 54 45 5f 52 45 43 55 52 53 49 56 45 2c 20 30 2c  TE_RECURSIVE, 0,
fc90: 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b   0, 0) ) return;
fca0: 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74  ..  /* Process t
fcb0: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46  he LIMIT and OFF
fcc0: 53 45 54 20 63 6c 61 75 73 65 73 2c 20 69 66 20  SET clauses, if 
fcd0: 74 68 65 79 20 65 78 69 73 74 20 2a 2f 0a 20 20  they exist */.  
fce0: 61 64 64 72 42 72 65 61 6b 20 3d 20 73 71 6c 69  addrBreak = sqli
fcf0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
fd00: 28 76 29 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  (v);.  computeLi
fd10: 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
fd20: 72 73 65 2c 20 70 2c 20 61 64 64 72 42 72 65 61  rse, p, addrBrea
fd30: 6b 29 3b 0a 20 20 70 4c 69 6d 69 74 20 3d 20 70  k);.  pLimit = p
fd40: 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 70 4f 66 66  ->pLimit;.  pOff
fd50: 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
fd60: 3b 0a 20 20 72 65 67 4c 69 6d 69 74 20 3d 20 70  ;.  regLimit = p
fd70: 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 72 65 67 4f  ->iLimit;.  regO
fd80: 66 66 73 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73  ffset = p->iOffs
fd90: 65 74 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20  et;.  p->pLimit 
fda0: 3d 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30  = p->pOffset = 0
fdb0: 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20  ;.  p->iLimit = 
fdc0: 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a  p->iOffset = 0;.
fdd0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e    pOrderBy = p->
fde0: 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  pOrderBy;..  /* 
fdf0: 4c 6f 63 61 74 65 20 74 68 65 20 63 75 72 73 6f  Locate the curso
fe00: 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  r number of the 
fe10: 43 75 72 72 65 6e 74 20 74 61 62 6c 65 20 2a 2f  Current table */
fe20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 41 4c 57 41  .  for(i=0; ALWA
fe30: 59 53 28 69 3c 70 53 72 63 2d 3e 6e 53 72 63 29  YS(i<pSrc->nSrc)
fe40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
fe50: 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 73 52 65 63  pSrc->a[i].isRec
fe60: 75 72 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  ursive ){.      
fe70: 69 43 75 72 72 65 6e 74 20 3d 20 70 53 72 63 2d  iCurrent = pSrc-
fe80: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3b 0a 20  >a[i].iCursor;. 
fe90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fea0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
feb0: 63 61 74 65 20 63 75 72 73 6f 72 73 20 6e 75 6d  cate cursors num
fec0: 62 65 72 73 20 66 6f 72 20 51 75 65 75 65 20 61  bers for Queue a
fed0: 6e 64 20 44 69 73 74 69 6e 63 74 2e 20 20 54 68  nd Distinct.  Th
fee0: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
fef0: 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 44 69 73  for.  ** the Dis
ff00: 74 69 6e 63 74 20 74 61 62 6c 65 20 6d 75 73 74  tinct table must
ff10: 20 62 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   be exactly one 
ff20: 67 72 65 61 74 65 72 20 74 68 61 6e 20 51 75 65  greater than Que
ff30: 75 65 20 69 6e 20 6f 72 64 65 72 0a 20 20 2a 2a  ue in order.  **
ff40: 20 66 6f 72 20 74 68 65 20 53 52 54 5f 44 69 73   for the SRT_Dis
ff50: 74 54 61 62 6c 65 20 61 6e 64 20 53 52 54 5f 44  tTable and SRT_D
ff60: 69 73 74 51 75 65 75 65 20 64 65 73 74 69 6e 61  istQueue destina
ff70: 74 69 6f 6e 73 20 74 6f 20 77 6f 72 6b 2e 20 2a  tions to work. *
ff80: 2f 0a 20 20 69 51 75 65 75 65 20 3d 20 70 50 61  /.  iQueue = pPa
ff90: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 69  rse->nTab++;.  i
ffa0: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49  f( p->op==TK_UNI
ffb0: 4f 4e 20 29 7b 0a 20 20 20 20 65 44 65 73 74 20  ON ){.    eDest 
ffc0: 3d 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54  = pOrderBy ? SRT
ffd0: 5f 44 69 73 74 51 75 65 75 65 20 3a 20 53 52 54  _DistQueue : SRT
ffe0: 5f 44 69 73 74 54 61 62 6c 65 3b 0a 20 20 20 20  _DistTable;.    
fff0: 69 44 69 73 74 69 6e 63 74 20 3d 20 70 50 61 72  iDistinct = pPar
10000 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65  se->nTab++;.  }e
10010 6c 73 65 7b 0a 20 20 20 20 65 44 65 73 74 20 3d  lse{.    eDest =
10020 20 70 4f 72 64 65 72 42 79 20 3f 20 53 52 54 5f   pOrderBy ? SRT_
10030 51 75 65 75 65 20 3a 20 53 52 54 5f 54 61 62 6c  Queue : SRT_Tabl
10040 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
10050 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
10060 64 65 73 74 51 75 65 75 65 2c 20 65 44 65 73 74  destQueue, eDest
10070 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f 2a  , iQueue);..  /*
10080 20 41 6c 6c 6f 63 61 74 65 20 63 75 72 73 6f 72   Allocate cursor
10090 73 20 66 6f 72 20 43 75 72 72 65 6e 74 2c 20 51  s for Current, Q
100a0 75 65 75 65 2c 20 61 6e 64 20 44 69 73 74 69 6e  ueue, and Distin
100b0 63 74 2e 20 2a 2f 0a 20 20 72 65 67 43 75 72 72  ct. */.  regCurr
100c0 65 6e 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ent = ++pParse->
100d0 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 56  nMem;.  sqlite3V
100e0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
100f0 4f 70 65 6e 50 73 65 75 64 6f 2c 20 69 43 75 72  OpenPseudo, iCur
10100 72 65 6e 74 2c 20 72 65 67 43 75 72 72 65 6e 74  rent, regCurrent
10110 2c 20 6e 43 6f 6c 29 3b 0a 20 20 69 66 28 20 70  , nCol);.  if( p
10120 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 4b  OrderBy ){.    K
10130 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
10140 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72   = multiSelectOr
10150 64 65 72 42 79 4b 65 79 49 6e 66 6f 28 70 50 61  derByKeyInfo(pPa
10160 72 73 65 2c 20 70 2c 20 31 29 3b 0a 20 20 20 20  rse, p, 1);.    
10170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10180 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65  4(v, OP_OpenEphe
10190 6d 65 72 61 6c 2c 20 69 51 75 65 75 65 2c 20 70  meral, iQueue, p
101a0 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b 32  OrderBy->nExpr+2
101b0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
101c0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
101d0 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
101e0 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 64 65 73  EYINFO);.    des
101f0 74 51 75 65 75 65 2e 70 4f 72 64 65 72 42 79 20  tQueue.pOrderBy 
10200 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 7d 65  = pOrderBy;.  }e
10210 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
10220 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10230 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20  _OpenEphemeral, 
10240 69 51 75 65 75 65 2c 20 6e 43 6f 6c 29 3b 0a 20  iQueue, nCol);. 
10250 20 7d 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74   }.  VdbeComment
10260 28 28 76 2c 20 22 51 75 65 75 65 20 74 61 62 6c  ((v, "Queue tabl
10270 65 22 29 29 3b 0a 20 20 69 66 28 20 69 44 69 73  e"));.  if( iDis
10280 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 70 2d 3e  tinct ){.    p->
10290 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20  addrOpenEphm[0] 
102a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
102b0 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70  Op2(v, OP_OpenEp
102c0 68 65 6d 65 72 61 6c 2c 20 69 44 69 73 74 69 6e  hemeral, iDistin
102d0 63 74 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 73  ct, 0);.    p->s
102e0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73  elFlags |= SF_Us
102f0 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 7d  esEphemeral;.  }
10300 0a 0a 20 20 2f 2a 20 44 65 74 61 63 68 20 74 68  ..  /* Detach th
10310 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
10320 65 20 66 72 6f 6d 20 74 68 65 20 63 6f 6d 70 6f  e from the compo
10330 75 6e 64 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  und SELECT */.  
10340 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
10350 0a 0a 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65  ..  /* Store the
10360 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20   results of the 
10370 73 65 74 75 70 2d 71 75 65 72 79 20 69 6e 20 51  setup-query in Q
10380 75 65 75 65 2e 20 2a 2f 0a 20 20 70 53 65 74 75  ueue. */.  pSetu
10390 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  p->pNext = 0;.  
103a0 72 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  rc = sqlite3Sele
103b0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 74 75  ct(pParse, pSetu
103c0 70 2c 20 26 64 65 73 74 51 75 65 75 65 29 3b 0a  p, &destQueue);.
103d0 20 20 70 53 65 74 75 70 2d 3e 70 4e 65 78 74 20    pSetup->pNext 
103e0 3d 20 70 3b 0a 20 20 69 66 28 20 72 63 20 29 20  = p;.  if( rc ) 
103f0 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 72 65 63 75  goto end_of_recu
10400 72 73 69 76 65 5f 71 75 65 72 79 3b 0a 0a 20 20  rsive_query;..  
10410 2f 2a 20 46 69 6e 64 20 74 68 65 20 6e 65 78 74  /* Find the next
10420 20 72 6f 77 20 69 6e 20 74 68 65 20 51 75 65 75   row in the Queu
10430 65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61  e and output tha
10440 74 20 72 6f 77 20 2a 2f 0a 20 20 61 64 64 72 54  t row */.  addrT
10450 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
10460 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
10470 69 6e 64 2c 20 69 51 75 65 75 65 2c 20 61 64 64  ind, iQueue, add
10480 72 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f 76  rBreak); VdbeCov
10490 65 72 61 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20  erage(v);..  /* 
104a0 54 72 61 6e 73 66 65 72 20 74 68 65 20 6e 65 78  Transfer the nex
104b0 74 20 72 6f 77 20 69 6e 20 51 75 65 75 65 20 6f  t row in Queue o
104c0 76 65 72 20 74 6f 20 43 75 72 72 65 6e 74 20 2a  ver to Current *
104d0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
104e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
104f0 52 6f 77 2c 20 69 43 75 72 72 65 6e 74 29 3b 20  Row, iCurrent); 
10500 2f 2a 20 54 6f 20 72 65 73 65 74 20 63 6f 6c 75  /* To reset colu
10510 6d 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 66  mn cache */.  if
10520 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
10530 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10540 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
10550 2c 20 69 51 75 65 75 65 2c 20 70 4f 72 64 65 72  , iQueue, pOrder
10560 42 79 2d 3e 6e 45 78 70 72 2b 31 2c 20 72 65 67  By->nExpr+1, reg
10570 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d 65 6c 73  Current);.  }els
10580 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
10590 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52  beAddOp2(v, OP_R
105a0 6f 77 44 61 74 61 2c 20 69 51 75 65 75 65 2c 20  owData, iQueue, 
105b0 72 65 67 43 75 72 72 65 6e 74 29 3b 0a 20 20 7d  regCurrent);.  }
105c0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
105d0 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c 65 74  dOp1(v, OP_Delet
105e0 65 2c 20 69 51 75 65 75 65 29 3b 0a 0a 20 20 2f  e, iQueue);..  /
105f0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 73 69 6e  * Output the sin
10600 67 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65  gle row in Curre
10610 6e 74 20 2a 2f 0a 20 20 61 64 64 72 43 6f 6e 74  nt */.  addrCont
10620 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
10630 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 63 6f  keLabel(v);.  co
10640 64 65 4f 66 66 73 65 74 28 76 2c 20 72 65 67 4f  deOffset(v, regO
10650 66 66 73 65 74 2c 20 61 64 64 72 43 6f 6e 74 29  ffset, addrCont)
10660 3b 0a 20 20 73 65 6c 65 63 74 49 6e 6e 65 72 4c  ;.  selectInnerL
10670 6f 6f 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  oop(pParse, p, p
10680 2d 3e 70 45 4c 69 73 74 2c 20 69 43 75 72 72 65  ->pEList, iCurre
10690 6e 74 2c 0a 20 20 20 20 20 20 30 2c 20 30 2c 20  nt,.      0, 0, 
106a0 70 44 65 73 74 2c 20 61 64 64 72 43 6f 6e 74 2c  pDest, addrCont,
106b0 20 61 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 69   addrBreak);.  i
106c0 66 28 20 72 65 67 4c 69 6d 69 74 20 29 7b 0a 20  f( regLimit ){. 
106d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
106e0 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66 5a 65 72  dOp3(v, OP_IfZer
106f0 6f 2c 20 72 65 67 4c 69 6d 69 74 2c 20 61 64 64  o, regLimit, add
10700 72 42 72 65 61 6b 2c 20 2d 31 29 3b 0a 20 20 20  rBreak, -1);.   
10710 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
10720 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
10730 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
10740 76 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 0a 20  v, addrCont);.. 
10750 20 2f 2a 20 45 78 65 63 75 74 65 20 74 68 65 20   /* Execute the 
10760 72 65 63 75 72 73 69 76 65 20 53 45 4c 45 43 54  recursive SELECT
10770 20 74 61 6b 69 6e 67 20 74 68 65 20 73 69 6e 67   taking the sing
10780 6c 65 20 72 6f 77 20 69 6e 20 43 75 72 72 65 6e  le row in Curren
10790 74 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 76 61  t as.  ** the va
107a0 6c 75 65 20 66 6f 72 20 74 68 65 20 72 65 63 75  lue for the recu
107b0 72 73 69 76 65 2d 74 61 62 6c 65 2e 20 53 74 6f  rsive-table. Sto
107c0 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  re the results i
107d0 6e 20 74 68 65 20 51 75 65 75 65 2e 0a 20 20 2a  n the Queue..  *
107e0 2f 0a 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20  /.  p->pPrior = 
107f0 30 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  0;.  sqlite3Sele
10800 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ct(pParse, p, &d
10810 65 73 74 51 75 65 75 65 29 3b 0a 20 20 61 73 73  estQueue);.  ass
10820 65 72 74 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d  ert( p->pPrior==
10830 30 20 29 3b 0a 20 20 70 2d 3e 70 50 72 69 6f 72  0 );.  p->pPrior
10840 20 3d 20 70 53 65 74 75 70 3b 0a 0a 20 20 2f 2a   = pSetup;..  /*
10850 20 4b 65 65 70 20 72 75 6e 6e 69 6e 67 20 74 68   Keep running th
10860 65 20 6c 6f 6f 70 20 75 6e 74 69 6c 20 74 68 65  e loop until the
10870 20 51 75 65 75 65 20 69 73 20 65 6d 70 74 79 20   Queue is empty 
10880 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
10890 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
108a0 6f 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  o, 0, addrTop);.
108b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
108c0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
108d0 72 42 72 65 61 6b 29 3b 0a 0a 65 6e 64 5f 6f 66  rBreak);..end_of
108e0 5f 72 65 63 75 72 73 69 76 65 5f 71 75 65 72 79  _recursive_query
108f0 3a 0a 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  :.  p->pOrderBy 
10900 3d 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 2d  = pOrderBy;.  p-
10910 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
10920 3b 0a 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d  ;.  p->pOffset =
10930 20 70 4f 66 66 73 65 74 3b 0a 20 20 72 65 74 75   pOffset;.  retu
10940 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
10950 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 20  SQLITE_OMIT_CTE 
10960 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
10970 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 73 74 61  eferences */.sta
10980 74 69 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c  tic int multiSel
10990 65 63 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61  ectOrderBy(.  Pa
109a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
109b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
109c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
109d0 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
109e0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d    /* The right-m
109f0 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74  ost of SELECTs t
10a00 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
10a10 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73  SelectDest *pDes
10a20 74 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f  t     /* What to
10a30 20 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72   do with query r
10a40 65 73 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 2f  esults */.);.../
10a50 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
10a60 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70  e is called to p
10a70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f 75 6e  rocess a compoun
10a80 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66 72 6f  d query form fro
10a90 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f 72 65  m.** two or more
10aa0 20 73 65 70 61 72 61 74 65 20 71 75 65 72 69 65   separate querie
10ab0 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c 20 55  s using UNION, U
10ac0 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45 50 54  NION ALL, EXCEPT
10ad0 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53 45 43  , or.** INTERSEC
10ae0 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f 69 6e  T.**.** "p" poin
10af0 74 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ts to the right-
10b00 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77 6f 20  most of the two 
10b10 71 75 65 72 69 65 73 2e 20 20 74 68 65 20 71 75  queries.  the qu
10b20 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65  ery on the.** le
10b30 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f 72 2e  ft is p->pPrior.
10b40 20 20 54 68 65 20 6c 65 66 74 20 71 75 65 72 79    The left query
10b50 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65 20 61   could also be a
10b60 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 0a   compound query.
10b70 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61 73 65  ** in which case
10b80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
10b90 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72 65 63  ll be called rec
10ba0 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a 2a 2a  ursively. .**.**
10bb0 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
10bc0 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72 79 20  the total query 
10bd0 61 72 65 20 74 6f 20 62 65 20 77 72 69 74 74 65  are to be writte
10be0 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69 6e 61  n into a destina
10bf0 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70 65 20  tion.** of type 
10c00 65 44 65 73 74 20 77 69 74 68 20 70 61 72 61 6d  eDest with param
10c10 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a 0a 2a  eter iParm..**.*
10c20 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20 43 6f  * Example 1:  Co
10c30 6e 73 69 64 65 72 20 61 20 74 68 72 65 65 2d 77  nsider a three-w
10c40 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51 4c 20  ay compound SQL 
10c50 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
10c60 20 20 20 20 20 53 45 4c 45 43 54 20 61 20 46 52       SELECT a FR
10c70 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45 4c 45  OM t1 UNION SELE
10c80 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55 4e 49  CT b FROM t2 UNI
10c90 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52 4f 4d  ON SELECT c FROM
10ca0 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73   t3.**.** This s
10cb0 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
10cc0 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f 77 73  ed up as follows
10cd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
10ce0 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a 2a 20  CT c FROM t3.** 
10cf0 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 60       |.**      `
10d00 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20 62  ----->  SELECT b
10d10 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20 20 20   FROM t2.**     
10d20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20             |.** 
10d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 60                 `
10d40 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54 20  ------>  SELECT 
10d50 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a 2a 20  a FROM t1.**.** 
10d60 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20 74 68  The arrows in th
10d70 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76 65 20  e diagram above 
10d80 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 53 65  represent the Se
10d90 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f 69 6e  lect.pPrior poin
10da0 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20 74 68  ter..** So if th
10db0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10dc0 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71 75 61  lled with p equa
10dd0 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75 65 72  l to the t3 quer
10de0 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72 69 6f  y, then.** pPrio
10df0 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20 74 32  r will be the t2
10e00 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70 20 77   query.  p->op w
10e10 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f 4e 20  ill be TK_UNION 
10e20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
10e30 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61 74 20  .** Notice that 
10e40 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77  because of the w
10e50 61 79 20 53 51 4c 69 74 65 20 70 61 72 73 65 73  ay SQLite parses
10e60 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
10e70 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  s, the.** indivi
10e80 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61 6c 77  dual selects alw
10e90 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d 20 6c  ays group from l
10ea0 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a 2a 2f  eft to right..*/
10eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75 6c 74  .static int mult
10ec0 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72 73 65  iSelect(.  Parse
10ed0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10ee0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
10ef0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
10f00 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
10f10 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
10f20 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
10f30 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
10f40 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
10f50 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
10f60 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
10f70 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
10f80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
10f90 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63 6f 64    /* Success cod
10fa0 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f 75 74  e from a subrout
10fb0 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ine */.  Select 
10fc0 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f  *pPrior;       /
10fd0 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54  * Another SELECT
10fe0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
10ff0 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64  our left */.  Vd
11000 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
11010 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
11020 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42  code to this VDB
11030 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73  E */.  SelectDes
11040 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f 2a 20  t dest;      /* 
11050 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61 74 61  Alternative data
11060 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a   destination */.
11070 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c 65 74    Select *pDelet
11080 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61 69 6e  e = 0;  /* Chain
11090 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c 65 63   of simple selec
110a0 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ts to delete */.
110b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
110c0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
110d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
110e0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
110f0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
11100 69 6e 74 20 69 53 75 62 31 20 3d 20 30 3b 20 20  int iSub1 = 0;  
11110 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20        /* EQP id 
11120 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71 75 65  of left-hand que
11130 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62  ry */.  int iSub
11140 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a  2 = 0;        /*
11150 20 45 51 50 20 69 64 20 6f 66 20 72 69 67 68 74   EQP id of right
11160 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 23  -hand query */.#
11170 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
11180 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e   sure there is n
11190 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49  o ORDER BY or LI
111a0 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20 70 72  MIT clause on pr
111b0 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20 4f 6e  ior SELECTs.  On
111c0 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  ly.  ** the last
111d0 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20 53 45   (right-most) SE
111e0 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65 72 69  LECT in the seri
111f0 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e 20 4f  es may have an O
11200 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d 49 54  RDER BY or LIMIT
11210 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
11220 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f 72 20   p && p->pPrior 
11230 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 66  );  /* Calling f
11240 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e 74 65  unction guarante
11250 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a 2f 0a  es this much */.
11260 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
11270 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75  lFlags & SF_Recu
11280 72 73 69 76 65 29 3d 3d 30 20 7c 7c 20 70 2d 3e  rsive)==0 || p->
11290 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 70 2d  op==TK_ALL || p-
112a0 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
112b0 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
112c0 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 70  db;.  pPrior = p
112d0 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64 65 73 74  ->pPrior;.  dest
112e0 20 3d 20 2a 70 44 65 73 74 3b 0a 20 20 69 66 28   = *pDest;.  if(
112f0 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
11300 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
11310 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11320 22 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65  "ORDER BY clause
11330 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61 66 74   should come aft
11340 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f 72 65  er %s not before
11350 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63 74 4f  ",.      selectO
11360 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20  pName(p->op));. 
11370 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 67     rc = 1;.    g
11380 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74  oto multi_select
11390 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
113a0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 29  pPrior->pLimit )
113b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
113c0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 4c 49  orMsg(pParse,"LI
113d0 4d 49 54 20 63 6c 61 75 73 65 20 73 68 6f 75 6c  MIT clause shoul
113e0 64 20 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20  d come after %s 
113f0 6e 6f 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20  not before",.   
11400 20 20 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28     selectOpName(
11410 70 2d 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20  p->op));.    rc 
11420 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75  = 1;.    goto mu
11430 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
11440 20 20 7d 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74    }..  v = sqlit
11450 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
11460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  );.  assert( v!=
11470 30 20 29 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  0 );  /* The VDB
11480 45 20 61 6c 72 65 61 64 79 20 63 72 65 61 74 65  E already create
11490 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 66 75 6e  d by calling fun
114a0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ction */..  /* C
114b0 72 65 61 74 65 20 74 68 65 20 64 65 73 74 69 6e  reate the destin
114c0 61 74 69 6f 6e 20 74 65 6d 70 6f 72 61 72 79 20  ation temporary 
114d0 74 61 62 6c 65 20 69 66 20 6e 65 63 65 73 73 61  table if necessa
114e0 72 79 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65  ry.  */.  if( de
114f0 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 45 70  st.eDest==SRT_Ep
11500 68 65 6d 54 61 62 20 29 7b 0a 20 20 20 20 61 73  hemTab ){.    as
11510 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20  sert( p->pEList 
11520 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
11530 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
11540 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 64 65  penEphemeral, de
11550 73 74 2e 69 53 44 50 61 72 6d 2c 20 70 2d 3e 70  st.iSDParm, p->p
11560 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
11570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
11580 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f  angeP5(v, BTREE_
11590 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20  UNORDERED);.    
115a0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
115b0 5f 54 61 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f  _Table;.  }..  /
115c0 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
115d0 53 45 4c 45 43 54 73 20 69 6e 20 74 68 65 20 73  SELECTs in the s
115e0 74 61 74 65 6d 65 6e 74 20 68 61 76 65 20 74 68  tatement have th
115f0 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66  e same number of
11600 20 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 69   elements.  ** i
11610 6e 20 74 68 65 69 72 20 72 65 73 75 6c 74 20 73  n their result s
11620 65 74 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ets..  */.  asse
11630 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 26 26  rt( p->pEList &&
11640 20 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73 74 20   pPrior->pEList 
11650 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69  );.  if( p->pELi
11660 73 74 2d 3e 6e 45 78 70 72 21 3d 70 50 72 69 6f  st->nExpr!=pPrio
11670 72 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  r->pEList->nExpr
11680 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   ){.    if( p->s
11690 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 56 61 6c  elFlags & SF_Val
116a0 75 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ues ){.      sql
116b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
116c0 72 73 65 2c 20 22 61 6c 6c 20 56 41 4c 55 45 53  rse, "all VALUES
116d0 20 6d 75 73 74 20 68 61 76 65 20 74 68 65 20 73   must have the s
116e0 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  ame number of te
116f0 72 6d 73 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  rms");.    }else
11700 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
11710 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11720 22 53 45 4c 45 43 54 73 20 74 6f 20 74 68 65 20  "SELECTs to the 
11730 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 6f  left and right o
11740 66 20 25 73 22 0a 20 20 20 20 20 20 20 20 22 20  f %s".        " 
11750 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20  do not have the 
11760 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 72  same number of r
11770 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 22 2c 20  esult columns", 
11780 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d 3e  selectOpName(p->
11790 6f 70 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op));.    }.    
117a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  rc = 1;.    goto
117b0 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e   multi_select_en
117c0 64 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  d;.  }..#ifndef 
117d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
117e0 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
117f0 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76 65  s & SF_Recursive
11800 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61 74 65   ){.    generate
11810 57 69 74 68 52 65 63 75 72 73 69 76 65 51 75 65  WithRecursiveQue
11820 72 79 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64  ry(pParse, p, &d
11830 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  est);.  }else.#e
11840 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 6f 6d 70 6f  ndif..  /* Compo
11850 75 6e 64 20 53 45 4c 45 43 54 73 20 74 68 61 74  und SELECTs that
11860 20 68 61 76 65 20 61 6e 20 4f 52 44 45 52 20 42   have an ORDER B
11870 59 20 63 6c 61 75 73 65 20 61 72 65 20 68 61 6e  Y clause are han
11880 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e  dled separately.
11890 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
118a0 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 72  OrderBy ){.    r
118b0 65 74 75 72 6e 20 6d 75 6c 74 69 53 65 6c 65 63  eturn multiSelec
118c0 74 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  tOrderBy(pParse,
118d0 20 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 65   p, pDest);.  }e
118e0 6c 73 65 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  lse..  /* Genera
118f0 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
11900 6c 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 53  left and right S
11910 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
11920 2e 0a 20 20 2a 2f 0a 20 20 73 77 69 74 63 68 28  ..  */.  switch(
11930 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
11940 73 65 20 54 4b 5f 41 4c 4c 3a 20 7b 0a 20 20 20  se TK_ALL: {.   
11950 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 30 3b     int addr = 0;
11960 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6d 69  .      int nLimi
11970 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
11980 20 21 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74   !pPrior->pLimit
11990 20 29 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72   );.      pPrior
119a0 2d 3e 69 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c  ->iLimit = p->iL
119b0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 50 72 69  imit;.      pPri
119c0 6f 72 2d 3e 69 4f 66 66 73 65 74 20 3d 20 70 2d  or->iOffset = p-
119d0 3e 69 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  >iOffset;.      
119e0 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
119f0 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
11a00 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
11a10 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
11a20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
11a30 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
11a40 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
11a50 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
11a60 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
11a70 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
11a80 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  &dest);.      p-
11a90 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
11aa0 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
11ab0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  0;.      if( rc 
11ac0 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
11ad0 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
11ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11af0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
11b00 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
11b10 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
11b20 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
11b30 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
11b40 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  set;.      if( p
11b50 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
11b60 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
11b70 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
11b80 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
11b90 69 6d 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  imit); VdbeCover
11ba0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
11bb0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
11bc0 22 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c  "Jump ahead if L
11bd0 49 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b  IMIT reached"));
11be0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
11bf0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
11c00 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e  (iSub2, pParse->
11c10 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
11c20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11c30 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
11c40 20 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20   p, &dest);.    
11c50 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
11c60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
11c70 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e     pDelete = p->
11c80 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d  pPrior;.      p-
11c90 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72  >pPrior = pPrior
11ca0 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65  ;.      p->nSele
11cb0 63 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d  ctRow += pPrior-
11cc0 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20  >nSelectRow;.   
11cd0 20 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70     if( pPrior->p
11ce0 4c 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20  Limit.       && 
11cf0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
11d00 65 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69  eger(pPrior->pLi
11d10 6d 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20  mit, &nLimit).  
11d20 20 20 20 20 20 26 26 20 6e 4c 69 6d 69 74 3e 30       && nLimit>0
11d30 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f   && p->nSelectRo
11d40 77 20 3e 20 28 75 36 34 29 6e 4c 69 6d 69 74 20  w > (u64)nLimit 
11d50 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
11d60 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20    p->nSelectRow 
11d70 3d 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = nLimit;.      
11d80 7d 0a 20 20 20 20 20 20 69 66 28 20 61 64 64 72  }.      if( addr
11d90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11da0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
11db0 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
11dc0 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
11dd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
11de0 5f 45 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73  _EXCEPT:.    cas
11df0 65 20 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20  e TK_UNION: {.  
11e00 20 20 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62      int unionTab
11e10 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  ;    /* Cursor n
11e20 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
11e30 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c  porary table hol
11e40 64 69 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20  ding result */. 
11e50 20 20 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20       u8 op = 0; 
11e60 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
11e70 74 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  the SRT_ operati
11e80 6f 6e 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ons to apply to 
11e90 73 65 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  self */.      in
11ea0 74 20 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f  t priorOp;     /
11eb0 2a 20 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61  * The SRT_ opera
11ec0 74 69 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f  tion to apply to
11ed0 20 70 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a   prior selects *
11ee0 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
11ef0 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20  imit, *pOffset; 
11f00 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 73 20  /* Saved values 
11f10 6f 66 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64  of p->nLimit and
11f20 20 70 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20   p->nOffset */. 
11f30 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
11f40 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
11f50 75 6e 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20  uniondest;..    
11f60 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f    testcase( p->o
11f70 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a  p==TK_EXCEPT );.
11f80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
11f90 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20  p->op==TK_UNION 
11fa0 29 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70  );.      priorOp
11fb0 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20   = SRT_Union;.  
11fc0 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
11fd0 73 74 3d 3d 70 72 69 6f 72 4f 70 20 29 7b 0a 20  st==priorOp ){. 
11fe0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63 61 6e         /* We can
11ff0 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f 72 61   reuse a tempora
12000 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74  ry table generat
12010 65 64 20 62 79 20 61 20 53 45 4c 45 43 54 20 74  ed by a SELECT t
12020 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20 2a 2a  o our.        **
12030 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20 20 20   right..        
12040 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
12050 74 28 20 70 2d 3e 70 4c 69 6d 69 74 3d 3d 30 20  t( p->pLimit==0 
12060 29 3b 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 61  );      /* Not a
12070 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66 74 77 61  llowed on leftwa
12080 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  rd elements */. 
12090 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
120a0 2d 3e 70 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  ->pOffset==0 ); 
120b0 20 20 20 20 2f 2a 20 4e 6f 74 20 61 6c 6c 6f 77      /* Not allow
120c0 65 64 20 6f 6e 20 6c 65 66 74 77 61 72 64 20 65  ed on leftward e
120d0 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  lements */.     
120e0 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 64 65     unionTab = de
120f0 73 74 2e 69 53 44 50 61 72 6d 3b 0a 20 20 20 20  st.iSDParm;.    
12100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12110 20 2f 2a 20 57 65 20 77 69 6c 6c 20 6e 65 65 64   /* We will need
12120 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
12130 77 6e 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  wn temporary tab
12140 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20  le to hold the. 
12150 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 72 6d         ** interm
12160 65 64 69 61 74 65 20 72 65 73 75 6c 74 73 2e 0a  ediate results..
12170 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
12180 20 20 20 75 6e 69 6f 6e 54 61 62 20 3d 20 70 50     unionTab = pP
12190 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
121a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
121b0 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
121c0 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73          addr = s
121d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
121e0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
121f0 65 72 61 6c 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  eral, unionTab, 
12200 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  0);.        asse
12210 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45  rt( p->addrOpenE
12220 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29 3b 0a  phm[0] == -1 );.
12230 20 20 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f          p->addrO
12240 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
12250 72 3b 0a 20 20 20 20 20 20 20 20 66 69 6e 64 52  r;.        findR
12260 69 67 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c  ightmost(p)->sel
12270 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73  Flags |= SF_Uses
12280 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20  Ephemeral;.     
12290 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45     assert( p->pE
122a0 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 7d 0a  List );.      }.
122b0 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74  .      /* Code t
122c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
122d0 65 6e 74 73 20 74 6f 20 6f 75 72 20 6c 65 66 74  ents to our left
122e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
122f0 61 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d  assert( !pPrior-
12300 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
12310 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
12320 44 65 73 74 49 6e 69 74 28 26 75 6e 69 6f 6e 64  DestInit(&uniond
12330 65 73 74 2c 20 70 72 69 6f 72 4f 70 2c 20 75 6e  est, priorOp, un
12340 69 6f 6e 54 61 62 29 3b 0a 20 20 20 20 20 20 65  ionTab);.      e
12350 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
12360 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d 3e  (iSub1, pParse->
12370 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
12380 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12390 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
123a0 20 70 50 72 69 6f 72 2c 20 26 75 6e 69 6f 6e 64   pPrior, &uniond
123b0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
123c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  rc ){.        go
123d0 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f  to multi_select_
123e0 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  end;.      }..  
123f0 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
12400 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 73  current SELECT s
12410 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  tatement.      *
12420 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  /.      if( p->o
12430 70 3d 3d 54 4b 5f 45 58 43 45 50 54 20 29 7b 0a  p==TK_EXCEPT ){.
12440 20 20 20 20 20 20 20 20 6f 70 20 3d 20 53 52 54          op = SRT
12450 5f 45 78 63 65 70 74 3b 0a 20 20 20 20 20 20 7d  _Except;.      }
12460 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
12470 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f  sert( p->op==TK_
12480 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20 20 20 20  UNION );.       
12490 20 6f 70 20 3d 20 53 52 54 5f 55 6e 69 6f 6e 3b   op = SRT_Union;
124a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
124b0 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20  ->pPrior = 0;.  
124c0 20 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e      pLimit = p->
124d0 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d  pLimit;.      p-
124e0 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
124f0 20 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e     pOffset = p->
12500 70 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70  pOffset;.      p
12510 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20  ->pOffset = 0;. 
12520 20 20 20 20 20 75 6e 69 6f 6e 64 65 73 74 2e 65       uniondest.e
12530 44 65 73 74 20 3d 20 6f 70 3b 0a 20 20 20 20 20  Dest = op;.     
12540 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
12550 65 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65  er(iSub2, pParse
12560 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
12570 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12580 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
12590 65 2c 20 70 2c 20 26 75 6e 69 6f 6e 64 65 73 74  e, p, &uniondest
125a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
125b0 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
125c0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 51 75 65   );.      /* Que
125d0 72 79 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 6e  ry flattening in
125e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
125f0 20 6d 69 67 68 74 20 72 65 66 69 6c 6c 20 70 2d   might refill p-
12600 3e 70 4f 72 64 65 72 42 79 2e 0a 20 20 20 20 20  >pOrderBy..     
12610 20 2a 2a 20 42 65 20 73 75 72 65 20 74 6f 20 64   ** Be sure to d
12620 65 6c 65 74 65 20 70 2d 3e 70 4f 72 64 65 72 42  elete p->pOrderB
12630 79 2c 20 74 68 65 72 65 66 6f 72 65 2c 20 74 6f  y, therefore, to
12640 20 61 76 6f 69 64 20 61 20 6d 65 6d 6f 72 79 20   avoid a memory 
12650 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  leak. */.      s
12660 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
12670 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4f 72 64  lete(db, p->pOrd
12680 65 72 42 79 29 3b 0a 20 20 20 20 20 20 70 44 65  erBy);.      pDe
12690 6c 65 74 65 20 3d 20 70 2d 3e 70 50 72 69 6f 72  lete = p->pPrior
126a0 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  ;.      p->pPrio
126b0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
126c0 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
126d0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
126e0 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 20 70  op==TK_UNION ) p
126f0 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20  ->nSelectRow += 
12700 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
12710 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
12720 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
12730 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
12740 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
12750 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
12760 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
12770 3b 0a 20 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69  ;.      p->iLimi
12780 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
12790 69 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20  iOffset = 0;..  
127a0 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
127b0 68 65 20 64 61 74 61 20 69 6e 20 74 68 65 20 74  he data in the t
127c0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69  emporary table i
127d0 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72  nto whatever for
127e0 6d 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73  m.      ** it is
127f0 20 74 68 61 74 20 77 65 20 63 75 72 72 65 6e 74   that we current
12800 6c 79 20 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a  ly need..      *
12810 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
12820 75 6e 69 6f 6e 54 61 62 3d 3d 64 65 73 74 2e 69  unionTab==dest.i
12830 53 44 50 61 72 6d 20 7c 7c 20 64 65 73 74 2e 65  SDParm || dest.e
12840 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29 3b  Dest!=priorOp );
12850 0a 20 20 20 20 20 20 69 66 28 20 64 65 73 74 2e  .      if( dest.
12860 65 44 65 73 74 21 3d 70 72 69 6f 72 4f 70 20 29  eDest!=priorOp )
12870 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
12880 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
12890 61 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  art;.        ass
128a0 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74 20 29  ert( p->pEList )
128b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 65  ;.        if( de
128c0 73 74 2e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  st.eDest==SRT_Ou
128d0 74 70 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20  tput ){.        
128e0 20 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74    Select *pFirst
128f0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
12900 77 68 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70  while( pFirst->p
12910 50 72 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d  Prior ) pFirst =
12920 20 70 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b   pFirst->pPrior;
12930 0a 20 20 20 20 20 20 20 20 20 20 67 65 6e 65 72  .          gener
12940 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  ateColumnNames(p
12950 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72 73 74  Parse, 0, pFirst
12960 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 20  ->pEList);.     
12970 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 42 72     }.        iBr
12980 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
12990 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
129a0 20 20 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73         iCont = s
129b0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
129c0 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 20 20  bel(v);.        
129d0 63 6f 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69  computeLimitRegi
129e0 73 74 65 72 73 28 70 50 61 72 73 65 2c 20 70 2c  sters(pParse, p,
129f0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
12a00 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12a10 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
12a20 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69 42 72 65  , unionTab, iBre
12a30 61 6b 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ak); VdbeCoverag
12a40 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 69 53  e(v);.        iS
12a50 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
12a60 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
12a70 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 65 63 74  ;.        select
12a80 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
12a90 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
12aa0 75 6e 69 6f 6e 54 61 62 2c 0a 20 20 20 20 20 20  unionTab,.      
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ac0 20 20 30 2c 20 30 2c 20 26 64 65 73 74 2c 20 69    0, 0, &dest, i
12ad0 43 6f 6e 74 2c 20 69 42 72 65 61 6b 29 3b 0a 20  Cont, iBreak);. 
12ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12af0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
12b00 2c 20 69 43 6f 6e 74 29 3b 0a 20 20 20 20 20 20  , iCont);.      
12b10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12b20 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
12b30 75 6e 69 6f 6e 54 61 62 2c 20 69 53 74 61 72 74  unionTab, iStart
12b40 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
12b50 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
12b60 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
12b70 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b 0a  bel(v, iBreak);.
12b80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12b90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
12ba0 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e 54 61 62 2c  Close, unionTab,
12bb0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
12bc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
12bd0 20 20 20 20 64 65 66 61 75 6c 74 3a 20 61 73 73      default: ass
12be0 65 72 74 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 49  ert( p->op==TK_I
12bf0 4e 54 45 52 53 45 43 54 20 29 3b 20 7b 0a 20 20  NTERSECT ); {.  
12c00 20 20 20 20 69 6e 74 20 74 61 62 31 2c 20 74 61      int tab1, ta
12c10 62 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  b2;.      int iC
12c20 6f 6e 74 2c 20 69 42 72 65 61 6b 2c 20 69 53 74  ont, iBreak, iSt
12c30 61 72 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  art;.      Expr 
12c40 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f 66 66 73 65  *pLimit, *pOffse
12c50 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
12c60 72 3b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44  r;.      SelectD
12c70 65 73 74 20 69 6e 74 65 72 73 65 63 74 64 65 73  est intersectdes
12c80 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b  t;.      int r1;
12c90 0a 0a 20 20 20 20 20 20 2f 2a 20 49 4e 54 45 52  ..      /* INTER
12ca0 53 45 43 54 20 69 73 20 64 69 66 66 65 72 65 6e  SECT is differen
12cb0 74 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  t from the other
12cc0 73 20 73 69 6e 63 65 20 69 74 20 72 65 71 75 69  s since it requi
12cd0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  res.      ** two
12ce0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
12cf0 73 2e 20 20 48 65 6e 63 65 20 69 74 20 68 61 73  s.  Hence it has
12d00 20 69 74 73 20 6f 77 6e 20 63 61 73 65 2e 20 20   its own case.  
12d10 42 65 67 69 6e 0a 20 20 20 20 20 20 2a 2a 20 62  Begin.      ** b
12d20 79 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  y allocating the
12d30 20 74 61 62 6c 65 73 20 77 65 20 77 69 6c 6c 20   tables we will 
12d40 6e 65 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  need..      */. 
12d50 20 20 20 20 20 74 61 62 31 20 3d 20 70 50 61 72       tab1 = pPar
12d60 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
12d70 20 20 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d    tab2 = pParse-
12d80 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61  >nTab++;.      a
12d90 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72  ssert( p->pOrder
12da0 42 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  By==0 );..      
12db0 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
12dc0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f  beAddOp2(v, OP_O
12dd0 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 74 61  penEphemeral, ta
12de0 62 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73  b1, 0);.      as
12df0 73 65 72 74 28 20 70 2d 3e 61 64 64 72 4f 70 65  sert( p->addrOpe
12e00 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20 2d 31 20 29  nEphm[0] == -1 )
12e10 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 72 4f  ;.      p->addrO
12e20 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 61 64 64  penEphm[0] = add
12e30 72 3b 0a 20 20 20 20 20 20 66 69 6e 64 52 69 67  r;.      findRig
12e40 68 74 6d 6f 73 74 28 70 29 2d 3e 73 65 6c 46 6c  htmost(p)->selFl
12e50 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45 70  ags |= SF_UsesEp
12e60 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20 61  hemeral;.      a
12e70 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73 74  ssert( p->pEList
12e80 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f   );..      /* Co
12e90 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20 74  de the SELECTs t
12ea0 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f 20  o our left into 
12eb0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
12ec0 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a 2f  "tab1"..      */
12ed0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
12ee0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69 6e  lectDestInit(&in
12ef0 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52 54  tersectdest, SRT
12f00 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a 20  _Union, tab1);. 
12f10 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
12f20 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70 50  nteger(iSub1, pP
12f30 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
12f40 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
12f50 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
12f60 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26  Parse, pPrior, &
12f70 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a  intersectdest);.
12f80 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
12f90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c          goto mul
12fa0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
12fb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
12fc0 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65 6e   Code the curren
12fd0 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74 65  t SELECT into te
12fe0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22 74  mporary table "t
12ff0 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ab2".      */.  
13000 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
13010 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13020 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
13030 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20 20  , tab2, 0);.    
13040 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
13050 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d 20  rOpenEphm[1] == 
13060 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
13070 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d  ddrOpenEphm[1] =
13080 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
13090 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20  pPrior = 0;.    
130a0 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c    pLimit = p->pL
130b0 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
130c0 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
130d0 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70 4f   pOffset = p->pO
130e0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e  ffset;.      p->
130f0 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20  pOffset = 0;.   
13100 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73 74     intersectdest
13110 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32 3b  .iSDParm = tab2;
13120 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65  .      explainSe
13130 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20  tInteger(iSub2, 
13140 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c  pParse->iNextSel
13150 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63  ectId);.      rc
13160 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
13170 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e 74  (pParse, p, &int
13180 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20 20  ersectdest);.   
13190 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21     testcase( rc!
131a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
131b0 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d      pDelete = p-
131c0 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70  >pPrior;.      p
131d0 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
131e0 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  r;.      if( p->
131f0 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69 6f  nSelectRow>pPrio
13200 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29 20  r->nSelectRow ) 
13210 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
13220 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52  pPrior->nSelectR
13230 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ow;.      sqlite
13240 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
13250 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20 20  p->pLimit);.    
13260 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70 4c    p->pLimit = pL
13270 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  imit;.      p->p
13280 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65 74  Offset = pOffset
13290 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
132a0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61 6b  rate code to tak
132b0 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74 69  e the intersecti
132c0 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74 65  on of the two te
132d0 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a 2a  mporary.      **
132e0 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20 2a   tables..      *
132f0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
13300 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20  p->pEList );.   
13310 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73     if( dest.eDes
13320 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b  t==SRT_Output ){
13330 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20  .        Select 
13340 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 20  *pFirst = p;.   
13350 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72       while( pFir
13360 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69  st->pPrior ) pFi
13370 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50  rst = pFirst->pP
13380 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67 65  rior;.        ge
13390 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65  nerateColumnName
133a0 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69  s(pParse, 0, pFi
133b0 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  rst->pEList);.  
133c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72 65      }.      iBre
133d0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
133e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
133f0 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c 69      iCont = sqli
13400 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
13410 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70 75  (v);.      compu
13420 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73  teLimitRegisters
13430 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72 65  (pParse, p, iBre
13440 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ak);.      sqlit
13450 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
13460 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31 2c  OP_Rewind, tab1,
13470 20 69 42 72 65 61 6b 29 3b 20 56 64 62 65 43 6f   iBreak); VdbeCo
13480 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
13490 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
134a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
134b0 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
134c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
134d0 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
134e0 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
134f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13500 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
13510 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
13520 74 2c 20 72 31 2c 20 30 29 3b 20 56 64 62 65 43  t, r1, 0); VdbeC
13530 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
13540 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
13550 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
13560 72 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63  r1);.      selec
13570 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73  tInnerLoop(pPars
13580 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  e, p, p->pEList,
13590 20 74 61 62 31 2c 0a 20 20 20 20 20 20 20 20 20   tab1,.         
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
135b0 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74 2c  0, &dest, iCont,
135c0 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20   iBreak);.      
135d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
135e0 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e 74  veLabel(v, iCont
135f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13600 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13610 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53 74  _Next, tab1, iSt
13620 61 72 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  art); VdbeCovera
13630 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
13640 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
13650 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
13660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
13680 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
13690 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
136a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
136b0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
136c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
136d0 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
136e0 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
136f0 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
13700 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
13710 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
13720 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
13730 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
13740 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
13750 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
13760 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
13770 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
13780 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
13790 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
137a0 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
137b0 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
137c0 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
137d0 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
137e0 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
137f0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
13800 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
13810 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
13820 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
13830 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
13840 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
13850 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
13860 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
13870 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
13880 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13890 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
138a0 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
138b0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
138c0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
138d0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
138e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
138f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13900 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
13910 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
13920 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
13930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
13940 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
13950 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
13960 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
13970 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
13980 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
13990 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
139a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
139b0 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
139c0 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
139d0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
139e0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
139f0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
13a00 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13a30 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
13a40 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
13a50 73 73 65 72 74 28 20 70 2d 3e 70 4e 65 78 74 3d  ssert( p->pNext=
13a60 3d 30 20 29 3b 0a 20 20 20 20 6e 43 6f 6c 20 3d  =0 );.    nCol =
13a70 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
13a80 72 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20  r;.    pKeyInfo 
13a90 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
13aa0 41 6c 6c 6f 63 28 64 62 2c 20 6e 43 6f 6c 2c 20  Alloc(db, nCol, 
13ab0 31 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4b 65  1);.    if( !pKe
13ac0 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 72  yInfo ){.      r
13ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13ae0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 75 6c  ;.      goto mul
13af0 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20  ti_select_end;. 
13b00 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
13b10 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79 49 6e 66  , apColl=pKeyInf
13b20 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e 43 6f 6c  o->aColl; i<nCol
13b30 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c 2b 2b 29  ; i++, apColl++)
13b40 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20  {.      *apColl 
13b50 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74 43 6f 6c  = multiSelectCol
13b60 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 2c 20  lSeq(pParse, p, 
13b70 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  i);.      if( 0=
13b80 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  =*apColl ){.    
13b90 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d 20 64 62      *apColl = db
13ba0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
13bb0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
13bc0 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
13bd0 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
13be0 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20 20  >pPrior){.      
13bf0 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
13c00 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
13c10 61 64 64 72 20 3d 20 70 4c 6f 6f 70 2d 3e 61 64  addr = pLoop->ad
13c20 64 72 4f 70 65 6e 45 70 68 6d 5b 69 5d 3b 0a 20  drOpenEphm[i];. 
13c30 20 20 20 20 20 20 20 69 66 28 20 61 64 64 72 3c         if( addr<
13c40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
13c50 2a 20 49 66 20 5b 30 5d 20 69 73 20 75 6e 75 73  * If [0] is unus
13c60 65 64 20 74 68 65 6e 20 5b 31 5d 20 69 73 20 61  ed then [1] is a
13c70 6c 73 6f 20 75 6e 75 73 65 64 2e 20 20 53 6f 20  lso unused.  So 
13c80 77 65 20 63 61 6e 0a 20 20 20 20 20 20 20 20 20  we can.         
13c90 20 2a 2a 20 61 6c 77 61 79 73 20 73 61 66 65 6c   ** always safel
13ca0 79 20 61 62 6f 72 74 20 61 73 20 73 6f 6f 6e 20  y abort as soon 
13cb0 61 73 20 74 68 65 20 66 69 72 73 74 20 75 6e 75  as the first unu
13cc0 73 65 64 20 73 6c 6f 74 20 69 73 20 66 6f 75 6e  sed slot is foun
13cd0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  d */.          a
13ce0 73 73 65 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 64  ssert( pLoop->ad
13cf0 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 3c 30 20  drOpenEphm[1]<0 
13d00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
13d10 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
13d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13d30 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
13d40 72 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  r, nCol);.      
13d50 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13d60 6e 67 65 50 34 28 76 2c 20 61 64 64 72 2c 20 28  ngeP4(v, addr, (
13d70 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
13d80 49 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f  InfoRef(pKeyInfo
13d90 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
13da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
13db0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20  4_KEYINFO);.    
13dc0 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f      pLoop->addrO
13dd0 70 65 6e 45 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b  penEphm[i] = -1;
13de0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13df0 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
13e00 6f 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29  oUnref(pKeyInfo)
13e10 3b 0a 20 20 7d 0a 0a 6d 75 6c 74 69 5f 73 65 6c  ;.  }..multi_sel
13e20 65 63 74 5f 65 6e 64 3a 0a 20 20 70 44 65 73 74  ect_end:.  pDest
13e30 2d 3e 69 53 64 73 74 20 3d 20 64 65 73 74 2e 69  ->iSdst = dest.i
13e40 53 64 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e 6e  Sdst;.  pDest->n
13e50 53 64 73 74 20 3d 20 64 65 73 74 2e 6e 53 64 73  Sdst = dest.nSds
13e60 74 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  t;.  sqlite3Sele
13e70 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 44 65  ctDelete(db, pDe
13e80 6c 65 74 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  lete);.  return 
13e90 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
13ea0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
13eb0 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a 2f 0a 0a  OUND_SELECT */..
13ec0 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 6f 75  /*.** Code an ou
13ed0 74 70 75 74 20 73 75 62 72 6f 75 74 69 6e 65 20  tput subroutine 
13ee0 66 6f 72 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  for a coroutine 
13ef0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
13f00 66 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  f a.** SELECT st
13f10 61 74 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  atment..**.** Th
13f20 65 20 64 61 74 61 20 74 6f 20 62 65 20 6f 75 74  e data to be out
13f30 70 75 74 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  put is contained
13f40 20 69 6e 20 70 49 6e 2d 3e 69 53 64 73 74 2e 20   in pIn->iSdst. 
13f50 20 54 68 65 72 65 20 61 72 65 0a 2a 2a 20 70 49   There are.** pI
13f60 6e 2d 3e 6e 53 64 73 74 20 63 6f 6c 75 6d 6e 73  n->nSdst columns
13f70 20 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 20 20   to be output.  
13f80 70 44 65 73 74 20 69 73 20 77 68 65 72 65 20 74  pDest is where t
13f90 68 65 20 6f 75 74 70 75 74 20 73 68 6f 75 6c 64  he output should
13fa0 0a 2a 2a 20 62 65 20 73 65 6e 74 2e 0a 2a 2a 0a  .** be sent..**.
13fb0 2a 2a 20 72 65 67 52 65 74 75 72 6e 20 69 73 20  ** regReturn is 
13fc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  the number of th
13fd0 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69  e register holdi
13fe0 6e 67 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  ng the subroutin
13ff0 65 0a 2a 2a 20 72 65 74 75 72 6e 20 61 64 64 72  e.** return addr
14000 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 65  ess..**.** If re
14010 67 50 72 65 76 3e 30 20 74 68 65 6e 20 69 74 20  gPrev>0 then it 
14020 69 73 20 74 68 65 20 66 69 72 73 74 20 72 65 67  is the first reg
14030 69 73 74 65 72 20 69 6e 20 61 20 76 65 63 74 6f  ister in a vecto
14040 72 20 74 68 61 74 0a 2a 2a 20 72 65 63 6f 72 64  r that.** record
14050 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6f  s the previous o
14060 75 74 70 75 74 2e 20 20 6d 65 6d 5b 72 65 67 50  utput.  mem[regP
14070 72 65 76 5d 20 69 73 20 61 20 66 6c 61 67 20 74  rev] is a flag t
14080 68 61 74 20 69 73 20 66 61 6c 73 65 0a 2a 2a 20  hat is false.** 
14090 69 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  if there has bee
140a0 6e 20 6e 6f 20 70 72 65 76 69 6f 75 73 20 6f 75  n no previous ou
140b0 74 70 75 74 2e 20 20 49 66 20 72 65 67 50 72 65  tput.  If regPre
140c0 76 3e 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73  v>0 then code is
140d0 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 6f  .** generated to
140e0 20 73 75 70 70 72 65 73 73 20 64 75 70 6c 69 63   suppress duplic
140f0 61 74 65 73 2e 20 20 70 4b 65 79 49 6e 66 6f 20  ates.  pKeyInfo 
14100 69 73 20 75 73 65 64 20 66 6f 72 20 63 6f 6d 70  is used for comp
14110 61 72 69 6e 67 0a 2a 2a 20 6b 65 79 73 2e 0a 2a  aring.** keys..*
14120 2a 0a 2a 2a 20 49 66 20 74 68 65 20 4c 49 4d 49  *.** If the LIMI
14130 54 20 66 6f 75 6e 64 20 69 6e 20 70 2d 3e 69 4c  T found in p->iL
14140 69 6d 69 74 20 69 73 20 72 65 61 63 68 65 64 2c  imit is reached,
14150 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
14160 79 20 74 6f 0a 2a 2a 20 69 42 72 65 61 6b 2e 0a  y to.** iBreak..
14170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
14180 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75 62 72  nerateOutputSubr
14190 6f 75 74 69 6e 65 28 0a 20 20 50 61 72 73 65 20  outine(.  Parse 
141a0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
141b0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
141c0 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
141d0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
141e0 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
141f0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
14200 65 6c 65 63 74 44 65 73 74 20 2a 70 49 6e 2c 20  electDest *pIn, 
14210 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 6f 75 74         /* Corout
14220 69 6e 65 20 73 75 70 70 6c 79 69 6e 67 20 64 61  ine supplying da
14230 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65  ta */.  SelectDe
14240 73 74 20 2a 70 44 65 73 74 2c 20 20 20 20 20 20  st *pDest,      
14250 2f 2a 20 57 68 65 72 65 20 74 6f 20 73 65 6e 64  /* Where to send
14260 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   the data */.  i
14270 6e 74 20 72 65 67 52 65 74 75 72 6e 2c 20 20 20  nt regReturn,   
14280 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
14290 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
142a0 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ister */.  int r
142b0 65 67 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  egPrev,         
142c0 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
142d0 65 73 75 6c 74 20 72 65 67 69 73 74 65 72 2e 20  esult register. 
142e0 20 4e 6f 20 75 6e 69 71 75 65 6e 65 73 73 20 69   No uniqueness i
142f0 66 20 30 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  f 0 */.  KeyInfo
14300 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
14310 20 2f 2a 20 46 6f 72 20 63 6f 6d 70 61 72 69 6e   /* For comparin
14320 67 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  g with previous 
14330 65 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69  entry */.  int i
14340 42 72 65 61 6b 20 20 20 20 20 20 20 20 20 20 20  Break           
14350 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
14360 69 66 20 77 65 20 68 69 74 20 74 68 65 20 4c 49  if we hit the LI
14370 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  MIT */.){.  Vdbe
14380 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
14390 64 62 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6e 74  dbe;.  int iCont
143a0 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61 64 64 72  inue;.  int addr
143b0 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  ;..  addr = sqli
143c0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
143d0 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e 74 69 6e  dr(v);.  iContin
143e0 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
143f0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
14400 20 2f 2a 20 53 75 70 70 72 65 73 73 20 64 75 70   /* Suppress dup
14410 6c 69 63 61 74 65 73 20 66 6f 72 20 55 4e 49 4f  licates for UNIO
14420 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
14430 4e 54 45 52 53 45 43 54 20 0a 20 20 2a 2f 0a 20  NTERSECT .  */. 
14440 20 69 66 28 20 72 65 67 50 72 65 76 20 29 7b 0a   if( regPrev ){.
14450 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
14460 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
14470 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
14480 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72 65 76 29  _IfNot, regPrev)
14490 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
144a0 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71 6c 69  );.    j2 = sqli
144b0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
144c0 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70 49 6e   OP_Compare, pIn
144d0 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76  ->iSdst, regPrev
144e0 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2c 0a  +1, pIn->nSdst,.
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
14510 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49  har*)sqlite3KeyI
14520 6e 66 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29  nfoRef(pKeyInfo)
14530 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
14540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
14550 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c  dOp3(v, OP_Jump,
14560 20 6a 32 2b 32 2c 20 69 43 6f 6e 74 69 6e 75 65   j2+2, iContinue
14570 2c 20 6a 32 2b 32 29 3b 20 56 64 62 65 43 6f 76  , j2+2); VdbeCov
14580 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71  erage(v);.    sq
14590 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
145a0 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71  e(v, j1);.    sq
145b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
145c0 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 70 49 6e 2d  v, OP_Copy, pIn-
145d0 3e 69 53 64 73 74 2c 20 72 65 67 50 72 65 76 2b  >iSdst, regPrev+
145e0 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74 2d 31 29  1, pIn->nSdst-1)
145f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
14600 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
14610 74 65 67 65 72 2c 20 31 2c 20 72 65 67 50 72 65  teger, 1, regPre
14620 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
14630 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
14640 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
14650 30 3b 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73  0;..  /* Suppres
14660 73 20 74 68 65 20 66 69 72 73 74 20 4f 46 46 53  s the first OFFS
14670 45 54 20 65 6e 74 72 69 65 73 20 69 66 20 74 68  ET entries if th
14680 65 72 65 20 69 73 20 61 6e 20 4f 46 46 53 45 54  ere is an OFFSET
14690 20 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 63   clause.  */.  c
146a0 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2d 3e  odeOffset(v, p->
146b0 69 4f 66 66 73 65 74 2c 20 69 43 6f 6e 74 69 6e  iOffset, iContin
146c0 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ue);..  switch( 
146d0 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b 0a  pDest->eDest ){.
146e0 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
146f0 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61 20   result as data 
14700 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20 6b  using a unique k
14710 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ey..    */.    c
14720 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20  ase SRT_Table:. 
14730 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68 65     case SRT_Ephe
14740 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69 6e  mTab: {.      in
14750 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
14760 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
14770 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20 3d  ;.      int r2 =
14780 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
14790 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
147a0 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65 73    testcase( pDes
147b0 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54 61  t->eDest==SRT_Ta
147c0 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ble );.      tes
147d0 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65 44  tcase( pDest->eD
147e0 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61  est==SRT_EphemTa
147f0 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  b );.      sqlit
14800 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
14810 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70  OP_MakeRecord, p
14820 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
14830 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20 20  nSdst, r1);.    
14840 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14850 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77  Op2(v, OP_NewRow
14860 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  id, pDest->iSDPa
14870 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  rm, r2);.      s
14880 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
14890 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 70  (v, OP_Insert, p
148a0 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 72  Dest->iSDParm, r
148b0 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73 71  1, r2);.      sq
148c0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
148d0 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
148e0 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ND);.      sqlit
148f0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
14900 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20  (pParse, r2);.  
14910 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
14920 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
14930 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , r1);.      bre
14940 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ak;.    }..#ifnd
14950 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
14960 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20 49  UBQUERY.    /* I
14970 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69 6e  f we are creatin
14980 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20 22  g a set for an "
14990 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
149a0 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74 2c  ...)" construct,
149b0 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  .    ** then the
149c0 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 73  re should be a s
149d0 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74 68  ingle item on th
149e0 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65 20  e stack.  Write 
149f0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65 6d  this.    ** item
14a00 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74 61   into the set ta
14a10 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20 64  ble with bogus d
14a20 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ata..    */.    
14a30 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b 0a  case SRT_Set: {.
14a40 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20 20        int r1;.  
14a50 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 2d      assert( pIn-
14a60 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20 20  >nSdst==1 );.   
14a70 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73     pDest->affSds
14a80 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73 71  t = .         sq
14a90 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
14aa0 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  nity(p->pEList->
14ab0 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65 73  a[0].pExpr, pDes
14ac0 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20 20  t->affSdst);.   
14ad0 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47     r1 = sqlite3G
14ae0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
14af0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14b00 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14b10 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49 6e  _MakeRecord, pIn
14b20 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c 20  ->iSdst, 1, r1, 
14b30 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c  &pDest->affSdst,
14b40 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
14b50 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
14b60 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
14b70 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29 3b   pIn->iSdst, 1);
14b80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14b90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14ba0 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74 2d  dxInsert, pDest-
14bb0 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a 20  >iSDParm, r1);. 
14bc0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
14bd0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
14be0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
14bf0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  eak;.    }..#if 
14c00 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63 75  0  /* Never occu
14c10 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20 42  rs on an ORDER B
14c20 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 2f  Y query */.    /
14c30 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78 69  * If any row exi
14c40 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  st in the result
14c50 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68 61   set, record tha
14c60 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72 74  t fact and abort
14c70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
14c80 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a  e SRT_Exists: {.
14c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14ca0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
14cb0 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74 2d  teger, 1, pDest-
14cc0 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20 20  >iSDParm);.     
14cd0 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63 6c   /* The LIMIT cl
14ce0 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69 6e  ause will termin
14cf0 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72  ate the loop for
14d00 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72 65   us */.      bre
14d10 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
14d20 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
14d30 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65 6c   is a scalar sel
14d40 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72 74  ect that is part
14d50 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
14d60 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73  n, then.    ** s
14d70 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
14d80 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69   in the appropri
14d90 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  ate memory cell 
14da0 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20 20  and break out.  
14db0 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61 6e    ** of the scan
14dc0 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20   loop..    */.  
14dd0 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20    case SRT_Mem: 
14de0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14df0 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b  pIn->nSdst==1 );
14e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
14e10 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73  prCodeMove(pPars
14e20 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70  e, pIn->iSdst, p
14e30 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20 31  Dest->iSDParm, 1
14e40 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  );.      /* The 
14e50 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c  LIMIT clause wil
14e60 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68  l jump out of th
14e70 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f  e loop for us */
14e80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14e90 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    }.#endif /* #i
14ea0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14eb0 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 20  T_SUBQUERY */.. 
14ec0 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
14ed0 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
14ee0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65  a sequence of re
14ef0 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73  gisters.    ** s
14f00 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73 74  tarting at pDest
14f10 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20 74  ->iSdst.  Then t
14f20 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79 69  he co-routine yi
14f30 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
14f40 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75 74   case SRT_Corout
14f50 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ine: {.      if(
14f60 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30   pDest->iSdst==0
14f70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 73   ){.        pDes
14f80 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69 74  t->iSdst = sqlit
14f90 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
14fa0 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64 73  Parse, pIn->nSds
14fb0 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65 73  t);.        pDes
14fc0 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d 3e  t->nSdst = pIn->
14fd0 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  nSdst;.      }. 
14fe0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
14ff0 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c  CodeMove(pParse,
15000 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44 65   pIn->iSdst, pDe
15010 73 74 2d 3e 69 53 64 73 74 2c 20 70 44 65 73 74  st->iSdst, pDest
15020 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  ->nSdst);.      
15030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15040 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 70  1(v, OP_Yield, p
15050 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b 0a  Dest->iSDParm);.
15060 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15070 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   }..    /* If no
15080 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65 2c  ne of the above,
15090 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
150a0 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75 73   destination mus
150b0 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54 5f  t be.    ** SRT_
150c0 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72 6f  Output.  This ro
150d0 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
150e0 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20 6f  alled with any o
150f0 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73 74  ther.    ** dest
15100 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74 68  ination other th
15110 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e 64  an the ones hand
15120 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52 54  led above or SRT
15130 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a 0a  _Output..    **.
15140 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f 4f      ** For SRT_O
15150 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20 61  utput, results a
15160 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 73  re stored in a s
15170 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69 73  equence of regis
15180 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20 54  ters.  .    ** T
15190 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75 6c  hen the OP_Resul
151a0 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20 75  tRow opcode is u
151b0 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71 6c  sed to cause sql
151c0 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a 20  ite3_step() to. 
151d0 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65     ** return the
151e0 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65 73   next row of res
151f0 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
15200 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
15210 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d 3e   assert( pDest->
15220 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
15230 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
15240 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15250 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70 49  OP_ResultRow, pI
15260 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e 6e  n->iSdst, pIn->n
15270 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
15280 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66  ite3ExprCacheAff
15290 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72  inityChange(pPar
152a0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
152b0 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20  pIn->nSdst);.   
152c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
152d0 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
152e0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
152f0 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49 4d   loop if the LIM
15300 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a 20  IT is reached.. 
15310 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69   */.  if( p->iLi
15320 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
15330 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15340 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
15350 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d 31  imit, iBreak, -1
15360 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15370 76 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  v);.  }..  /* Ge
15380 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
15390 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
153a0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
153b0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
153c0 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
153d0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
153e0 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
153f0 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
15400 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
15410 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
15420 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
15430 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
15440 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
15450 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
15460 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
15470 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
15480 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
15490 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
154a0 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
154b0 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
154c0 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
154d0 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
154e0 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
154f0 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
15500 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
15510 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
15520 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
15530 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
15540 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
15550 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
15560 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
15570 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
15580 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
15590 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
155a0 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
155b0 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
155c0 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
155d0 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
155e0 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
155f0 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
15600 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
15610 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
15620 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
15630 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
15640 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
15650 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
15660 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
15670 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
15680 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
15690 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
156a0 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
156b0 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
156c0 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
156d0 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
156e0 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
156f0 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
15700 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
15710 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
15720 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
15730 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
15740 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
15750 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
15760 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
15770 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
15780 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
15790 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
157a0 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
157b0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
157c0 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
157d0 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
157e0 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
157f0 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
15800 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
15810 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
15820 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
15830 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
15840 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
15850 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
15860 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
15870 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
15880 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
15890 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
158a0 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
158b0 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
158c0 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
158d0 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
158e0 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
158f0 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
15900 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
15910 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
15920 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
15930 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
15940 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
15950 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
15960 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
15970 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
15980 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
15990 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
159a0 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
159b0 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
159c0 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
159d0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
159e0 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
15a00 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
15a10 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
15a20 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
15a30 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
15a40 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
15a50 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
15a60 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
15a70 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
15a80 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
15a90 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
15aa0 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
15ab0 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
15ac0 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
15ad0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
15ae0 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
15af0 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
15b00 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
15b10 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
15b20 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
15b30 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
15b40 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
15b50 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
15b60 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
15b70 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
15b80 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
15b90 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
15ba0 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
15bb0 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
15bc0 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
15bd0 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
15be0 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
15bf0 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
15c00 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
15c10 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
15c20 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
15c30 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
15c40 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
15c50 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
15c60 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
15c70 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
15c80 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
15c90 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
15ca0 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
15cb0 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
15cc0 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
15cd0 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
15ce0 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
15cf0 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
15d00 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
15d10 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
15d20 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
15d30 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
15d40 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
15d50 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
15d60 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
15d70 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
15d80 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
15d90 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
15da0 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
15db0 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
15dc0 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
15dd0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
15de0 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
15df0 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
15e00 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
15e10 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
15e20 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
15e30 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
15e40 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
15e50 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
15e60 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
15e70 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
15e80 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
15e90 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
15ea0 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
15eb0 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
15ec0 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
15ed0 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
15ee0 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
15ef0 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
15f00 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
15f10 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
15f20 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
15f30 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
15f40 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
15f50 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
15f60 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
15f70 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
15f80 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
15f90 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
15fa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
15fb0 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
15fc0 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
15fd0 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
15fe0 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
15ff0 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
16000 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
16010 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
16020 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
16030 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
16040 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
16050 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
16060 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
16070 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
16080 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
16090 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
160a0 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
160b0 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
160c0 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
160d0 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
160e0 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
160f0 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
16100 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
16110 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
16120 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
16130 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
16140 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
16150 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
16160 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
16170 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
16180 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
16190 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
161a0 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
161b0 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
161c0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
161d0 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
161e0 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
161f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
16200 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
16210 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
16220 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
16230 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
16240 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
16250 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
16260 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
16270 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
16280 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
16290 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
162a0 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
162b0 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
162c0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
162d0 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
162e0 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
162f0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
16300 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
16310 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
16320 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
16330 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
16340 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
16350 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
16360 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
16370 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
16380 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
16390 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
163a0 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
163b0 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
163c0 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
163d0 69 6e 74 20 72 65 67 41 64 64 72 42 3b 20 20 20  int regAddrB;   
163e0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
163f0 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 73 65   register for se
16400 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
16410 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
16420 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a 20 41  lectA;      /* A
16430 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
16440 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69 6e 65  lect-A coroutine
16450 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 65   */.  int addrSe
16460 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a 20 41  lectB;      /* A
16470 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 65  ddress of the se
16480 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69 6e 65  lect-B coroutine
16490 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f 75 74   */.  int regOut
164a0 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  A;          /* A
164b0 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
164c0 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74 2d 41  for the output-A
164d0 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
164e0 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20 20 20   int regOutB;   
164f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16500 73 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 74  s register for t
16510 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75 62 72  he output-B subr
16520 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
16530 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20 20 20  addrOutA;       
16540 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
16550 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73 75 62  the output-A sub
16560 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
16570 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b 20 20   addrOutB = 0;  
16580 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
16590 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
165a0 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
165b0 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20 20 20  t addrEofA;     
165c0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
165d0 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41 2d 65  f the select-A-e
165e0 78 68 61 75 73 74 65 64 20 73 75 62 72 6f 75 74  xhausted subrout
165f0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  ine */.  int add
16600 72 45 6f 66 41 5f 6e 6f 42 3b 20 20 20 20 20 2f  rEofA_noB;     /
16610 2a 20 41 6c 74 65 72 6e 61 74 65 20 61 64 64 72  * Alternate addr
16620 45 6f 66 41 20 69 66 20 42 20 69 73 20 75 6e 69  EofA if B is uni
16630 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
16640 69 6e 74 20 61 64 64 72 45 6f 66 42 3b 20 20 20  int addrEofB;   
16650 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
16660 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 42   of the select-B
16670 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
16680 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
16690 64 64 72 41 6c 74 42 3b 20 20 20 20 20 20 20 20  ddrAltB;        
166a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
166b0 68 65 20 41 3c 42 20 73 75 62 72 6f 75 74 69 6e  he A<B subroutin
166c0 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41  e */.  int addrA
166d0 65 71 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eqB;         /* 
166e0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41  Address of the A
166f0 3d 3d 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  ==B subroutine *
16700 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 67 74 42  /.  int addrAgtB
16710 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  ;         /* Add
16720 72 65 73 73 20 6f 66 20 74 68 65 20 41 3e 42 20  ress of the A>B 
16730 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
16740 69 6e 74 20 72 65 67 4c 69 6d 69 74 41 3b 20 20  int regLimitA;  
16750 20 20 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 72        /* Limit r
16760 65 67 69 73 74 65 72 20 66 6f 72 20 73 65 6c 65  egister for sele
16770 63 74 2d 41 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ct-A */.  int re
16780 67 4c 69 6d 69 74 42 3b 20 20 20 20 20 20 20 20  gLimitB;        
16790 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74 65  /* Limit registe
167a0 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20 2a  r for select-A *
167b0 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76 3b  /.  int regPrev;
167c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72            /* A r
167d0 61 6e 67 65 20 6f 66 20 72 65 67 69 73 74 65 72  ange of register
167e0 73 20 74 6f 20 68 6f 6c 64 20 70 72 65 76 69 6f  s to hold previo
167f0 75 73 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69  us output */.  i
16800 6e 74 20 73 61 76 65 64 4c 69 6d 69 74 3b 20 20  nt savedLimit;  
16810 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
16820 6c 75 65 20 6f 66 20 70 2d 3e 69 4c 69 6d 69 74  lue of p->iLimit
16830 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 4f   */.  int savedO
16840 66 66 73 65 74 3b 20 20 20 20 20 20 2f 2a 20 53  ffset;      /* S
16850 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 70 2d  aved value of p-
16860 3e 69 4f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e  >iOffset */.  in
16870 74 20 6c 61 62 65 6c 43 6d 70 72 3b 20 20 20 20  t labelCmpr;    
16880 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
16890 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
168a0 65 20 6d 65 72 67 65 20 61 6c 67 6f 72 69 74 68  e merge algorith
168b0 6d 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62 65 6c  m */.  int label
168c0 45 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  End;         /* 
168d0 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20 65 6e  Label for the en
168e0 64 20 6f 66 20 74 68 65 20 6f 76 65 72 61 6c 6c  d of the overall
168f0 20 53 45 4c 45 43 54 20 73 74 6d 74 20 2a 2f 0a   SELECT stmt */.
16900 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
16910 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
16920 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 74 68 61  instructions tha
16930 74 20 67 65 74 20 72 65 74 61 72 67 65 74 74 65  t get retargette
16940 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 3b 20 20  d */.  int op;  
16950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16960 4f 6e 65 20 6f 66 20 54 4b 5f 41 4c 4c 2c 20 54  One of TK_ALL, T
16970 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45  K_UNION, TK_EXCE
16980 50 54 2c 20 54 4b 5f 49 4e 54 45 52 53 45 43 54  PT, TK_INTERSECT
16990 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
169a0 4b 65 79 44 75 70 20 3d 20 30 3b 20 2f 2a 20 43  KeyDup = 0; /* C
169b0 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 66 6f 72 6d  omparison inform
169c0 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
169d0 61 74 65 20 72 65 6d 6f 76 61 6c 20 2a 2f 0a 20  ate removal */. 
169e0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 4d 65   KeyInfo *pKeyMe
169f0 72 67 65 3b 20 20 20 2f 2a 20 43 6f 6d 70 61 72  rge;   /* Compar
16a00 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
16a10 20 66 6f 72 20 6d 65 72 67 69 6e 67 20 72 6f 77   for merging row
16a20 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
16a30 64 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  db;          /* 
16a40 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
16a50 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ion */.  ExprLis
16a60 74 20 2a 70 4f 72 64 65 72 42 79 3b 20 20 20 2f  t *pOrderBy;   /
16a70 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
16a80 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
16a90 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
16aa0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
16ab0 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  rms in the ORDER
16ac0 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
16ad0 69 6e 74 20 2a 61 50 65 72 6d 75 74 65 3b 20 20  int *aPermute;  
16ae0 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67        /* Mapping
16af0 20 66 72 6f 6d 20 4f 52 44 45 52 20 42 59 20 74   from ORDER BY t
16b00 65 72 6d 73 20 74 6f 20 72 65 73 75 6c 74 20 73  erms to result s
16b10 65 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 69  et columns */.#i
16b20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16b30 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69 6e 74 20  T_EXPLAIN.  int 
16b40 69 53 75 62 31 3b 20 20 20 20 20 20 20 20 20 20  iSub1;          
16b50 20 20 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 6c    /* EQP id of l
16b60 65 66 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a  eft-hand query *
16b70 2f 0a 20 20 69 6e 74 20 69 53 75 62 32 3b 20 20  /.  int iSub2;  
16b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50            /* EQP
16b90 20 69 64 20 6f 66 20 72 69 67 68 74 2d 68 61 6e   id of right-han
16ba0 64 20 71 75 65 72 79 20 2a 2f 0a 23 65 6e 64 69  d query */.#endi
16bb0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  f..  assert( p->
16bc0 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a 20  pOrderBy!=0 );. 
16bd0 20 61 73 73 65 72 74 28 20 70 4b 65 79 44 75 70   assert( pKeyDup
16be0 3d 3d 30 20 29 3b 20 2f 2a 20 22 4d 61 6e 61 67  ==0 ); /* "Manag
16bf0 65 64 22 20 63 6f 64 65 20 6e 65 65 64 73 20 74  ed" code needs t
16c00 68 69 73 2e 20 20 54 69 63 6b 65 74 20 23 33 33  his.  Ticket #33
16c10 38 32 2e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50  82. */.  db = pP
16c20 61 72 73 65 2d 3e 64 62 3b 0a 20 20 76 20 3d 20  arse->db;.  v = 
16c30 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
16c40 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
16c50 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
16c60 79 20 74 68 72 6f 77 6e 20 74 68 65 20 65 72 72  y thrown the err
16c70 6f 72 20 69 66 20 56 44 42 45 20 61 6c 6c 6f 63  or if VDBE alloc
16c80 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 6c 61 62   failed */.  lab
16c90 65 6c 45 6e 64 20 3d 20 73 71 6c 69 74 65 33 56  elEnd = sqlite3V
16ca0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
16cb0 0a 20 20 6c 61 62 65 6c 43 6d 70 72 20 3d 20 73  .  labelCmpr = s
16cc0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
16cd0 62 65 6c 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 50  bel(v);...  /* P
16ce0 61 74 63 68 20 75 70 20 74 68 65 20 4f 52 44 45  atch up the ORDE
16cf0 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2f  R BY clause.  */
16d00 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f 70 3b 20 20  .  op = p->op;  
16d10 0a 20 20 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70  .  pPrior = p->p
16d20 50 72 69 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  Prior;.  assert(
16d30 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42   pPrior->pOrderB
16d40 79 3d 3d 30 20 29 3b 0a 20 20 70 4f 72 64 65 72  y==0 );.  pOrder
16d50 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79  By = p->pOrderBy
16d60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
16d70 65 72 42 79 20 29 3b 0a 20 20 6e 4f 72 64 65 72  erBy );.  nOrder
16d80 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
16d90 45 78 70 72 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20  Expr;..  /* For 
16da0 6f 70 65 72 61 74 6f 72 73 20 6f 74 68 65 72 20  operators other 
16db0 74 68 61 6e 20 55 4e 49 4f 4e 20 41 4c 4c 20 77  than UNION ALL w
16dc0 65 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 73  e have to make s
16dd0 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ure that.  ** th
16de0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
16df0 65 20 63 6f 76 65 72 73 20 65 76 65 72 79 20 74  e covers every t
16e00 65 72 6d 20 6f 66 20 74 68 65 20 72 65 73 75 6c  erm of the resul
16e10 74 20 73 65 74 2e 20 20 41 64 64 0a 20 20 2a 2a  t set.  Add.  **
16e20 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 4f 52   terms to the OR
16e30 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 73  DER BY clause as
16e40 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
16e50 0a 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 41 4c  .  if( op!=TK_AL
16e60 4c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  L ){.    for(i=1
16e70 3b 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ; db->mallocFail
16e80 65 64 3d 3d 30 20 26 26 20 69 3c 3d 70 2d 3e 70  ed==0 && i<=p->p
16e90 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
16ea0 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
16eb0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
16ec0 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
16ed0 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (j=0, pItem=pOrd
16ee0 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 4f 72 64 65  erBy->a; j<nOrde
16ef0 72 42 79 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b  rBy; j++, pItem+
16f00 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
16f10 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  rt( pItem->u.x.i
16f20 4f 72 64 65 72 42 79 43 6f 6c 3e 30 20 29 3b 0a  OrderByCol>0 );.
16f30 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
16f40 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
16f50 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ol==i ) break;. 
16f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16f70 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20 29 7b 0a   j==nOrderBy ){.
16f80 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
16f90 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
16fa0 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
16fb0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
16fc0 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
16fd0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
16fe0 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
16ff0 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
17000 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
17010 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 3b 0a  ->u.iValue = i;.
17020 20 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79          pOrderBy
17030 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
17040 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
17050 20 70 4f 72 64 65 72 42 79 2c 20 70 4e 65 77 29   pOrderBy, pNew)
17060 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
17070 72 64 65 72 42 79 20 29 20 70 4f 72 64 65 72 42  rderBy ) pOrderB
17080 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79 2b 2b 5d  y->a[nOrderBy++]
17090 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
170a0 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20   = (u16)i;.     
170b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
170c0 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63  /* Compute the c
170d0 6f 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74  omparison permut
170e0 61 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66  ation and keyinf
170f0 6f 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77  o that is used w
17100 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72  ith.  ** the per
17110 6d 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f  mutation used to
17120 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
17130 65 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20  e next.  ** row 
17140 6f 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73  of results comes
17150 20 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72   from selectA or
17160 20 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20   selectB.  Also 
17170 61 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a  add explicit.  *
17180 2a 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20  * collations to 
17190 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
171a0 75 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61  use terms so tha
171b0 74 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75  t when the subqu
171c0 65 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68  eries.  ** to th
171d0 65 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20  e right and the 
171e0 6c 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74  left are evaluat
171f0 65 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65  ed, they use the
17200 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f   correct.  ** co
17210 6c 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  llation..  */.  
17220 61 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74  aPermute = sqlit
17230 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62  e3DbMallocRaw(db
17240 2c 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f  , sizeof(int)*nO
17250 72 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61  rderBy);.  if( a
17260 50 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73  Permute ){.    s
17270 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
17280 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
17290 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
172a0 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f  OrderBy->a; i<nO
172b0 72 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74  rderBy; i++, pIt
172c0 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  em++){.      ass
172d0 65 72 74 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ert( pItem->u.x.
172e0 69 4f 72 64 65 72 42 79 43 6f 6c 3e 30 0a 20 20  iOrderByCol>0.  
172f0 20 20 20 20 20 20 20 20 26 26 20 70 49 74 65 6d          && pItem
17300 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
17310 6c 3c 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  l<=p->pEList->nE
17320 78 70 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65  xpr );.      aPe
17330 72 6d 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d  rmute[i] = pItem
17340 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
17350 6c 20 2d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  l - 1;.    }.   
17360 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 6d 75 6c   pKeyMerge = mul
17370 74 69 53 65 6c 65 63 74 4f 72 64 65 72 42 79 4b  tiSelectOrderByK
17380 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyInfo(pParse, p
17390 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
173a0 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20 30     pKeyMerge = 0
173b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 74  ;.  }..  /* Reat
173c0 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  tach the ORDER B
173d0 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  Y clause to the 
173e0 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70 2d  query..  */.  p-
173f0 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64  >pOrderBy = pOrd
17400 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d 3e  erBy;.  pPrior->
17410 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
17420 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 50  e3ExprListDup(pP
17430 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65 72  arse->db, pOrder
17440 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41 6c  By, 0);..  /* Al
17450 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20 6f  locate a range o
17460 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 69  f temporary regi
17470 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b 65  sters and the Ke
17480 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20 2a  yInfo needed.  *
17490 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63 20  * for the logic 
174a0 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75 70  that removes dup
174b0 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72 6f  licate result ro
174c0 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ws when the.  **
174d0 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e 49   operator is UNI
174e0 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20 49  ON, EXCEPT, or I
174f0 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e 6f  NTERSECT (but no
17500 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20 20  t UNION ALL)..  
17510 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
17520 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50 72  ALL ){.    regPr
17530 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ev = 0;.  }else{
17540 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  .    int nExpr =
17550 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
17560 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  r;.    assert( n
17570 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20 7c  OrderBy>=nExpr |
17580 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
17590 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72 65  ed );.    regPre
175a0 76 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  v = pParse->nMem
175b0 2b 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  +1;.    pParse->
175c0 6e 4d 65 6d 20 2b 3d 20 6e 45 78 70 72 2b 31 3b  nMem += nExpr+1;
175d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
175e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
175f0 65 67 65 72 2c 20 30 2c 20 72 65 67 50 72 65 76  eger, 0, regPrev
17600 29 3b 0a 20 20 20 20 70 4b 65 79 44 75 70 20 3d  );.    pKeyDup =
17610 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
17620 6c 6c 6f 63 28 64 62 2c 20 6e 45 78 70 72 2c 20  lloc(db, nExpr, 
17630 31 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79  1);.    if( pKey
17640 44 75 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Dup ){.      ass
17650 65 72 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49  ert( sqlite3KeyI
17660 6e 66 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70  nfoIsWriteable(p
17670 4b 65 79 44 75 70 29 20 29 3b 0a 20 20 20 20 20  KeyDup) );.     
17680 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
17690 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
176a0 20 70 4b 65 79 44 75 70 2d 3e 61 43 6f 6c 6c 5b   pKeyDup->aColl[
176b0 69 5d 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  i] = multiSelect
176c0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
176d0 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 70  p, i);.        p
176e0 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
176f0 65 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  er[i] = 0;.     
17700 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 0a 20   }.    }.  }. . 
17710 20 2f 2a 20 53 65 70 61 72 61 74 65 20 74 68 65   /* Separate the
17720 20 6c 65 66 74 20 61 6e 64 20 74 68 65 20 72 69   left and the ri
17730 67 68 74 20 71 75 65 72 79 20 66 72 6f 6d 20 6f  ght query from o
17740 6e 65 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2f 0a  ne another.  */.
17750 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b    p->pPrior = 0;
17760 0a 20 20 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  .  pPrior->pNext
17770 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 52   = 0;.  sqlite3R
17780 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
17790 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 2d  By(pParse, p, p-
177a0 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
177b0 52 22 29 3b 0a 20 20 69 66 28 20 70 50 72 69 6f  R");.  if( pPrio
177c0 72 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29 7b 0a  r->pPrior==0 ){.
177d0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
177e0 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
177f0 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 70  Parse, pPrior, p
17800 50 72 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 2c  Prior->pOrderBy,
17810 20 22 4f 52 44 45 52 22 29 3b 0a 20 20 7d 0a 0a   "ORDER");.  }..
17820 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
17830 20 6c 69 6d 69 74 20 72 65 67 69 73 74 65 72 73   limit registers
17840 20 2a 2f 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d   */.  computeLim
17850 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72  itRegisters(pPar
17860 73 65 2c 20 70 2c 20 6c 61 62 65 6c 45 6e 64 29  se, p, labelEnd)
17870 3b 0a 20 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69  ;.  if( p->iLimi
17880 74 20 26 26 20 6f 70 3d 3d 54 4b 5f 41 4c 4c 20  t && op==TK_ALL 
17890 29 7b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 41  ){.    regLimitA
178a0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
178b0 6d 3b 0a 20 20 20 20 72 65 67 4c 69 6d 69 74 42  m;.    regLimitB
178c0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
178d0 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
178e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
178f0 6f 70 79 2c 20 70 2d 3e 69 4f 66 66 73 65 74 20  opy, p->iOffset 
17900 3f 20 70 2d 3e 69 4f 66 66 73 65 74 2b 31 20 3a  ? p->iOffset+1 :
17910 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a 20 20 20 20   p->iLimit,.    
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
17940 67 4c 69 6d 69 74 41 29 3b 0a 20 20 20 20 73 71  gLimitA);.    sq
17950 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17960 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 72 65 67 4c  v, OP_Copy, regL
17970 69 6d 69 74 41 2c 20 72 65 67 4c 69 6d 69 74 42  imitA, regLimitB
17980 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17990 72 65 67 4c 69 6d 69 74 41 20 3d 20 72 65 67 4c  regLimitA = regL
179a0 69 6d 69 74 42 20 3d 20 30 3b 0a 20 20 7d 0a 20  imitB = 0;.  }. 
179b0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
179c0 74 65 28 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74  te(db, p->pLimit
179d0 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d  );.  p->pLimit =
179e0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
179f0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
17a00 4f 66 66 73 65 74 29 3b 0a 20 20 70 2d 3e 70 4f  Offset);.  p->pO
17a10 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 72 65  ffset = 0;..  re
17a20 67 41 64 64 72 41 20 3d 20 2b 2b 70 50 61 72 73  gAddrA = ++pPars
17a30 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
17a40 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
17a50 6e 4d 65 6d 3b 0a 20 20 72 65 67 4f 75 74 41 20  nMem;.  regOutA 
17a60 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
17a70 3b 0a 20 20 72 65 67 4f 75 74 42 20 3d 20 2b 2b  ;.  regOutB = ++
17a80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
17a90 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
17aa0 74 49 6e 69 74 28 26 64 65 73 74 41 2c 20 53 52  tInit(&destA, SR
17ab0 54 5f 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  T_Coroutine, reg
17ac0 41 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65  AddrA);.  sqlite
17ad0 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
17ae0 26 64 65 73 74 42 2c 20 53 52 54 5f 43 6f 72 6f  &destB, SRT_Coro
17af0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 29  utine, regAddrB)
17b00 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
17b10 20 61 20 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20   a coroutine to 
17b20 65 76 61 6c 75 61 74 65 20 74 68 65 20 53 45 4c  evaluate the SEL
17b30 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
17b40 20 74 68 65 0a 20 20 2a 2a 20 6c 65 66 74 20 6f   the.  ** left o
17b50 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 6f  f the compound o
17b60 70 65 72 61 74 6f 72 20 2d 20 74 68 65 20 22 41  perator - the "A
17b70 22 20 73 65 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20  " select..  */. 
17b80 20 61 64 64 72 53 65 6c 65 63 74 41 20 3d 20 73   addrSelectA = s
17b90 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
17ba0 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20  tAddr(v) + 1;.  
17bb0 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
17bc0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
17bd0 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  tCoroutine, regA
17be0 64 64 72 41 2c 20 30 2c 20 61 64 64 72 53 65 6c  ddrA, 0, addrSel
17bf0 65 63 74 41 29 3b 0a 20 20 56 64 62 65 43 6f 6d  ectA);.  VdbeCom
17c00 6d 65 6e 74 28 28 76 2c 20 22 6c 65 66 74 20 53  ment((v, "left S
17c10 45 4c 45 43 54 22 29 29 3b 0a 20 20 70 50 72 69  ELECT"));.  pPri
17c20 6f 72 2d 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67  or->iLimit = reg
17c30 4c 69 6d 69 74 41 3b 0a 20 20 65 78 70 6c 61 69  LimitA;.  explai
17c40 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75 62  nSetInteger(iSub
17c50 31 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74  1, pParse->iNext
17c60 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71 6c  SelectId);.  sql
17c70 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
17c80 65 2c 20 70 50 72 69 6f 72 2c 20 26 64 65 73 74  e, pPrior, &dest
17c90 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  A);.  sqlite3Vdb
17ca0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e  eAddOp1(v, OP_En
17cb0 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 41  dCoroutine, regA
17cc0 64 64 72 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddrA);.  sqlite3
17cd0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
17ce0 6a 31 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  j1);..  /* Gener
17cf0 61 74 65 20 61 20 63 6f 72 6f 75 74 69 6e 65 20  ate a coroutine 
17d00 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
17d10 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
17d20 20 6f 6e 20 0a 20 20 2a 2a 20 74 68 65 20 72 69   on .  ** the ri
17d30 67 68 74 20 2d 20 74 68 65 20 22 42 22 20 73 65  ght - the "B" se
17d40 6c 65 63 74 0a 20 20 2a 2f 0a 20 20 61 64 64 72  lect.  */.  addr
17d50 53 65 6c 65 63 74 42 20 3d 20 73 71 6c 69 74 65  SelectB = sqlite
17d60 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
17d70 28 76 29 20 2b 20 31 3b 0a 20 20 6a 31 20 3d 20  (v) + 1;.  j1 = 
17d80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17d90 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f  3(v, OP_InitCoro
17da0 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72 42 2c  utine, regAddrB,
17db0 20 30 2c 20 61 64 64 72 53 65 6c 65 63 74 42 29   0, addrSelectB)
17dc0 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28  ;.  VdbeComment(
17dd0 28 76 2c 20 22 72 69 67 68 74 20 53 45 4c 45 43  (v, "right SELEC
17de0 54 22 29 29 3b 0a 20 20 73 61 76 65 64 4c 69 6d  T"));.  savedLim
17df0 69 74 20 3d 20 70 2d 3e 69 4c 69 6d 69 74 3b 0a  it = p->iLimit;.
17e00 20 20 73 61 76 65 64 4f 66 66 73 65 74 20 3d 20    savedOffset = 
17e10 70 2d 3e 69 4f 66 66 73 65 74 3b 0a 20 20 70 2d  p->iOffset;.  p-
17e20 3e 69 4c 69 6d 69 74 20 3d 20 72 65 67 4c 69 6d  >iLimit = regLim
17e30 69 74 42 3b 0a 20 20 70 2d 3e 69 4f 66 66 73 65  itB;.  p->iOffse
17e40 74 20 3d 20 30 3b 20 20 0a 20 20 65 78 70 6c 61  t = 0;  .  expla
17e50 69 6e 53 65 74 49 6e 74 65 67 65 72 28 69 53 75  inSetInteger(iSu
17e60 62 32 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78  b2, pParse->iNex
17e70 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 73 71  tSelectId);.  sq
17e80 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
17e90 73 65 2c 20 70 2c 20 26 64 65 73 74 42 29 3b 0a  se, p, &destB);.
17ea0 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 73 61    p->iLimit = sa
17eb0 76 65 64 4c 69 6d 69 74 3b 0a 20 20 70 2d 3e 69  vedLimit;.  p->i
17ec0 4f 66 66 73 65 74 20 3d 20 73 61 76 65 64 4f 66  Offset = savedOf
17ed0 66 73 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 56  fset;.  sqlite3V
17ee0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
17ef0 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65  EndCoroutine, re
17f00 67 41 64 64 72 42 29 3b 0a 0a 20 20 2f 2a 20 47  gAddrB);..  /* G
17f10 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f 75  enerate a subrou
17f20 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
17f30 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  s the current ro
17f40 77 20 6f 66 20 74 68 65 20 41 0a 20 20 2a 2a 20  w of the A.  ** 
17f50 73 65 6c 65 63 74 20 61 73 20 74 68 65 20 6e 65  select as the ne
17f60 78 74 20 6f 75 74 70 75 74 20 72 6f 77 20 6f 66  xt output row of
17f70 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 73 65   the compound se
17f80 6c 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 56 64 62  lect..  */.  Vdb
17f90 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c  eNoopComment((v,
17fa0 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65   "Output routine
17fb0 20 66 6f 72 20 41 22 29 29 3b 0a 20 20 61 64 64   for A"));.  add
17fc0 72 4f 75 74 41 20 3d 20 67 65 6e 65 72 61 74 65  rOutA = generate
17fd0 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
17fe0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
17ff0 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
18000 73 74 41 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stA, pDest, regO
18010 75 74 41 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utA,.           
18020 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
18030 4b 65 79 44 75 70 2c 20 6c 61 62 65 6c 45 6e 64  KeyDup, labelEnd
18040 29 3b 0a 20 20 0a 20 20 2f 2a 20 47 65 6e 65 72  );.  .  /* Gener
18050 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
18060 20 74 68 61 74 20 6f 75 74 70 75 74 73 20 74 68   that outputs th
18070 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 6f 66  e current row of
18080 20 74 68 65 20 42 0a 20 20 2a 2a 20 73 65 6c 65   the B.  ** sele
18090 63 74 20 61 73 20 74 68 65 20 6e 65 78 74 20 6f  ct as the next o
180a0 75 74 70 75 74 20 72 6f 77 20 6f 66 20 74 68 65  utput row of the
180b0 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
180c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d  ..  */.  if( op=
180d0 3d 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54  =TK_ALL || op==T
180e0 4b 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 56  K_UNION ){.    V
180f0 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28  dbeNoopComment((
18100 76 2c 20 22 4f 75 74 70 75 74 20 72 6f 75 74 69  v, "Output routi
18110 6e 65 20 66 6f 72 20 42 22 29 29 3b 0a 20 20 20  ne for B"));.   
18120 20 61 64 64 72 4f 75 74 42 20 3d 20 67 65 6e 65   addrOutB = gene
18130 72 61 74 65 4f 75 74 70 75 74 53 75 62 72 6f 75  rateOutputSubrou
18140 74 69 6e 65 28 70 50 61 72 73 65 2c 0a 20 20 20  tine(pParse,.   
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
18160 20 26 64 65 73 74 42 2c 20 70 44 65 73 74 2c 20   &destB, pDest, 
18170 72 65 67 4f 75 74 42 2c 0a 20 20 20 20 20 20 20  regOutB,.       
18180 20 20 20 20 20 20 20 20 20 20 72 65 67 50 72 65            regPre
18190 76 2c 20 70 4b 65 79 44 75 70 2c 20 6c 61 62 65  v, pKeyDup, labe
181a0 6c 45 6e 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  lEnd);.  }.  sql
181b0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
181c0 28 70 4b 65 79 44 75 70 29 3b 0a 0a 20 20 2f 2a  (pKeyDup);..  /*
181d0 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
181e0 6f 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68  outine to run wh
181f0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66  en the results f
18200 72 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a  rom select A.  *
18210 2a 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20  * are exhausted 
18220 61 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e  and only data in
18230 20 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e   select B remain
18240 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  s..  */.  if( op
18250 3d 3d 54 4b 5f 45 58 43 45 50 54 20 7c 7c 20 6f  ==TK_EXCEPT || o
18260 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43 54 20  p==TK_INTERSECT 
18270 29 7b 0a 20 20 20 20 61 64 64 72 45 6f 66 41 5f  ){.    addrEofA_
18280 6e 6f 42 20 3d 20 61 64 64 72 45 6f 66 41 20 3d  noB = addrEofA =
18290 20 6c 61 62 65 6c 45 6e 64 3b 0a 20 20 7d 65 6c   labelEnd;.  }el
182a0 73 65 7b 20 20 0a 20 20 20 20 56 64 62 65 4e 6f  se{  .    VdbeNo
182b0 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65  opComment((v, "e
182c0 6f 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22  of-A subroutine"
182d0 29 29 3b 0a 20 20 20 20 61 64 64 72 45 6f 66 41  ));.    addrEofA
182e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
182f0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
18300 2c 20 72 65 67 4f 75 74 42 2c 20 61 64 64 72 4f  , regOutB, addrO
18310 75 74 42 29 3b 0a 20 20 20 20 61 64 64 72 45 6f  utB);.    addrEo
18320 66 41 5f 6e 6f 42 20 3d 20 73 71 6c 69 74 65 33  fA_noB = sqlite3
18330 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18340 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42  _Yield, regAddrB
18350 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20 20  , labelEnd);.   
18360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18380 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
18390 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
183a0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
183b0 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 41  oto, 0, addrEofA
183c0 29 3b 0a 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  );.    p->nSelec
183d0 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
183e0 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 7d 0a  nSelectRow;.  }.
183f0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
18400 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 72   subroutine to r
18410 75 6e 20 77 68 65 6e 20 74 68 65 20 72 65 73 75  un when the resu
18420 6c 74 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 20  lts from select 
18430 42 0a 20 20 2a 2a 20 61 72 65 20 65 78 68 61 75  B.  ** are exhau
18440 73 74 65 64 20 61 6e 64 20 6f 6e 6c 79 20 64 61  sted and only da
18450 74 61 20 69 6e 20 73 65 6c 65 63 74 20 41 20 72  ta in select A r
18460 65 6d 61 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  emains..  */.  i
18470 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53  f( op==TK_INTERS
18480 45 43 54 20 29 7b 0a 20 20 20 20 61 64 64 72 45  ECT ){.    addrE
18490 6f 66 42 20 3d 20 61 64 64 72 45 6f 66 41 3b 0a  ofB = addrEofA;.
184a0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 6c 65      if( p->nSele
184b0 63 74 52 6f 77 20 3e 20 70 50 72 69 6f 72 2d 3e  ctRow > pPrior->
184c0 6e 53 65 6c 65 63 74 52 6f 77 20 29 20 70 2d 3e  nSelectRow ) p->
184d0 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 50 72  nSelectRow = pPr
184e0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
184f0 0a 20 20 7d 65 6c 73 65 7b 20 20 0a 20 20 20 20  .  }else{  .    
18500 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
18510 28 76 2c 20 22 65 6f 66 2d 42 20 73 75 62 72 6f  (v, "eof-B subro
18520 75 74 69 6e 65 22 29 29 3b 0a 20 20 20 20 61 64  utine"));.    ad
18530 64 72 45 6f 66 42 20 3d 20 73 71 6c 69 74 65 33  drEofB = sqlite3
18540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18550 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75 74 41 2c  _Gosub, regOutA,
18560 20 61 64 64 72 4f 75 74 41 29 3b 0a 20 20 20 20   addrOutA);.    
18570 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18580 32 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72  2(v, OP_Yield, r
18590 65 67 41 64 64 72 41 2c 20 6c 61 62 65 6c 45 6e  egAddrA, labelEn
185a0 64 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  d); VdbeCoverage
185b0 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
185c0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
185d0 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f  _Goto, 0, addrEo
185e0 66 42 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  fB);.  }..  /* G
185f0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
18600 68 61 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20  handle the case 
18610 6f 66 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64  of A<B.  */.  Vd
18620 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76  beNoopComment((v
18630 2c 20 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75  , "A-lt-B subrou
18640 74 69 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41  tine"));.  addrA
18650 6c 74 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ltB = sqlite3Vdb
18660 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
18670 73 75 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64  sub, regOutA, ad
18680 64 72 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74  drOutA);.  sqlit
18690 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
186a0 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64  OP_Yield, regAdd
186b0 72 41 2c 20 61 64 64 72 45 6f 66 41 29 3b 20 56  rA, addrEofA); V
186c0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
186d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
186e0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
186f0 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 0a  0, labelCmpr);..
18700 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
18710 64 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  de to handle the
18720 20 63 61 73 65 20 6f 66 20 41 3d 3d 42 0a 20 20   case of A==B.  
18730 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
18740 41 4c 4c 20 29 7b 0a 20 20 20 20 61 64 64 72 41  ALL ){.    addrA
18750 65 71 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a  eqB = addrAltB;.
18760 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
18770 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a  TK_INTERSECT ){.
18780 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 20 61      addrAeqB = a
18790 64 64 72 41 6c 74 42 3b 0a 20 20 20 20 61 64 64  ddrAltB;.    add
187a0 72 41 6c 74 42 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rAltB++;.  }else
187b0 7b 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f  {.    VdbeNoopCo
187c0 6d 6d 65 6e 74 28 28 76 2c 20 22 41 2d 65 71 2d  mment((v, "A-eq-
187d0 42 20 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b  B subroutine"));
187e0 0a 20 20 20 20 61 64 64 72 41 65 71 42 20 3d 0a  .    addrAeqB =.
187f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
18800 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
18810 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
18820 72 45 6f 66 41 29 3b 20 56 64 62 65 43 6f 76 65  rEofA); VdbeCove
18830 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
18840 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
18850 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
18860 62 65 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20  belCmpr);.  }.. 
18870 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
18880 65 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  e to handle the 
18890 63 61 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f  case of A>B.  */
188a0 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  .  VdbeNoopComme
188b0 6e 74 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73  nt((v, "A-gt-B s
188c0 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20  ubroutine"));.  
188d0 61 64 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74  addrAgtB = sqlit
188e0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
188f0 72 28 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  r(v);.  if( op==
18900 54 4b 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_ALL || op==TK
18910 5f 55 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  _UNION ){.    sq
18920 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
18930 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
18940 4f 75 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b  OutB, addrOutB);
18950 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
18960 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59  beAddOp2(v, OP_Y
18970 69 65 6c 64 2c 20 72 65 67 41 64 64 72 42 2c 20  ield, regAddrB, 
18980 61 64 64 72 45 6f 66 42 29 3b 20 56 64 62 65 43  addrEofB); VdbeC
18990 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71  overage(v);.  sq
189a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
189b0 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c  v, OP_Goto, 0, l
189c0 61 62 65 6c 43 6d 70 72 29 3b 0a 0a 20 20 2f 2a  abelCmpr);..  /*
189d0 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e 73 20   This code runs 
189e0 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  once to initiali
189f0 7a 65 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 20  ze everything.. 
18a00 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
18a10 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29  eJumpHere(v, j1)
18a20 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
18a30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp2(v, OP_Yiel
18a40 64 2c 20 72 65 67 41 64 64 72 41 2c 20 61 64 64  d, regAddrA, add
18a50 72 45 6f 66 41 5f 6e 6f 42 29 3b 20 56 64 62 65  rEofA_noB); Vdbe
18a60 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
18a70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
18a80 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65  (v, OP_Yield, re
18a90 67 41 64 64 72 42 2c 20 61 64 64 72 45 6f 66 42  gAddrB, addrEofB
18aa0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
18ab0 76 29 3b 0a 0a 20 20 2f 2a 20 49 6d 70 6c 65 6d  v);..  /* Implem
18ac0 65 6e 74 20 74 68 65 20 6d 61 69 6e 20 6d 65 72  ent the main mer
18ad0 67 65 20 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73  ge loop.  */.  s
18ae0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
18af0 65 4c 61 62 65 6c 28 76 2c 20 6c 61 62 65 6c 43  eLabel(v, labelC
18b00 6d 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  mpr);.  sqlite3V
18b10 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
18b20 50 65 72 6d 75 74 61 74 69 6f 6e 2c 20 30 2c 20  Permutation, 0, 
18b30 30 2c 20 30 2c 20 28 63 68 61 72 2a 29 61 50 65  0, 0, (char*)aPe
18b40 72 6d 75 74 65 2c 20 50 34 5f 49 4e 54 41 52 52  rmute, P4_INTARR
18b50 41 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  AY);.  sqlite3Vd
18b60 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43  beAddOp4(v, OP_C
18b70 6f 6d 70 61 72 65 2c 20 64 65 73 74 41 2e 69 53  ompare, destA.iS
18b80 64 73 74 2c 20 64 65 73 74 42 2e 69 53 64 73 74  dst, destB.iSdst
18b90 2c 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 20 20  , nOrderBy,.    
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79       (char*)pKey
18bc0 4d 65 72 67 65 2c 20 50 34 5f 4b 45 59 49 4e 46  Merge, P4_KEYINF
18bd0 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  O);.  sqlite3Vdb
18be0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
18bf0 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20 20  LAG_PERMUTE);.  
18c00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18c10 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61 64  3(v, OP_Jump, ad
18c20 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71 42  drAltB, addrAeqB
18c30 2c 20 61 64 64 72 41 67 74 42 29 3b 20 56 64 62  , addrAgtB); Vdb
18c40 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a 20  eCoverage(v);.. 
18c50 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20   /* Jump to the 
18c60 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
18c70 64 65 72 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  der to terminate
18c80 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f   the query..  */
18c90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
18ca0 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c 61  solveLabel(v, la
18cb0 62 65 6c 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20 53  belEnd);..  /* S
18cc0 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  et the number of
18cd0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 0a   output columns.
18ce0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74    */.  if( pDest
18cf0 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74  ->eDest==SRT_Out
18d00 70 75 74 20 29 7b 0a 20 20 20 20 53 65 6c 65 63  put ){.    Selec
18d10 74 20 2a 70 46 69 72 73 74 20 3d 20 70 50 72 69  t *pFirst = pPri
18d20 6f 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  or;.    while( p
18d30 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20  First->pPrior ) 
18d40 70 46 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d  pFirst = pFirst-
18d50 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 67 65 6e  >pPrior;.    gen
18d60 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  erateColumnNames
18d70 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46 69 72  (pParse, 0, pFir
18d80 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 7d  st->pEList);.  }
18d90 0a 0a 20 20 2f 2a 20 52 65 61 73 73 65 6d 62 6c  ..  /* Reassembl
18da0 79 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 71  y the compound q
18db0 75 65 72 79 20 73 6f 20 74 68 61 74 20 69 74 20  uery so that it 
18dc0 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 63 6f  will be freed co
18dd0 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 62 79 20  rrectly.  ** by 
18de0 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
18df0 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tion */.  if( p-
18e00 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 73  >pPrior ){.    s
18e10 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
18e20 74 65 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72  te(db, p->pPrior
18e30 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 69  );.  }.  p->pPri
18e40 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 70  or = pPrior;.  p
18e50 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
18e60 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20 20  ;..  /*** TBD:  
18e70 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69 6e  Insert subroutin
18e80 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73 65  e calls to close
18e90 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63 6f   cursors on inco
18ea0 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73 75  mplete.  **** su
18eb0 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a 20  bqueries ****/. 
18ec0 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69 74   explainComposit
18ed0 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70 2c  e(pParse, p->op,
18ee0 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20 30   iSub1, iSub2, 0
18ef0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18f00 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
18f10 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
18f20 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
18f30 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
18f40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
18f50 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65 63  )./* Forward Dec
18f60 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  larations */.sta
18f70 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45 78  tic void substEx
18f80 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a 2c  prList(sqlite3*,
18f90 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74 2c   ExprList*, int,
18fa0 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
18fb0 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53 65  tic void substSe
18fc0 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20 53  lect(sqlite3*, S
18fd0 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45 78  elect *, int, Ex
18fe0 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a 2a  prList *);../*.*
18ff0 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20 74  * Scan through t
19000 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
19010 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65 76  xpr.  Replace ev
19020 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ery reference to
19030 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  .** a column in 
19040 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54 61  table number iTa
19050 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79 20  ble with a copy 
19060 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74  of the iColumn-t
19070 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70 45  h.** entry in pE
19080 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61 76  List.  (But leav
19090 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
190a0 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e  the ROWID column
190b0 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 29   .** unchanged.)
190c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
190d0 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ine is part of t
190e0 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70 72  he flattening pr
190f0 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62 71  ocedure.  A subq
19100 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72 65  uery.** whose re
19110 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66 69  sult set is defi
19120 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61 70  ned by pEList ap
19130 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20 69  pears as entry i
19140 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63 6c  n the.** FROM cl
19150 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
19160 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 56   such that the V
19170 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69 67  DBE cursor assig
19180 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20 46  ned to that.** F
19190 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79  ORM clause entry
191a0 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68 69   is iTable.  Thi
191b0 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20 74  s routine make t
191c0 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a 2a  he necessary .**
191d0 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78 70   changes to pExp
191e0 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65 66  r so that it ref
191f0 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ers directly to 
19200 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c 65  the source table
19210 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75  .** of the subqu
19220 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20 72  ery rather the r
19230 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
19240 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73 74   subquery..*/.st
19250 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73 74  atic Expr *subst
19260 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33 20  Expr(.  sqlite3 
19270 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 52  *db,        /* R
19280 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72 72  eport malloc err
19290 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e 6e  ors to this conn
192a0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ection */.  Expr
192b0 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
192c0 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63 68  /* Expr in which
192d0 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f 63   substitution oc
192e0 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54  curs */.  int iT
192f0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  able,         /*
19300 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75 62   Table to be sub
19310 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45 78  stituted */.  Ex
19320 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20  prList *pEList  
19330 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
19340 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 29  expressions */.)
19350 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
19360 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
19370 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
19380 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72  _COLUMN && pExpr
19390 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65  ->iTable==iTable
193a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70   ){.    if( pExp
193b0 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a  r->iColumn<0 ){.
193c0 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
193d0 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  = TK_NULL;.    }
193e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72  else{.      Expr
193f0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61 73   *pNew;.      as
19400 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
19410 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  && pExpr->iColum
19420 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  n<pEList->nExpr 
19430 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19440 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30   pExpr->pLeft==0
19450 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
19460 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4e  t==0 );.      pN
19470 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
19480 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d 3e  Dup(db, pEList->
19490 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  a[pExpr->iColumn
194a0 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  ].pExpr, 0);.   
194b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
194c0 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
194d0 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70  .      pExpr = p
194e0 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  New;.    }.  }el
194f0 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  se{.    pExpr->p
19500 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70 72  Left = substExpr
19510 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  (db, pExpr->pLef
19520 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
19530 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  t);.    pExpr->p
19540 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78 70  Right = substExp
19550 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69  r(db, pExpr->pRi
19560 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ght, iTable, pEL
19570 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45 78  ist);.    if( Ex
19580 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
19590 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
195a0 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73  t) ){.      subs
195b0 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78 70  tSelect(db, pExp
195c0 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69 54  r->x.pSelect, iT
195d0 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
195e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
195f0 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64 62  substExprList(db
19600 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  , pExpr->x.pList
19610 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
19620 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
19630 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 73  eturn pExpr;.}.s
19640 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74  tatic void subst
19650 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c 69  ExprList(.  sqli
19660 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
19670 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c 6f   /* Report mallo
19680 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a 2f  c errors here */
19690 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
196a0 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  st,     /* List 
196b0 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20 77  to scan and in w
196c0 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75 62  hich to make sub
196d0 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69 6e  stitutes */.  in
196e0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
196f0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
19700 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a 2f  e substituted */
19710 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
19720 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73 74  ist     /* Subst
19730 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f 0a  itute values */.
19740 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
19750 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
19760 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
19770 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
19780 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  i++){.    pList-
19790 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73 75  >a[i].pExpr = su
197a0 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69 73  bstExpr(db, pLis
197b0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 69  t->a[i].pExpr, i
197c0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
197d0 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
197e0 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a 20  d substSelect(. 
197f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
19800 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20        /* Report 
19810 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68 65  malloc errors he
19820 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
19830 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
19840 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
19850 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61 6b   in which to mak
19860 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20  e substitutions 
19870 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
19880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
19890 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63 65  le to be replace
198a0 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
198b0 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20 53  *pEList     /* S
198c0 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65 73  ubstitute values
198d0 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
198e0 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63 74   *pSrc;.  struct
198f0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19900 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
19910 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e   if( !p ) return
19920 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
19930 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c  t(db, p->pEList,
19940 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29   iTable, pEList)
19950 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69 73  ;.  substExprLis
19960 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42  t(db, p->pGroupB
19970 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  y, iTable, pELis
19980 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c  t);.  substExprL
19990 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64 65  ist(db, p->pOrde
199a0 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  rBy, iTable, pEL
199b0 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76 69  ist);.  p->pHavi
199c0 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28 64  ng = substExpr(d
199d0 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20 69  b, p->pHaving, i
199e0 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
199f0 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73 75    p->pWhere = su
19a00 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e 70  bstExpr(db, p->p
19a10 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20 70  Where, iTable, p
19a20 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74 53  EList);.  substS
19a30 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50 72  elect(db, p->pPr
19a40 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c  ior, iTable, pEL
19a50 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20 70  ist);.  pSrc = p
19a60 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
19a70 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45 76  ( pSrc );  /* Ev
19a80 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20 31  en for (SELECT 1
19a90 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63 21  ) we have: pSrc!
19aa0 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53 72  =0 but pSrc->nSr
19ab0 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41 4c  c==0 */.  if( AL
19ac0 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20 20  WAYS(pSrc) ){.  
19ad0 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
19ae0 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d 3e  rc, pItem=pSrc->
19af0 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74  a; i>0; i--, pIt
19b00 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75 62  em++){.      sub
19b10 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49 74  stSelect(db, pIt
19b20 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54 61  em->pSelect, iTa
19b30 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20 20  ble, pEList);.  
19b40 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
19b50 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
19b60 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
19b70 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  Y) || !defined(S
19b80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
19b90 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
19ba0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
19bb0 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66 69  BQUERY) || !defi
19bc0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
19bd0 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73  VIEW)./*.** This
19be0 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74   routine attempt
19bf0 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75 62  s to flatten sub
19c00 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65 72  queries as a per
19c10 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a  formance optimiz
19c20 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ation..** This r
19c30 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31  outine returns 1
19c40 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68 61   if it makes cha
19c50 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e 6f  nges and 0 if no
19c60 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63 75   flattening occu
19c70 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e 64  rs..**.** To und
19c80 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e 63  erstand the conc
19c90 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69 6e  ept of flattenin
19ca0 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  g, consider the 
19cb0 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75 65  following.** que
19cc0 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ry:.**.**     SE
19cd0 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45 4c  LECT a FROM (SEL
19ce0 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f  ECT x+y AS a FRO
19cf0 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30  M t1 WHERE z<100
19d00 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a 2a  ) WHERE a>5.**.*
19d10 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77 61  * The default wa
19d20 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  y of implementin
19d30 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73 20  g this query is 
19d40 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a 2a  to execute the.*
19d50 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73 74  * subquery first
19d60 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
19d70 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d 70  esults in a temp
19d80 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68 65  orary table, the
19d90 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75 74  n.** run the out
19da0 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61 74  er query on that
19db0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
19dc0 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65 73  .  This requires
19dd0 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20 6f   two.** passes o
19de0 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20 46  ver the data.  F
19df0 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63 61  urthermore, beca
19e00 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  use the temporar
19e10 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20 6e  y table.** has n
19e20 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20 57  o indices, the W
19e30 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20 74  HERE clause on t
19e40 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 63  he outer query c
19e50 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74 69  annot be.** opti
19e60 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mized..**.** Thi
19e70 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
19e80 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71 75  ts to rewrite qu
19e90 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74 68  eries such as th
19ea0 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a 20  e above into.** 
19eb0 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73 65  a single flat se
19ec0 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73 3a  lect, like this:
19ed0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
19ee0 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d 20  T x+y AS a FROM 
19ef0 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20 41  t1 WHERE z<100 A
19f00 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ND a>5.**.** The
19f10 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
19f20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66 69  for this simpifi
19f30 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68 65  cation gives the
19f40 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a 20   same result.** 
19f50 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f 20  but only has to 
19f60 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f 6e  scan the data on
19f70 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73 65  ce.  And because
19f80 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20 0a   indices might .
19f90 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65 20  ** exist on the 
19fa0 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d 70  table t1, a comp
19fb0 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68 65  lete scan of the
19fc0 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a 2a   data might be.*
19fd0 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a 2a  * avoided..**.**
19fe0 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 6f   Flattening is o
19ff0 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69 66  nly attempted if
1a000 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
1a010 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
1a020 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68 65  **.**   (1)  The
1a030 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74 68   subquery and th
1a040 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f  e outer query do
1a050 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61 67   not both use ag
1a060 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1a070 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71 75    (2)  The subqu
1a080 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67  ery is not an ag
1a090 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20 6f  gregate or the o
1a0a0 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f  uter query is no
1a0b0 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  t a join..**.** 
1a0c0 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71 75    (3)  The subqu
1a0d0 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20 72  ery is not the r
1a0e0 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20  ight operand of 
1a0f0 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f 69  a left outer joi
1a100 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72 69  n.**        (Ori
1a110 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20 23  ginally ticket #
1a120 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65 6e  306.  Strengthen
1a130 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 33  ed by ticket #33
1a140 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29 20  00).**.**   (4) 
1a150 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69 73   The subquery is
1a160 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a 2a   not DISTINCT..*
1a170 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20 6f  *.**  (**)  At o
1a180 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69 63  ne point restric
1a190 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28 35  tions (4) and (5
1a1a0 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62 73  ) defined a subs
1a1b0 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a 2a  et of DISTINCT.*
1a1c0 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75 65  *        sub-que
1a1d0 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20 65  ries that were e
1a1e0 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68 69  xcluded from thi
1a1f0 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  s optimization. 
1a200 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a 20  Restriction .** 
1a210 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20 73         (4) has s
1a220 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e 64  ince been expand
1a230 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61 6c  ed to exclude al
1a240 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71 75  l DISTINCT subqu
1a250 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  eries..**.**   (
1a260 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  6)  The subquery
1a270 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 67   does not use ag
1a280 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65 20  gregates or the 
1a290 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
1a2a0 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49 53  ot.**        DIS
1a2b0 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 28  TINCT..**.**   (
1a2c0 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  7)  The subquery
1a2d0 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61 75   has a FROM clau
1a2e0 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72 20  se.  TODO:  For 
1a2f0 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68 6f  subqueries witho
1a300 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20 46  ut.**        A F
1a310 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e 73  ROM clause, cons
1a320 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46 52  ider adding a FR
1a330 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74 68  OM close with th
1a340 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20 20  e special.**    
1a350 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74 65      table sqlite
1a360 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73 69  _once that consi
1a370 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  sts of a single 
1a380 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  row containing a
1a390 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67 6c  .**        singl
1a3a0 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20  e NULL..**.**   
1a3b0 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (8)  The subquer
1a3c0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
1a3d0 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
1a3e0 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20 61  r query is not a
1a3f0 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 28   join..**.**   (
1a400 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72 79  9)  The subquery
1a410 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c 49   does not use LI
1a420 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65 72  MIT or the outer
1a430 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20   query does not 
1a440 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61 67  use.**        ag
1a450 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
1a460 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71 75   (10)  The subqu
1a470 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
1a480 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20 74   aggregates or t
1a490 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1a4a0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
1a4b0 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a    use LIMIT..**.
1a4c0 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73 75  **  (11)  The su
1a4d0 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20 6f  bquery and the o
1a4e0 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e 6f  uter query do no
1a4f0 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44 45  t both have ORDE
1a500 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  R BY clauses..**
1a510 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20 69  .**  (**)  Not i
1a520 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75 62  mplemented.  Sub
1a530 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74 72  sumed into restr
1a540 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61 73  iction (3).  Was
1a550 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 20   previously.**  
1a560 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74 65        a separate
1a570 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65 72   restriction der
1a580 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b 65  iving from ticke
1a590 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20 28  t #350..**.**  (
1a5a0 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65 72  13)  The subquer
1a5b0 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65 72  y and outer quer
1a5c0 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73  y do not both us
1a5d0 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20 20  e LIMIT..**.**  
1a5e0 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75 65  (14)  The subque
1a5f0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
1a600 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 28  OFFSET..**.**  (
1a610 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20 71  15)  The outer q
1a620 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72 74  uery is not part
1a630 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   of a compound s
1a640 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a 20  elect or the.** 
1a650 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79 20         subquery 
1a660 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 20  does not have a 
1a670 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a 2a  LIMIT clause..**
1a680 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69 63          (See tic
1a690 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74 69  ket #2339 and ti
1a6a0 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34 34  cket [02a8e81d44
1a6b0 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29 20  ])..**.**  (16) 
1a6c0 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   The outer query
1a6d0 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72 65   is not an aggre
1a6e0 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62 71  gate or the subq
1a6f0 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20 20  uery does.**    
1a700 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20      not contain 
1a710 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63 6b  ORDER BY.  (Tick
1a720 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73 20  et #2942)  This 
1a730 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74 74  used to not matt
1a740 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e 74  er.**        unt
1a750 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65 64  il we introduced
1a760 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63 61   the group_conca
1a770 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 0a  t() function.  .
1a780 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68 65  **.**  (17)  The
1a790 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e 6f   sub-query is no
1a7a0 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  t a compound sel
1a7b0 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61 20  ect, or it is a 
1a7c0 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20 20  UNION ALL .**   
1a7d0 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63 6c       compound cl
1a7e0 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e 74  ause made up ent
1a7f0 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67 67  irely of non-agg
1a800 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c 20  regate queries, 
1a810 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  and .**        t
1a820 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 3a  he parent query:
1a830 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1a840 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66 20  * is not itself 
1a850 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75  part of a compou
1a860 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20 20  nd select,.**   
1a870 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74 20         * is not 
1a880 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72 20  an aggregate or 
1a890 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c 20  DISTINCT query, 
1a8a0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
1a8b0 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e 0a  * is not a join.
1a8c0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68 65  **.**        The
1a8d0 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62 2d   parent and sub-
1a8e0 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61 69  query may contai
1a8f0 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 2e  n WHERE clauses.
1a900 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 20   Subject to.**  
1a910 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31 29        rules (11)
1a920 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29 2c  , (13) and (14),
1a930 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20 63   they may also c
1a940 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59 2c  ontain ORDER BY,
1a950 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49 54  .**        LIMIT
1a960 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
1a970 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75 65  ses.  The subque
1a980 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e  ry cannot use an
1a990 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20 20  y compound.**   
1a9a0 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f 74       operator ot
1a9b0 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20 41  her than UNION A
1a9c0 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20 74  LL because all t
1a9d0 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75 6e  he other compoun
1a9e0 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65 72  d.**        oper
1a9f0 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69 6d  ators have an im
1aa00 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20 77  plied DISTINCT w
1aa10 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f 77  hich is disallow
1aa20 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20 20  ed by.**        
1aa30 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29 2e  restriction (4).
1aa40 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41 6c  .**.**        Al
1aa50 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  so, each compone
1aa60 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  nt of the sub-qu
1aa70 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e 20  ery must return 
1aa80 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
1aa90 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65 73  **        of res
1aaa0 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68 69  ult columns. Thi
1aab0 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  s is actually a 
1aac0 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72 20  requirement for 
1aad0 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20  any compound.** 
1aae0 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73 74         SELECT st
1aaf0 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c 6c  atement, but all
1ab00 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20 64   the code here d
1ab10 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72 65  oes is make sure
1ab20 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20 20   that no.**     
1ab30 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61 6c     such (illegal
1ab40 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 66  ) sub-query is f
1ab50 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63 61  lattened. The ca
1ab60 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63 74  ller will detect
1ab70 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 73   the.**        s
1ab80 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64 20  yntax error and 
1ab90 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c 65  return a detaile
1aba0 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  d message..**.**
1abb0 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20 73    (18)  If the s
1abc0 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63 6f  ub-query is a co
1abd0 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20 74  mpound select, t
1abe0 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  hen all terms of
1abf0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 4f   the.**        O
1ac00 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20 6f  RDER by clause o
1ac10 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75 73  f the parent mus
1ac20 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66 65  t be simple refe
1ac30 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20 20  rences to .**   
1ac40 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20       columns of 
1ac50 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a 2a  the sub-query..*
1ac60 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65 20  *.**  (19)  The 
1ac70 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e 6f  subquery does no
1ac80 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20 74  t use LIMIT or t
1ac90 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
1aca0 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 20  oes not.**      
1acb0 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20 63    have a WHERE c
1acc0 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32  lause..**.**  (2
1acd0 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d 71  0)  If the sub-q
1ace0 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75  uery is a compou
1acf0 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  nd select, then 
1ad00 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65 0a  it must not use.
1ad10 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52 44  **        an ORD
1ad20 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ER BY clause.  T
1ad30 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57 65  icket #3773.  We
1ad40 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68 69   could relax thi
1ad50 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  s constraint.** 
1ad60 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74 20         somewhat 
1ad70 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20 74  by saying that t
1ad80 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
1ad90 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1ada0 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 61  must.**        a
1adb0 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69 66  ppear as unmodif
1adc0 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ied result colum
1add0 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20  ns in the outer 
1ade0 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a 2a  query.  But we.*
1adf0 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f 74  *        have ot
1ae00 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  her optimization
1ae10 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65 61  s in mind to dea
1ae20 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73 65  l with that case
1ae30 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20 54  ..**.**  (21)  T
1ae40 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65 73  he subquery does
1ae50 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f   not use LIMIT o
1ae60 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72  r the outer quer
1ae70 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  y is not.**     
1ae80 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28 53     DISTINCT.  (S
1ae90 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65 31  ee ticket [752e1
1aea0 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20  646fc])..**.**  
1aeb0 28 32 32 29 20 20 54 68 65 20 73 75 62 71 75 65  (22)  The subque
1aec0 72 79 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  ry is not a recu
1aed0 72 73 69 76 65 20 43 54 45 2e 0a 2a 2a 0a 2a 2a  rsive CTE..**.**
1aee0 20 20 28 32 33 29 20 20 54 68 65 20 70 61 72 65    (23)  The pare
1aef0 6e 74 20 69 73 20 6e 6f 74 20 61 20 72 65 63 75  nt is not a recu
1af00 72 73 69 76 65 20 43 54 45 2c 20 6f 72 20 74 68  rsive CTE, or th
1af10 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
1af20 6f 74 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 63  ot a.**        c
1af30 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 20 54  ompound query. T
1af40 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 20  his restriction 
1af50 69 73 20 62 65 63 61 75 73 65 20 74 72 61 6e 73  is because trans
1af60 66 6f 72 6d 69 6e 67 20 74 68 65 0a 2a 2a 20 20  forming the.**  
1af70 20 20 20 20 20 20 70 61 72 65 6e 74 20 74 6f 20        parent to 
1af80 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79  a compound query
1af90 20 63 6f 6e 66 75 73 65 73 20 74 68 65 20 63 6f   confuses the co
1afa0 64 65 20 74 68 61 74 20 68 61 6e 64 6c 65 73 0a  de that handles.
1afb0 2a 2a 20 20 20 20 20 20 20 20 72 65 63 75 72 73  **        recurs
1afc0 69 76 65 20 71 75 65 72 69 65 73 20 69 6e 20 6d  ive queries in m
1afd0 75 6c 74 69 53 65 6c 65 63 74 28 29 2e 0a 2a 2a  ultiSelect()..**
1afe0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 72  .**.** In this r
1aff0 6f 75 74 69 6e 65 2c 20 74 68 65 20 22 70 22 20  outine, the "p" 
1b000 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
1b010 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 75  ointer to the ou
1b020 74 65 72 20 71 75 65 72 79 2e 0a 2a 2a 20 54 68  ter query..** Th
1b030 65 20 73 75 62 71 75 65 72 79 20 69 73 20 70 2d  e subquery is p-
1b040 3e 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e  >pSrc->a[iFrom].
1b050 20 20 69 73 41 67 67 20 69 73 20 74 72 75 65 20    isAgg is true 
1b060 69 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  if the outer que
1b070 72 79 0a 2a 2a 20 75 73 65 73 20 61 67 67 72 65  ry.** uses aggre
1b080 67 61 74 65 73 20 61 6e 64 20 73 75 62 71 75 65  gates and subque
1b090 72 79 49 73 41 67 67 20 69 73 20 74 72 75 65 20  ryIsAgg is true 
1b0a0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
1b0b0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 73 2e  uses aggregates.
1b0c0 0a 2a 2a 0a 2a 2a 20 49 66 20 66 6c 61 74 74 65  .**.** If flatte
1b0d0 6e 69 6e 67 20 69 73 20 6e 6f 74 20 61 74 74 65  ning is not atte
1b0e0 6d 70 74 65 64 2c 20 74 68 69 73 20 72 6f 75 74  mpted, this rout
1b0f0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 61  ine is a no-op a
1b100 6e 64 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a  nd returns 0..**
1b110 20 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69   If flattening i
1b120 73 20 61 74 74 65 6d 70 74 65 64 20 74 68 69 73  s attempted this
1b130 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1b140 20 31 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 66   1..**.** All of
1b150 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1b160 61 6e 61 6c 79 73 69 73 20 6d 75 73 74 20 6f 63  analysis must oc
1b170 63 75 72 20 6f 6e 20 62 6f 74 68 20 74 68 65 20  cur on both the 
1b180 6f 75 74 65 72 20 71 75 65 72 79 20 61 6e 64 0a  outer query and.
1b190 2a 2a 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ** the subquery 
1b1a0 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74  before this rout
1b1b0 69 6e 65 20 72 75 6e 73 2e 0a 2a 2f 0a 73 74 61  ine runs..*/.sta
1b1c0 74 69 63 20 69 6e 74 20 66 6c 61 74 74 65 6e 53  tic int flattenS
1b1d0 75 62 71 75 65 72 79 28 0a 20 20 50 61 72 73 65  ubquery(.  Parse
1b1e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1b1f0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1b200 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  xt */.  Select *
1b210 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p,           /* 
1b220 54 68 65 20 70 61 72 65 6e 74 20 6f 72 20 6f 75  The parent or ou
1b230 74 65 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  ter SELECT state
1b240 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  ment */.  int iF
1b250 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
1b260 2a 20 49 6e 64 65 78 20 69 6e 20 70 2d 3e 70 53  * Index in p->pS
1b270 72 63 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 69  rc->a[] of the i
1b280 6e 6e 65 72 20 73 75 62 71 75 65 72 79 20 2a 2f  nner subquery */
1b290 0a 20 20 69 6e 74 20 69 73 41 67 67 2c 20 20 20  .  int isAgg,   
1b2a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1b2b0 69 66 20 6f 75 74 65 72 20 53 45 4c 45 43 54 20  if outer SELECT 
1b2c0 75 73 65 73 20 61 67 67 72 65 67 61 74 65 20 66  uses aggregate f
1b2d0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  unctions */.  in
1b2e0 74 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20  t subqueryIsAgg 
1b2f0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1b300 65 20 73 75 62 71 75 65 72 79 20 75 73 65 73 20  e subquery uses 
1b310 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
1b320 6f 6e 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ons */.){.  cons
1b330 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 41 75  t char *zSavedAu
1b340 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  thContext = pPar
1b350 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
1b360 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 50 61 72  ;.  Select *pPar
1b370 65 6e 74 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ent;.  Select *p
1b380 53 75 62 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Sub;       /* Th
1b390 65 20 69 6e 6e 65 72 20 71 75 65 72 79 20 6f 72  e inner query or
1b3a0 20 22 73 75 62 71 75 65 72 79 22 20 2a 2f 0a 20   "subquery" */. 
1b3b0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 31 3b 20   Select *pSub1; 
1b3c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1b3d0 74 6f 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74  to the rightmost
1b3e0 20 73 65 6c 65 63 74 20 69 6e 20 73 75 62 2d 71   select in sub-q
1b3f0 75 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73  uery */.  SrcLis
1b400 74 20 2a 70 53 72 63 3b 20 20 20 20 20 20 2f 2a  t *pSrc;      /*
1b410 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
1b420 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75   of the outer qu
1b430 65 72 79 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ery */.  SrcList
1b440 20 2a 70 53 75 62 53 72 63 3b 20 20 20 2f 2a 20   *pSubSrc;   /* 
1b450 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
1b460 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  of the subquery 
1b470 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1b480 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
1b490 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
1b4a0 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f  e outer query */
1b4b0 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20  .  int iParent; 
1b4c0 20 20 20 20 20 20 20 2f 2a 20 56 44 42 45 20 63         /* VDBE c
1b4d0 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
1b4e0 74 68 65 20 70 53 75 62 20 72 65 73 75 6c 74 20  the pSub result 
1b4f0 73 65 74 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  set temp table *
1b500 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
1b510 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1b520 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70  counter */.  Exp
1b530 72 20 2a 70 57 68 65 72 65 3b 20 20 20 20 20 20  r *pWhere;      
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b550 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1b560 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
1b570 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 75 62  cList_item *pSub
1b580 69 74 65 6d 3b 20 20 20 2f 2a 20 54 68 65 20 73  item;   /* The s
1b590 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c  ubquery */.  sql
1b5a0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1b5b0 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 43 68 65  e->db;..  /* Che
1b5c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 66 6c 61  ck to see if fla
1b5d0 74 74 65 6e 69 6e 67 20 69 73 20 70 65 72 6d 69  ttening is permi
1b5e0 74 74 65 64 2e 20 20 52 65 74 75 72 6e 20 30 20  tted.  Return 0 
1b5f0 69 66 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 61  if not..  */.  a
1b600 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
1b610 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 72 69   assert( p->pPri
1b620 6f 72 3d 3d 30 20 29 3b 20 20 2f 2a 20 55 6e 61  or==0 );  /* Una
1b630 62 6c 65 20 74 6f 20 66 6c 61 74 74 65 6e 20 63  ble to flatten c
1b640 6f 6d 70 6f 75 6e 64 20 71 75 65 72 69 65 73 20  ompound queries 
1b650 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a  */.  if( Optimiz
1b660 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62  ationDisabled(db
1b670 2c 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c  , SQLITE_QueryFl
1b680 61 74 74 65 6e 65 72 29 20 29 20 72 65 74 75 72  attener) ) retur
1b690 6e 20 30 3b 0a 20 20 70 53 72 63 20 3d 20 70 2d  n 0;.  pSrc = p-
1b6a0 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74 28  >pSrc;.  assert(
1b6b0 20 70 53 72 63 20 26 26 20 69 46 72 6f 6d 3e 3d   pSrc && iFrom>=
1b6c0 30 20 26 26 20 69 46 72 6f 6d 3c 70 53 72 63 2d  0 && iFrom<pSrc-
1b6d0 3e 6e 53 72 63 20 29 3b 0a 20 20 70 53 75 62 69  >nSrc );.  pSubi
1b6e0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
1b6f0 46 72 6f 6d 5d 3b 0a 20 20 69 50 61 72 65 6e 74  From];.  iParent
1b700 20 3d 20 70 53 75 62 69 74 65 6d 2d 3e 69 43 75   = pSubitem->iCu
1b710 72 73 6f 72 3b 0a 20 20 70 53 75 62 20 3d 20 70  rsor;.  pSub = p
1b720 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63 74  Subitem->pSelect
1b730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 75 62  ;.  assert( pSub
1b740 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 73 41  !=0 );.  if( isA
1b750 67 67 20 26 26 20 73 75 62 71 75 65 72 79 49 73  gg && subqueryIs
1b760 41 67 67 20 29 20 72 65 74 75 72 6e 20 30 3b 20  Agg ) return 0; 
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b780 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1b790 31 29 20 20 2a 2f 0a 20 20 69 66 28 20 73 75 62  1)  */.  if( sub
1b7a0 71 75 65 72 79 49 73 41 67 67 20 26 26 20 70 53  queryIsAgg && pS
1b7b0 72 63 2d 3e 6e 53 72 63 3e 31 20 29 20 72 65 74  rc->nSrc>1 ) ret
1b7c0 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1b7d0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1b7e0 32 29 20 20 2a 2f 0a 20 20 70 53 75 62 53 72 63  2)  */.  pSubSrc
1b7f0 20 3d 20 70 53 75 62 2d 3e 70 53 72 63 3b 0a 20   = pSub->pSrc;. 
1b800 20 61 73 73 65 72 74 28 20 70 53 75 62 53 72 63   assert( pSubSrc
1b810 20 29 3b 0a 20 20 2f 2a 20 50 72 69 6f 72 20 74   );.  /* Prior t
1b820 6f 20 76 65 72 73 69 6f 6e 20 33 2e 31 2e 32 2c  o version 3.1.2,
1b830 20 77 68 65 6e 20 4c 49 4d 49 54 20 61 6e 64 20   when LIMIT and 
1b840 4f 46 46 53 45 54 20 68 61 64 20 74 6f 20 62 65  OFFSET had to be
1b850 20 73 69 6d 70 6c 65 20 63 6f 6e 73 74 61 6e 74   simple constant
1b860 73 2c 0a 20 20 2a 2a 20 6e 6f 74 20 61 72 62 69  s,.  ** not arbi
1b870 74 72 61 72 79 20 65 78 70 72 65 73 73 73 69 6f  trary expresssio
1b880 6e 73 2c 20 77 65 20 61 6c 6c 6f 77 65 64 20 73  ns, we allowed s
1b890 6f 6d 65 20 63 6f 6d 62 69 6e 69 6e 67 20 6f 66  ome combining of
1b8a0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1b8b0 54 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 74  T.  ** because t
1b8c0 68 65 79 20 63 6f 75 6c 64 20 62 65 20 63 6f 6d  hey could be com
1b8d0 70 75 74 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  puted at compile
1b8e0 2d 74 69 6d 65 2e 20 20 42 75 74 20 77 68 65 6e  -time.  But when
1b8f0 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
1b900 54 0a 20 20 2a 2a 20 62 65 63 61 6d 65 20 61 72  T.  ** became ar
1b910 62 69 74 72 61 72 79 20 65 78 70 72 65 73 73 69  bitrary expressi
1b920 6f 6e 73 2c 20 77 65 20 77 65 72 65 20 66 6f 72  ons, we were for
1b930 63 65 64 20 74 6f 20 61 64 64 20 72 65 73 74 72  ced to add restr
1b940 69 63 74 69 6f 6e 73 20 28 31 33 29 0a 20 20 2a  ictions (13).  *
1b950 2a 20 61 6e 64 20 28 31 34 29 2e 20 2a 2f 0a 20  * and (14). */. 
1b960 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
1b970 74 20 26 26 20 70 2d 3e 70 4c 69 6d 69 74 20 29  t && p->pLimit )
1b980 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1b990 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1b9a0 69 63 74 69 6f 6e 20 28 31 33 29 20 2a 2f 0a 20  iction (13) */. 
1b9b0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 66 66 73   if( pSub->pOffs
1b9c0 65 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  et ) return 0;  
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1b9f0 69 63 74 69 6f 6e 20 28 31 34 29 20 2a 2f 0a 20  iction (14) */. 
1ba00 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
1ba10 73 20 26 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 29  s & SF_Compound)
1ba20 21 3d 30 20 26 26 20 70 53 75 62 2d 3e 70 4c 69  !=0 && pSub->pLi
1ba30 6d 69 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  mit ){.    retur
1ba40 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba70 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1ba80 31 35 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  15) */.  }.  if(
1ba90 20 70 53 75 62 53 72 63 2d 3e 6e 53 72 63 3d 3d   pSubSrc->nSrc==
1baa0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  0 ) return 0;   
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1bad0 6f 6e 20 28 37 29 20 20 2a 2f 0a 20 20 69 66 28  on (7)  */.  if(
1bae0 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20   pSub->selFlags 
1baf0 26 20 53 46 5f 44 69 73 74 69 6e 63 74 20 29 20  & SF_Distinct ) 
1bb00 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1bb10 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
1bb20 6f 6e 20 28 35 29 20 20 2a 2f 0a 20 20 69 66 28  on (5)  */.  if(
1bb30 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26   pSub->pLimit &&
1bb40 20 28 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 7c   (pSrc->nSrc>1 |
1bb50 7c 20 69 73 41 67 67 29 20 29 7b 0a 20 20 20 20  | isAgg) ){.    
1bb60 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
1bb70 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f     /* Restrictio
1bb80 6e 73 20 28 38 29 28 39 29 20 2a 2f 0a 20 20 7d  ns (8)(9) */.  }
1bb90 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
1bba0 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63  ags & SF_Distinc
1bbb0 74 29 21 3d 30 20 26 26 20 73 75 62 71 75 65 72  t)!=0 && subquer
1bbc0 79 49 73 41 67 67 20 29 7b 0a 20 20 20 20 20 72  yIsAgg ){.     r
1bbd0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1bbe0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
1bbf0 28 36 29 20 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  (6)  */.  }.  if
1bc00 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 26 26  ( p->pOrderBy &&
1bc10 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
1bc20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30  ){.     return 0
1bc30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1bc60 65 73 74 72 69 63 74 69 6f 6e 20 28 31 31 29 20  estriction (11) 
1bc70 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 41  */.  }.  if( isA
1bc80 67 67 20 26 26 20 70 53 75 62 2d 3e 70 4f 72 64  gg && pSub->pOrd
1bc90 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30 3b  erBy ) return 0;
1bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcb0 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1bcc0 31 36 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  16) */.  if( pSu
1bcd0 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d 3e  b->pLimit && p->
1bce0 70 57 68 65 72 65 20 29 20 72 65 74 75 72 6e 20  pWhere ) return 
1bcf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1bd00 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28  /* Restriction (
1bd10 31 39 29 20 2a 2f 0a 20 20 69 66 28 20 70 53 75  19) */.  if( pSu
1bd20 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 28 70 2d  b->pLimit && (p-
1bd30 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44  >selFlags & SF_D
1bd40 69 73 74 69 6e 63 74 29 21 3d 30 20 29 7b 0a 20  istinct)!=0 ){. 
1bd50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1bd60 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
1bd70 74 69 6f 6e 20 28 32 31 29 20 2a 2f 0a 20 20 7d  tion (21) */.  }
1bd80 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73 65 6c  .  if( pSub->sel
1bd90 46 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72  Flags & SF_Recur
1bda0 73 69 76 65 20 29 20 72 65 74 75 72 6e 20 30 3b  sive ) return 0;
1bdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1bdc0 74 72 69 63 74 69 6f 6e 20 28 32 32 29 20 20 2a  triction (22)  *
1bdd0 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
1bde0 6c 61 67 73 20 26 20 53 46 5f 52 65 63 75 72 73  lags & SF_Recurs
1bdf0 69 76 65 29 20 26 26 20 70 53 75 62 2d 3e 70 50  ive) && pSub->pP
1be00 72 69 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b  rior ) return 0;
1be10 20 20 20 20 20 20 20 2f 2a 20 28 32 33 29 20 20         /* (23)  
1be20 2a 2f 0a 0a 20 20 2f 2a 20 4f 42 53 4f 4c 45 54  */..  /* OBSOLET
1be30 45 20 43 4f 4d 4d 45 4e 54 20 31 3a 0a 20 20 2a  E COMMENT 1:.  *
1be40 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 33 3a  * Restriction 3:
1be50 20 20 49 66 20 74 68 65 20 73 75 62 71 75 65 72    If the subquer
1be60 79 20 69 73 20 61 20 6a 6f 69 6e 2c 20 6d 61 6b  y is a join, mak
1be70 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71 75  e sure the subqu
1be80 65 72 79 20 69 73 20 0a 20 20 2a 2a 20 6e 6f 74  ery is .  ** not
1be90 20 75 73 65 64 20 61 73 20 74 68 65 20 72 69 67   used as the rig
1bea0 68 74 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 6e  ht operand of an
1beb0 20 6f 75 74 65 72 20 6a 6f 69 6e 2e 20 20 45 78   outer join.  Ex
1bec0 61 6d 70 6c 65 73 20 6f 66 20 77 68 79 20 74 68  amples of why th
1bed0 69 73 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  is.  ** is not a
1bee0 6c 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  llowed:.  **.  *
1bef0 2a 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46  *         t1 LEF
1bf00 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 74 32  T OUTER JOIN (t2
1bf10 20 4a 4f 49 4e 20 74 33 29 0a 20 20 2a 2a 0a 20   JOIN t3).  **. 
1bf20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74 74 65   ** If we flatte
1bf30 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77 65 20  n the above, we 
1bf40 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a 0a 20  would get.  **. 
1bf50 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74 31 20   **         (t1 
1bf60 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
1bf70 74 32 29 20 4a 4f 49 4e 20 74 33 0a 20 20 2a 2a  t2) JOIN t3.  **
1bf80 0a 20 20 2a 2a 20 77 68 69 63 68 20 69 73 20 6e  .  ** which is n
1bf90 6f 74 20 61 74 20 61 6c 6c 20 74 68 65 20 73 61  ot at all the sa
1bfa0 6d 65 20 74 68 69 6e 67 2e 0a 20 20 2a 2a 0a 20  me thing..  **. 
1bfb0 20 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d   ** OBSOLETE COM
1bfc0 4d 45 4e 54 20 32 3a 0a 20 20 2a 2a 20 52 65 73  MENT 2:.  ** Res
1bfd0 74 72 69 63 74 69 6f 6e 20 31 32 3a 20 20 49 66  triction 12:  If
1bfe0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 69 73   the subquery is
1bff0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1c000 6e 64 20 6f 66 20 61 20 6c 65 66 74 20 6f 75 74  nd of a left out
1c010 65 72 0a 20 20 2a 2a 20 6a 6f 69 6e 2c 20 6d 61  er.  ** join, ma
1c020 6b 65 20 73 75 72 65 20 74 68 65 20 73 75 62 71  ke sure the subq
1c030 75 65 72 79 20 68 61 73 20 6e 6f 20 57 48 45 52  uery has no WHER
1c040 45 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 20 41  E clause..  ** A
1c050 6e 20 65 78 61 6d 70 6c 65 73 20 6f 66 20 77 68  n examples of wh
1c060 79 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6c  y this is not al
1c070 6c 6f 77 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  lowed:.  **.  **
1c080 20 20 20 20 20 20 20 20 20 74 31 20 4c 45 46 54           t1 LEFT
1c090 20 4f 55 54 45 52 20 4a 4f 49 4e 20 28 53 45 4c   OUTER JOIN (SEL
1c0a0 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 57 48  ECT * FROM t2 WH
1c0b0 45 52 45 20 74 32 2e 78 3e 30 29 0a 20 20 2a 2a  ERE t2.x>0).  **
1c0c0 0a 20 20 2a 2a 20 49 66 20 77 65 20 66 6c 61 74  .  ** If we flat
1c0d0 74 65 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 77  ten the above, w
1c0e0 65 20 77 6f 75 6c 64 20 67 65 74 0a 20 20 2a 2a  e would get.  **
1c0f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 28 74  .  **         (t
1c100 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
1c110 4e 20 74 32 29 20 57 48 45 52 45 20 74 32 2e 78  N t2) WHERE t2.x
1c120 3e 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 75 74  >0.  **.  ** But
1c130 20 74 68 65 20 74 32 2e 78 3e 30 20 74 65 73 74   the t2.x>0 test
1c140 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61 69   will always fai
1c150 6c 20 6f 6e 20 61 20 4e 55 4c 4c 20 72 6f 77 20  l on a NULL row 
1c160 6f 66 20 74 32 2c 20 77 68 69 63 68 0a 20 20 2a  of t2, which.  *
1c170 2a 20 65 66 66 65 63 74 69 76 65 6c 79 20 63 6f  * effectively co
1c180 6e 76 65 72 74 73 20 74 68 65 20 4f 55 54 45 52  nverts the OUTER
1c190 20 4a 4f 49 4e 20 69 6e 74 6f 20 61 6e 20 49 4e   JOIN into an IN
1c1a0 4e 45 52 20 4a 4f 49 4e 2e 0a 20 20 2a 2a 0a 20  NER JOIN..  **. 
1c1b0 20 2a 2a 20 54 48 49 53 20 4f 56 45 52 52 49 44   ** THIS OVERRID
1c1c0 45 53 20 4f 42 53 4f 4c 45 54 45 20 43 4f 4d 4d  ES OBSOLETE COMM
1c1d0 45 4e 54 53 20 31 20 41 4e 44 20 32 20 41 42 4f  ENTS 1 AND 2 ABO
1c1e0 56 45 3a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20  VE:.  ** Ticket 
1c1f0 23 33 33 30 30 20 73 68 6f 77 73 20 74 68 61 74  #3300 shows that
1c200 20 66 6c 61 74 74 65 6e 69 6e 67 20 74 68 65 20   flattening the 
1c210 72 69 67 68 74 20 74 65 72 6d 20 6f 66 20 61 20  right term of a 
1c220 4c 45 46 54 20 4a 4f 49 4e 0a 20 20 2a 2a 20 69  LEFT JOIN.  ** i
1c230 73 20 66 72 61 75 67 68 74 20 77 69 74 68 20 64  s fraught with d
1c240 61 6e 67 65 72 2e 20 20 42 65 73 74 20 74 6f 20  anger.  Best to 
1c250 61 76 6f 69 64 20 74 68 65 20 77 68 6f 6c 65 20  avoid the whole 
1c260 74 68 69 6e 67 2e 20 20 49 66 20 74 68 65 0a 20  thing.  If the. 
1c270 20 2a 2a 20 73 75 62 71 75 65 72 79 20 69 73 20   ** subquery is 
1c280 74 68 65 20 72 69 67 68 74 20 74 65 72 6d 20 6f  the right term o
1c290 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74  f a LEFT JOIN, t
1c2a0 68 65 6e 20 64 6f 20 6e 6f 74 20 66 6c 61 74 74  hen do not flatt
1c2b0 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  en..  */.  if( (
1c2c0 70 53 75 62 69 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pSubitem->jointy
1c2d0 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
1c2e0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1c2f0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  0;.  }..  /* Res
1c300 74 72 69 63 74 69 6f 6e 20 31 37 3a 20 49 66 20  triction 17: If 
1c310 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1c320 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1c330 43 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  CT, then it must
1c340 0a 20 20 2a 2a 20 75 73 65 20 6f 6e 6c 79 20 74  .  ** use only t
1c350 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  he UNION ALL ope
1c360 72 61 74 6f 72 2e 20 41 6e 64 20 6e 6f 6e 65 20  rator. And none 
1c370 6f 66 20 74 68 65 20 73 69 6d 70 6c 65 20 73 65  of the simple se
1c380 6c 65 63 74 20 71 75 65 72 69 65 73 0a 20 20 2a  lect queries.  *
1c390 2a 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  * that make up t
1c3a0 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
1c3b0 43 54 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  CT are allowed t
1c3c0 6f 20 62 65 20 61 67 67 72 65 67 61 74 65 20 6f  o be aggregate o
1c3d0 72 20 64 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20  r distinct.  ** 
1c3e0 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
1c3f0 69 66 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72  if( pSub->pPrior
1c400 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 75 62   ){.    if( pSub
1c410 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ->pOrderBy ){.  
1c420 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1c430 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 32 30  * Restriction 20
1c440 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
1c450 28 20 69 73 41 67 67 20 7c 7c 20 28 70 2d 3e 73  ( isAgg || (p->s
1c460 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
1c470 74 69 6e 63 74 29 21 3d 30 20 7c 7c 20 70 53 72  tinct)!=0 || pSr
1c480 63 2d 3e 6e 53 72 63 21 3d 31 20 29 7b 0a 20 20  c->nSrc!=1 ){.  
1c490 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c4a0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 53 75 62    }.    for(pSub
1c4b0 31 3d 70 53 75 62 3b 20 70 53 75 62 31 3b 20 70  1=pSub; pSub1; p
1c4c0 53 75 62 31 3d 70 53 75 62 31 2d 3e 70 50 72 69  Sub1=pSub1->pPri
1c4d0 6f 72 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  or){.      testc
1c4e0 61 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c  ase( (pSub1->sel
1c4f0 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74  Flags & (SF_Dist
1c500 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74  inct|SF_Aggregat
1c510 65 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74  e))==SF_Distinct
1c520 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
1c530 73 65 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46  se( (pSub1->selF
1c540 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
1c550 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
1c560 29 29 3d 3d 53 46 5f 41 67 67 72 65 67 61 74 65  ))==SF_Aggregate
1c570 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1c580 28 20 70 53 75 62 2d 3e 70 53 72 63 21 3d 30 20  ( pSub->pSrc!=0 
1c590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  );.      if( (pS
1c5a0 75 62 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ub1->selFlags & 
1c5b0 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
1c5c0 41 67 67 72 65 67 61 74 65 29 29 21 3d 30 0a 20  Aggregate))!=0. 
1c5d0 20 20 20 20 20 20 7c 7c 20 28 70 53 75 62 31 2d        || (pSub1-
1c5e0 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 31  >pPrior && pSub1
1c5f0 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29 20 0a 20  ->op!=TK_ALL) . 
1c600 20 20 20 20 20 20 7c 7c 20 70 53 75 62 31 2d 3e        || pSub1->
1c610 70 53 72 63 2d 3e 6e 53 72 63 3c 31 0a 20 20 20  pSrc->nSrc<1.   
1c620 20 20 20 20 7c 7c 20 70 53 75 62 2d 3e 70 45 4c      || pSub->pEL
1c630 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 53 75 62  ist->nExpr!=pSub
1c640 31 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1->pEList->nExpr
1c650 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1c660 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1c670 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
1c680 73 65 28 20 70 53 75 62 31 2d 3e 70 53 72 63 2d  se( pSub1->pSrc-
1c690 3e 6e 53 72 63 3e 31 20 29 3b 0a 20 20 20 20 7d  >nSrc>1 );.    }
1c6a0 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63  ..    /* Restric
1c6b0 74 69 6f 6e 20 31 38 2e 20 2a 2f 0a 20 20 20 20  tion 18. */.    
1c6c0 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20  if( p->pOrderBy 
1c6d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
1c6e0 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  .      for(ii=0;
1c6f0 20 69 69 3c 70 2d 3e 70 4f 72 64 65 72 42 79 2d   ii<p->pOrderBy-
1c700 3e 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20  >nExpr; ii++){. 
1c710 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4f         if( p->pO
1c720 72 64 65 72 42 79 2d 3e 61 5b 69 69 5d 2e 75 2e  rderBy->a[ii].u.
1c730 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d 3d 30  x.iOrderByCol==0
1c740 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1c750 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1c760 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65 20 72    /***** If we r
1c770 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c  each this point,
1c780 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73 20 70   flattening is p
1c790 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a 2a 2f  ermitted. *****/
1c7a0 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 65  ..  /* Authorize
1c7b0 20 74 68 65 20 73 75 62 71 75 65 72 79 20 2a 2f   the subquery */
1c7c0 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68  .  pParse->zAuth
1c7d0 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62 69 74  Context = pSubit
1c7e0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54 45 53  em->zName;.  TES
1c7f0 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c 69 74  TONLY(i =) sqlit
1c800 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1c810 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c 45 43  se, SQLITE_SELEC
1c820 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 74  T, 0, 0, 0);.  t
1c830 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51 4c 49  estcase( i==SQLI
1c840 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70 50 61  TE_DENY );.  pPa
1c850 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
1c860 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68 43 6f  t = zSavedAuthCo
1c870 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  ntext;..  /* If 
1c880 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 69 73  the sub-query is
1c890 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
1c8a0 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1c8b0 65 6e 20 28 62 79 20 72 65 73 74 72 69 63 74 69  en (by restricti
1c8c0 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e 64 20  ons.  ** 17 and 
1c8d0 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d 75 73  18 above) it mus
1c8e0 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41 4c 4c  t be a UNION ALL
1c8f0 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20   and the parent 
1c900 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20 2a 2a  query must .  **
1c910 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a   be of the form:
1c920 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
1c930 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69 73 74  ELECT <expr-list
1c940 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71 75 65  > FROM (<sub-que
1c950 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c 61 75  ry>) <where-clau
1c960 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 66  se> .  **.  ** f
1c970 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79 20 4f  ollowed by any O
1c980 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54 20 61  RDER BY, LIMIT a
1c990 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63 6c 61  nd/or OFFSET cla
1c9a0 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b  uses. This block
1c9b0 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20 4e 2d  .  ** creates N-
1c9c0 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20  1 copies of the 
1c9d0 70 61 72 65 6e 74 20 71 75 65 72 79 20 77 69 74  parent query wit
1c9e0 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52 20 42  hout any ORDER B
1c9f0 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20 20 2a  Y, LIMIT or .  *
1ca00 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  * OFFSET clauses
1ca10 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65 6d 20   and joins them 
1ca20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  to the left-hand
1ca30 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f 72 69  -side of the ori
1ca40 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69 6e 67  ginal.  ** using
1ca50 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61   UNION ALL opera
1ca60 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61  tors. In this ca
1ca70 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  se N is the numb
1ca80 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20 20 2a  er of simple.  *
1ca90 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  * select stateme
1caa0 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f  nts in the compo
1cab0 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  und sub-query.. 
1cac0 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70 6c 65   **.  ** Example
1cad0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
1cae0 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f 4d 20  SELECT a+1 FROM 
1caf0 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 53 45  (.  **        SE
1cb00 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61 62 0a  LECT x FROM tab.
1cb10 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e 49 4f    **        UNIO
1cb20 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 20  N ALL.  **      
1cb30 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f 4d 20    SELECT y FROM 
1cb40 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  tab.  **        
1cb50 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20  UNION ALL.  **  
1cb60 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73        SELECT abs
1cb70 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62 32 0a  (z*2) FROM tab2.
1cb80 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45 52 45    **     ) WHERE
1cb90 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59 20 31   a!=5 ORDER BY 1
1cba0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61 6e 73  .  **.  ** Trans
1cbb0 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20 20 2a  formed into:.  *
1cbc0 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  *.  **     SELEC
1cbd0 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62 20 57  T x+1 FROM tab W
1cbe0 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20 2a 2a  HERE x+1!=5.  **
1cbf0 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20       UNION ALL. 
1cc00 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 79   **     SELECT y
1cc10 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48 45 52  +1 FROM tab WHER
1cc20 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20  E y+1!=5.  **   
1cc30 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
1cc40 20 20 20 20 20 53 45 4c 45 43 54 20 61 62 73 28       SELECT abs(
1cc50 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61 62 32  z*2)+1 FROM tab2
1cc60 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32 29 2b   WHERE abs(z*2)+
1cc70 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20 4f 52  1!=5.  **     OR
1cc80 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a 20 20  DER BY 1.  **.  
1cc90 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69 73 20  ** We call this 
1cca0 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d 73 75  the "compound-su
1ccb0 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1ccc0 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  g"..  */.  for(p
1ccd0 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69 6f 72  Sub=pSub->pPrior
1cce0 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 53 75  ; pSub; pSub=pSu
1ccf0 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20  b->pPrior){.    
1cd00 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
1cd10 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1cd20 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
1cd30 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c  By;.    Expr *pL
1cd40 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d 69 74  imit = p->pLimit
1cd50 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4f 66 66  ;.    Expr *pOff
1cd60 73 65 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74  set = p->pOffset
1cd70 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 50  ;.    Select *pP
1cd80 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
1cd90 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42  ;.    p->pOrderB
1cda0 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 53  y = 0;.    p->pS
1cdb0 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70  rc = 0;.    p->p
1cdc0 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  Prior = 0;.    p
1cdd0 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20  ->pLimit = 0;.  
1cde0 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30    p->pOffset = 0
1cdf0 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c  ;.    pNew = sql
1ce00 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
1ce10 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e  , p, 0);.    p->
1ce20 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
1ce30 74 3b 0a 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74  t;.    p->pLimit
1ce40 20 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 70   = pLimit;.    p
1ce50 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
1ce60 64 65 72 42 79 3b 0a 20 20 20 20 70 2d 3e 70 53  derBy;.    p->pS
1ce70 72 63 20 3d 20 70 53 72 63 3b 0a 20 20 20 20 70  rc = pSrc;.    p
1ce80 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20  ->op = TK_ALL;. 
1ce90 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1cea0 7b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 69 6f  {.      p->pPrio
1ceb0 72 20 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20  r = pPrior;.    
1cec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
1ced0 77 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  w->pPrior = pPri
1cee0 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  or;.      if( pP
1cef0 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
1cf00 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Next = pNew;.   
1cf10 20 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d     pNew->pNext =
1cf20 20 70 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72   p;.      p->pPr
1cf30 69 6f 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ior = pNew;.    
1cf40 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
1cf50 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1cf60 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
1cf70 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
1cf80 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
1cf90 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
1cfa0 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
1cfb0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1cfc0 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
1cfd0 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
1cfe0 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
1cff0 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
1d000 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
1d010 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
1d020 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1d030 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
1d040 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d050 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1d060 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1d070 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1d080 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1d090 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d0a0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1d0b0 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1d0c0 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1d0d0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1d0e0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1d0f0 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1d100 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1d110 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1d120 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1d130 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1d140 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1d150 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1d160 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1d170 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1d180 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1d190 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1d1a0 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1d1b0 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1d1c0 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1d1d0 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1d1e0 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1d1f0 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1d200 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1d210 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1d220 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1d230 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1d240 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1d250 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1d260 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1d270 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1d280 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1d290 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1d2a0 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1d2b0 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1d2c0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1d2d0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1d2e0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1d2f0 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1d300 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1d310 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1d320 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1d330 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1d340 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1d350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d360 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1d370 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1d380 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1d390 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1d3a0 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1d3b0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1d3c0 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1d3d0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1d3e0 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1d3f0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1d400 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1d410 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1d420 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1d430 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1d440 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1d450 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1d460 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1d470 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1d480 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1d490 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1d4a0 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1d4b0 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1d4c0 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1d4d0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1d4e0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1d4f0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1d500 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1d510 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1d520 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1d530 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1d540 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1d550 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1d560 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1d570 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1d580 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1d590 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1d5a0 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1d5b0 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1d5c0 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1d5d0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1d5e0 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1d5f0 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1d600 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1d610 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1d620 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1d630 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1d640 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1d650 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1d660 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1d670 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1d680 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1d690 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1d6a0 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1d6b0 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1d6c0 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1d6d0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1d6e0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1d6f0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1d700 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1d710 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1d720 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1d730 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1d740 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1d750 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1d760 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1d770 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1d780 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1d790 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1d7a0 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1d7b0 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1d7c0 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1d7d0 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1d7e0 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1d7f0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1d800 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1d810 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1d820 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1d830 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1d840 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1d850 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1d860 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1d870 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1d880 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1d890 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1d8a0 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1d8b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1d8c0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1d8d0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1d8e0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1d8f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d900 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d910 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1d920 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1d930 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1d940 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1d950 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1d960 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1d970 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1d980 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1d990 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1d9a0 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1d9b0 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1d9c0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1d9d0 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1d9e0 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1d9f0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1da00 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1da10 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1da20 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1da30 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1da40 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1da50 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1da60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1da70 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1da80 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1da90 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1daa0 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1dab0 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1dac0 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1dad0 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1dae0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1daf0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1db00 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1db10 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1db20 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
1db30 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
1db40 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
1db50 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
1db60 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
1db70 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
1db80 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
1db90 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
1dba0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1dbb0 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1dbc0 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
1dbd0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
1dbe0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1dbf0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1dc00 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1dc10 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
1dc20 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
1dc30 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1dc40 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
1dc50 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1dc60 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
1dc70 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
1dc80 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
1dc90 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1dca0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1dcb0 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
1dcc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1dcd0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1dce0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1dcf0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
1dd00 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
1dd10 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
1dd20 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1dd30 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1dd40 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1dd50 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1dd60 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1dd70 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1dd80 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1dd90 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1dda0 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1ddb0 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1ddc0 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1ddd0 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1dde0 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1ddf0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1de00 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1de10 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1de20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1de30 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1de40 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1de50 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1de60 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1de70 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
1de80 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
1de90 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1deb0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
1dec0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
1ded0 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
1dee0 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
1def0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1df00 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1df10 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1df20 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
1df30 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
1df40 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1df50 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
1df60 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
1df70 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
1df80 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1df90 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1dfa0 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1dfb0 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1dfc0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1dfd0 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1dfe0 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1dff0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1e000 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1e010 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1e020 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
1e030 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
1e040 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1e050 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
1e060 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1e070 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1e080 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
1e090 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
1e0a0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
1e0b0 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
1e0c0 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
1e0d0 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1e0e0 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
1e0f0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1e100 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
1e110 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1e120 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1e130 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
1e140 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1e150 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1e160 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1e170 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1e180 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1e190 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1e1a0 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1e1b0 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
1e1c0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rBy ){.      ass
1e1d0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
1e1e0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
1e1f0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
1e200 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
1e210 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
1e220 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
1e230 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1e240 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1e250 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1e260 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1e270 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
1e280 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1e290 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1e2a0 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
1e2b0 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
1e2c0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
1e2d0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
1e2e0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
1e2f0 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
1e300 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1e310 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
1e320 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
1e330 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
1e340 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
1e350 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1e360 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
1e370 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1e380 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
1e390 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1e3a0 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1e3b0 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1e3c0 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1e3d0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1e3e0 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1e3f0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
1e400 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1e410 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1e420 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e450 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1e460 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
1e470 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1e480 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
1e490 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1e4a0 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1e4b0 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1e4c0 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
1e4d0 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
1e4e0 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
1e4f0 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1e500 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1e510 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
1e520 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1e530 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1e540 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1e550 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1e560 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
1e570 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
1e580 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
1e590 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
1e5a0 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
1e5b0 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
1e5c0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1e5d0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1e5e0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
1e5f0 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
1e600 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
1e610 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
1e620 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
1e630 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
1e640 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
1e650 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
1e660 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
1e670 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1e680 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
1e690 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
1e6a0 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
1e6b0 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
1e6c0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
1e6d0 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
1e6e0 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
1e6f0 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
1e700 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
1e710 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
1e720 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
1e730 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
1e740 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
1e750 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1e760 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
1e770 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
1e780 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
1e790 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
1e7a0 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
1e7b0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1e7c0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
1e7d0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
1e7e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1e7f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1e800 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1e810 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1e820 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
1e830 2a 2a 20 42 61 73 65 64 20 6f 6e 20 74 68 65 20  ** Based on the 
1e840 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1e850 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75 72  AggInfo structur
1e860 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
1e870 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75  he first.** argu
1e880 6d 65 6e 74 2c 20 74 68 69 73 20 66 75 6e 63 74  ment, this funct
1e890 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
1e8a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1e8b0 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  true:.**.**    *
1e8c0 20 74 68 65 20 71 75 65 72 79 20 63 6f 6e 74 61   the query conta
1e8d0 69 6e 73 20 6a 75 73 74 20 61 20 73 69 6e 67 6c  ins just a singl
1e8e0 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1e8f0 74 69 6f 6e 2c 0a 2a 2a 20 20 20 20 2a 20 74 68  tion,.**    * th
1e900 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
1e910 74 69 6f 6e 20 69 73 20 65 69 74 68 65 72 20 6d  tion is either m
1e920 69 6e 28 29 20 6f 72 20 6d 61 78 28 29 2c 20 61  in() or max(), a
1e930 6e 64 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  nd.**    * the a
1e940 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 61  rgument to the a
1e950 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
1e960 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  n is a column va
1e970 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  lue..**.** If al
1e980 6c 20 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61  l of the above a
1e990 72 65 20 74 72 75 65 2c 20 74 68 65 6e 20 57 48  re true, then WH
1e9a0 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20  ERE_ORDERBY_MIN 
1e9b0 6f 72 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  or WHERE_ORDERBY
1e9c0 5f 4d 41 58 0a 2a 2a 20 69 73 20 72 65 74 75 72  _MAX.** is retur
1e9d0 6e 65 64 20 61 73 20 61 70 70 72 6f 70 72 69 61  ned as appropria
1e9e0 74 65 2e 20 41 6c 73 6f 2c 20 2a 70 70 4d 69 6e  te. Also, *ppMin
1e9f0 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Max is set to po
1ea00 69 6e 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 6c  int to the .** l
1ea10 69 73 74 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ist of arguments
1ea20 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 61   passed to the a
1ea30 67 67 72 65 67 61 74 65 20 62 65 66 6f 72 65 20  ggregate before 
1ea40 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1ea50 20 4f 72 2c 20 69 66 20 74 68 65 20 63 6f 6e 64   Or, if the cond
1ea60 69 74 69 6f 6e 73 20 61 62 6f 76 65 20 61 72 65  itions above are
1ea70 20 6e 6f 74 20 6d 65 74 2c 20 2a 70 70 4d 69 6e   not met, *ppMin
1ea80 4d 61 78 20 69 73 20 73 65 74 20 74 6f 20 30 20  Max is set to 0 
1ea90 61 6e 64 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 44  and.** WHERE_ORD
1eaa0 45 52 42 59 5f 4e 4f 52 4d 41 4c 20 69 73 20 72  ERBY_NORMAL is r
1eab0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1eac0 69 63 20 75 38 20 6d 69 6e 4d 61 78 51 75 65 72  ic u8 minMaxQuer
1ead0 79 28 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49  y(AggInfo *pAggI
1eae0 6e 66 6f 2c 20 45 78 70 72 4c 69 73 74 20 2a 2a  nfo, ExprList **
1eaf0 70 70 4d 69 6e 4d 61 78 29 7b 0a 20 20 69 6e 74  ppMinMax){.  int
1eb00 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f 4f 52   eRet = WHERE_OR
1eb10 44 45 52 42 59 5f 4e 4f 52 4d 41 4c 3b 20 20 20  DERBY_NORMAL;   
1eb20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1eb30 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2a 70 70   value */..  *pp
1eb40 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 69 66  MinMax = 0;.  if
1eb50 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
1eb60 63 3d 3d 31 20 29 7b 0a 20 20 20 20 45 78 70 72  c==1 ){.    Expr
1eb70 20 2a 70 45 78 70 72 20 3d 20 70 41 67 67 49 6e   *pExpr = pAggIn
1eb80 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 45 78  fo->aFunc[0].pEx
1eb90 70 72 3b 20 2f 2a 20 41 67 67 72 65 67 61 74 65  pr; /* Aggregate
1eba0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
1ebb0 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1ebc0 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
1ebd0 73 74 3b 20 20 20 20 20 20 2f 2a 20 41 72 67 75  st;      /* Argu
1ebe0 6d 65 6e 74 73 20 74 6f 20 61 67 67 20 66 75 6e  ments to agg fun
1ebf0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 61 73  ction */..    as
1ec00 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
1ec10 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
1ec20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69   );.    if( pELi
1ec30 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
1ec40 78 70 72 3d 3d 31 20 26 26 20 70 45 4c 69 73 74  xpr==1 && pEList
1ec50 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70  ->a[0].pExpr->op
1ec60 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
1ec70 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1ec80 68 61 72 20 2a 7a 46 75 6e 63 20 3d 20 70 45 78  har *zFunc = pEx
1ec90 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
1eca0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1ecb0 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22 6d  trICmp(zFunc, "m
1ecc0 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
1ecd0 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45 5f     eRet = WHERE_
1ece0 4f 52 44 45 52 42 59 5f 4d 49 4e 3b 0a 20 20 20  ORDERBY_MIN;.   
1ecf0 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20 3d       *ppMinMax =
1ed00 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d   pEList;.      }
1ed10 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1ed20 53 74 72 49 43 6d 70 28 7a 46 75 6e 63 2c 20 22  StrICmp(zFunc, "
1ed30 6d 61 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  max")==0 ){.    
1ed40 20 20 20 20 65 52 65 74 20 3d 20 57 48 45 52 45      eRet = WHERE
1ed50 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20 20  _ORDERBY_MAX;.  
1ed60 20 20 20 20 20 20 2a 70 70 4d 69 6e 4d 61 78 20        *ppMinMax 
1ed70 3d 20 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  = pEList;.      
1ed80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  }.    }.  }..  a
1ed90 73 73 65 72 74 28 20 2a 70 70 4d 69 6e 4d 61 78  ssert( *ppMinMax
1eda0 3d 3d 30 20 7c 7c 20 28 2a 70 70 4d 69 6e 4d 61  ==0 || (*ppMinMa
1edb0 78 29 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 0a  x)->nExpr==1 );.
1edc0 20 20 72 65 74 75 72 6e 20 65 52 65 74 3b 0a 7d    return eRet;.}
1edd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 6c 65  ../*.** The sele
1ede0 63 74 20 73 74 61 74 65 6d 65 6e 74 20 70 61 73  ct statement pas
1edf0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1ee00 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1ee10 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 2e  aggregate query.
1ee20 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1ee30 72 67 6d 65 6e 74 20 69 73 20 74 68 65 20 61 73  rgment is the as
1ee40 73 6f 63 69 61 74 65 64 20 61 67 67 72 65 67 61  sociated aggrega
1ee50 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63 74 2e 20  te-info object. 
1ee60 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  This .** functio
1ee70 6e 20 74 65 73 74 73 20 69 66 20 74 68 65 20 53  n tests if the S
1ee80 45 4c 45 43 54 20 69 73 20 6f 66 20 74 68 65 20  ELECT is of the 
1ee90 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 53 45  form:.**.**   SE
1eea0 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1eeb0 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a 2a 20 77  OM <tbl>.**.** w
1eec0 68 65 72 65 20 74 61 62 6c 65 20 69 73 20 61 20  here table is a 
1eed0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2c 20  database table, 
1eee0 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c 65 63 74  not a sub-select
1eef0 20 6f 72 20 76 69 65 77 2e 20 49 66 20 74 68 65   or view. If the
1ef00 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65 73 20 6d   query.** does m
1ef10 61 74 63 68 20 74 68 69 73 20 70 61 74 74 65 72  atch this patter
1ef20 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65  n, then a pointe
1ef30 72 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  r to the Table o
1ef40 62 6a 65 63 74 20 72 65 70 72 65 73 65 6e 74 69  bject representi
1ef50 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69 73 20 72  ng.** <tbl> is r
1ef60 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1ef70 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
1ef80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 61 62  d..*/.static Tab
1ef90 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43 6f 75 6e  le *isSimpleCoun
1efa0 74 28 53 65 6c 65 63 74 20 2a 70 2c 20 41 67 67  t(Select *p, Agg
1efb0 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29 7b  Info *pAggInfo){
1efc0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
1efd0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 0a    Expr *pExpr;..
1efe0 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 47    assert( !p->pG
1eff0 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20 69 66 28  roupBy );..  if(
1f000 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c 20 70 2d   p->pWhere || p-
1f010 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
1f020 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70 53 72 63  1 .   || p->pSrc
1f030 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20 70 2d 3e  ->nSrc!=1 || p->
1f040 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
1f050 63 74 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  ct.  ){.    retu
1f060 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rn 0;.  }.  pTab
1f070 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d   = p->pSrc->a[0]
1f080 2e 70 54 61 62 3b 0a 20 20 70 45 78 70 72 20 3d  .pTab;.  pExpr =
1f090 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d   p->pEList->a[0]
1f0a0 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74  .pExpr;.  assert
1f0b0 28 20 70 54 61 62 20 26 26 20 21 70 54 61 62 2d  ( pTab && !pTab-
1f0c0 3e 70 53 65 6c 65 63 74 20 26 26 20 70 45 78 70  >pSelect && pExp
1f0d0 72 20 29 3b 0a 0a 20 20 69 66 28 20 49 73 56 69  r );..  if( IsVi
1f0e0 72 74 75 61 6c 28 70 54 61 62 29 20 29 20 72 65  rtual(pTab) ) re
1f0f0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 45  turn 0;.  if( pE
1f100 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f  xpr->op!=TK_AGG_
1f110 46 55 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72  FUNCTION ) retur
1f120 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52  n 0;.  if( NEVER
1f130 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63  (pAggInfo->nFunc
1f140 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ==0) ) return 0;
1f150 0a 20 20 69 66 28 20 28 70 41 67 67 49 6e 66 6f  .  if( (pAggInfo
1f160 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46 75 6e 63  ->aFunc[0].pFunc
1f170 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
1f180 54 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d  TE_FUNC_COUNT)==
1f190 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1f1a0 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
1f1b0 26 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72  &EP_Distinct ) r
1f1c0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75  eturn 0;..  retu
1f1d0 72 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pTab;.}../*.*
1f1e0 2a 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d  * If the source-
1f1f0 6c 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64  list item passed
1f200 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
1f210 77 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69  was augmented wi
1f220 74 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44  th an.** INDEXED
1f230 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
1f240 20 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74   try to locate t
1f250 68 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64  he specified ind
1f260 65 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  ex. If there.** 
1f270 77 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73  was such a claus
1f280 65 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20  e and the named 
1f290 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20  index cannot be 
1f2a0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a  found, return .*
1f2b0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61  * SQLITE_ERROR a
1f2c0 6e 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  nd leave an erro
1f2d0 72 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68  r in pParse. Oth
1f2e0 65 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65  erwise, populate
1f2f0 20 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64   .** pFrom->pInd
1f300 65 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ex and return SQ
1f310 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20  LITE_OK..*/.int 
1f320 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79  sqlite3IndexedBy
1f330 4c 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50  Lookup(Parse *pP
1f340 61 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63  arse, struct Src
1f350 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
1f360 29 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  ){.  if( pFrom->
1f370 70 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a  pTab && pFrom->z
1f380 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62  Index ){.    Tab
1f390 6c 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d  le *pTab = pFrom
1f3a0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72  ->pTab;.    char
1f3b0 20 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d   *zIndex = pFrom
1f3c0 2d 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e  ->zIndex;.    In
1f3d0 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
1f3e0 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
1f3f0 6e 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70  ndex; .        p
1f400 49 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74  Idx && sqlite3St
1f410 72 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d  rICmp(pIdx->zNam
1f420 65 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20  e, zIndex); .   
1f430 20 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e       pIdx=pIdx->
1f440 70 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20  pNext.    );.   
1f450 20 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20   if( !pIdx ){.  
1f460 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1f470 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
1f480 73 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c  such index: %s",
1f490 20 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20   zIndex, 0);.   
1f4a0 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
1f4b0 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
1f4c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f4d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
1f4e0 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d   pFrom->pIndex =
1f4f0 20 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74   pIdx;.  }.  ret
1f500 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f510 0a 2f 2a 0a 2a 2a 20 44 65 74 65 63 74 20 63 6f  ./*.** Detect co
1f520 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
1f530 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 75 73  atements that us
1f540 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  e an ORDER BY cl
1f550 61 75 73 65 20 77 69 74 68 20 0a 2a 2a 20 61 6e  ause with .** an
1f560 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 6f 6c   alternative col
1f570 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
1f580 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
1f590 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 45 58 43   ... FROM t1 EXC
1f5a0 45 50 54 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  EPT SELECT ... F
1f5b0 52 4f 4d 20 74 32 20 4f 52 44 45 52 20 42 59 20  ROM t2 ORDER BY 
1f5c0 2e 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a  .. COLLATE ....*
1f5d0 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 72  *.** These are r
1f5e0 65 77 72 69 74 74 65 6e 20 61 73 20 61 20 73 75  ewritten as a su
1f5f0 62 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20  bquery:.**.**   
1f600 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 28   SELECT * FROM (
1f610 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20  SELECT ... FROM 
1f620 74 31 20 45 58 43 45 50 54 20 53 45 4c 45 43 54  t1 EXCEPT SELECT
1f630 20 2e 2e 2e 20 46 52 4f 4d 20 74 32 29 0a 2a 2a   ... FROM t2).**
1f640 20 20 20 20 20 4f 52 44 45 52 20 42 59 20 2e 2e       ORDER BY ..
1f650 2e 20 43 4f 4c 4c 41 54 45 20 2e 2e 2e 0a 2a 2a  . COLLATE ....**
1f660 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
1f670 72 6d 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  rmation is neces
1f680 73 61 72 79 20 62 65 63 61 75 73 65 20 74 68 65  sary because the
1f690 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65   multiSelectOrde
1f6a0 72 42 79 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  rBy() routine.**
1f6b0 20 61 62 6f 76 65 20 74 68 61 74 20 67 65 6e 65   above that gene
1f6c0 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66  rates the code f
1f6d0 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  or a compound SE
1f6e0 4c 45 43 54 20 77 69 74 68 20 61 6e 20 4f 52 44  LECT with an ORD
1f6f0 45 52 20 42 59 20 63 6c 61 75 73 65 0a 2a 2a 20  ER BY clause.** 
1f700 75 73 65 73 20 61 20 6d 65 72 67 65 20 61 6c 67  uses a merge alg
1f710 6f 72 69 74 68 6d 20 74 68 61 74 20 72 65 71 75  orithm that requ
1f720 69 72 65 73 20 74 68 65 20 73 61 6d 65 20 63 6f  ires the same co
1f730 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1f740 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   on the.** resul
1f750 74 20 63 6f 6c 75 6d 6e 73 20 61 73 20 6f 6e 20  t columns as on 
1f760 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1f770 75 73 65 2e 20 20 53 65 65 20 74 69 63 6b 65 74  use.  See ticket
1f780 0a 2a 2a 20 68 74 74 70 3a 2f 2f 77 77 77 2e 73  .** http://www.s
1f790 71 6c 69 74 65 2e 6f 72 67 2f 73 72 63 2f 69 6e  qlite.org/src/in
1f7a0 66 6f 2f 36 37 30 39 35 37 34 64 32 61 0a 2a 2a  fo/6709574d2a.**
1f7b0 0a 2a 2a 20 54 68 69 73 20 74 72 61 6e 73 66 6f  .** This transfo
1f7c0 72 6d 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  rmation is only 
1f7d0 6e 65 65 64 65 64 20 66 6f 72 20 45 58 43 45 50  needed for EXCEP
1f7e0 54 2c 20 49 4e 54 45 52 53 45 43 54 2c 20 61 6e  T, INTERSECT, an
1f7f0 64 20 55 4e 49 4f 4e 2e 0a 2a 2a 20 54 68 65 20  d UNION..** The 
1f800 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65 72 61 74  UNION ALL operat
1f810 6f 72 20 77 6f 72 6b 73 20 66 69 6e 65 20 77 69  or works fine wi
1f820 74 68 20 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72  th multiSelectOr
1f830 64 65 72 42 79 28 29 20 65 76 65 6e 20 77 68 65  derBy() even whe
1f840 6e 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20 43  n.** there are C
1f850 4f 4c 4c 41 54 45 20 74 65 72 6d 73 20 69 6e 20  OLLATE terms in 
1f860 74 68 65 20 4f 52 44 45 52 20 42 59 2e 0a 2a 2f  the ORDER BY..*/
1f870 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6e 76  .static int conv
1f880 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
1f890 74 54 6f 53 75 62 71 75 65 72 79 28 57 61 6c 6b  tToSubquery(Walk
1f8a0 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
1f8b0 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ect *p){.  int i
1f8c0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  ;.  Select *pNew
1f8d0 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70 58 3b 0a  ;.  Select *pX;.
1f8e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1f8f0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1f900 5f 69 74 65 6d 20 2a 61 3b 0a 20 20 53 72 63 4c  _item *a;.  SrcL
1f910 69 73 74 20 2a 70 4e 65 77 53 72 63 3b 0a 20 20  ist *pNewSrc;.  
1f920 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 20  Parse *pParse;. 
1f930 20 54 6f 6b 65 6e 20 64 75 6d 6d 79 3b 0a 0a 20   Token dummy;.. 
1f940 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d   if( p->pPrior==
1f950 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43  0 ) return WRC_C
1f960 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 66 28 20 70  ontinue;.  if( p
1f970 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ->pOrderBy==0 ) 
1f980 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
1f990 6e 75 65 3b 0a 20 20 66 6f 72 28 70 58 3d 70 3b  nue;.  for(pX=p;
1f9a0 20 70 58 20 26 26 20 28 70 58 2d 3e 6f 70 3d 3d   pX && (pX->op==
1f9b0 54 4b 5f 41 4c 4c 20 7c 7c 20 70 58 2d 3e 6f 70  TK_ALL || pX->op
1f9c0 3d 3d 54 4b 5f 53 45 4c 45 43 54 29 3b 20 70 58  ==TK_SELECT); pX
1f9d0 3d 70 58 2d 3e 70 50 72 69 6f 72 29 7b 7d 0a 20  =pX->pPrior){}. 
1f9e0 20 69 66 28 20 70 58 3d 3d 30 20 29 20 72 65 74   if( pX==0 ) ret
1f9f0 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
1fa00 3b 0a 20 20 61 20 3d 20 70 2d 3e 70 4f 72 64 65  ;.  a = p->pOrde
1fa10 72 42 79 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  rBy->a;.  for(i=
1fa20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  p->pOrderBy->nEx
1fa30 70 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  pr-1; i>=0; i--)
1fa40 7b 0a 20 20 20 20 69 66 28 20 61 5b 69 5d 2e 70  {.    if( a[i].p
1fa50 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50  Expr->flags & EP
1fa60 5f 43 6f 6c 6c 61 74 65 20 29 20 62 72 65 61 6b  _Collate ) break
1fa70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3c 30 20  ;.  }.  if( i<0 
1fa80 29 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e  ) return WRC_Con
1fa90 74 69 6e 75 65 3b 0a 0a 20 20 2f 2a 20 49 66 20  tinue;..  /* If 
1faa0 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
1fab0 69 6e 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  int, that means 
1fac0 74 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  the transformati
1fad0 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  on is required. 
1fae0 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
1faf0 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
1fb00 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1fb10 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  b;.  pNew = sqli
1fb20 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1fb30 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  db, sizeof(*pNew
1fb40 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
1fb50 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  =0 ) return WRC_
1fb60 41 62 6f 72 74 3b 0a 20 20 6d 65 6d 73 65 74 28  Abort;.  memset(
1fb70 26 64 75 6d 6d 79 2c 20 30 2c 20 73 69 7a 65 6f  &dummy, 0, sizeo
1fb80 66 28 64 75 6d 6d 79 29 29 3b 0a 20 20 70 4e 65  f(dummy));.  pNe
1fb90 77 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  wSrc = sqlite3Sr
1fba0 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
1fbb0 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
1fbc0 2c 26 64 75 6d 6d 79 2c 70 4e 65 77 2c 30 2c 30  ,&dummy,pNew,0,0
1fbd0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 53 72 63  );.  if( pNewSrc
1fbe0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57 52 43  ==0 ) return WRC
1fbf0 5f 41 62 6f 72 74 3b 0a 20 20 2a 70 4e 65 77 20  _Abort;.  *pNew 
1fc00 3d 20 2a 70 3b 0a 20 20 70 2d 3e 70 53 72 63 20  = *p;.  p->pSrc 
1fc10 3d 20 70 4e 65 77 53 72 63 3b 0a 20 20 70 2d 3e  = pNewSrc;.  p->
1fc20 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
1fc30 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1fc40 50 61 72 73 65 2c 20 30 2c 20 73 71 6c 69 74 65  Parse, 0, sqlite
1fc50 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 41 4c 4c  3Expr(db, TK_ALL
1fc60 2c 20 30 29 29 3b 0a 20 20 70 2d 3e 6f 70 20 3d  , 0));.  p->op =
1fc70 20 54 4b 5f 53 45 4c 45 43 54 3b 0a 20 20 70 2d   TK_SELECT;.  p-
1fc80 3e 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 70  >pWhere = 0;.  p
1fc90 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
1fca0 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69  0;.  pNew->pHavi
1fcb0 6e 67 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  ng = 0;.  pNew->
1fcc0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
1fcd0 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
1fce0 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
1fcf0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20   p->selFlags &= 
1fd00 7e 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20  ~SF_Compound;.  
1fd10 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 50  assert( pNew->pP
1fd20 72 69 6f 72 21 3d 30 20 29 3b 0a 20 20 70 4e 65  rior!=0 );.  pNe
1fd30 77 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  w->pPrior->pNext
1fd40 20 3d 20 70 4e 65 77 3b 0a 20 20 70 4e 65 77 2d   = pNew;.  pNew-
1fd50 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 70  >pLimit = 0;.  p
1fd60 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30  New->pOffset = 0
1fd70 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  ;.  return WRC_C
1fd80 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 23 69 66 6e  ontinue;.}..#ifn
1fd90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fda0 43 54 45 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  CTE./*.** Argume
1fdb0 6e 74 20 70 57 69 74 68 20 28 77 68 69 63 68 20  nt pWith (which 
1fdc0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 70 6f 69  may be NULL) poi
1fdd0 6e 74 73 20 74 6f 20 61 20 6c 69 6e 6b 65 64 20  nts to a linked 
1fde0 6c 69 73 74 20 6f 66 20 6e 65 73 74 65 64 20 0a  list of nested .
1fdf0 2a 2a 20 57 49 54 48 20 63 6f 6e 74 65 78 74 73  ** WITH contexts
1fe00 2c 20 66 72 6f 6d 20 69 6e 6e 65 72 20 74 6f 20  , from inner to 
1fe10 6f 75 74 65 72 6d 6f 73 74 2e 20 49 66 20 74 68  outermost. If th
1fe20 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
1fe30 65 64 20 62 79 20 0a 2a 2a 20 46 52 4f 4d 20 63  ed by .** FROM c
1fe40 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 70 49  lause element pI
1fe50 74 65 6d 20 69 73 20 72 65 61 6c 6c 79 20 61 20  tem is really a 
1fe60 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 2d 65 78 70  common-table-exp
1fe70 72 65 73 73 69 6f 6e 20 28 43 54 45 29 20 0a 2a  ression (CTE) .*
1fe80 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20  * then return a 
1fe90 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43  pointer to the C
1fea0 54 45 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f  TE definition fo
1feb0 72 20 74 68 61 74 20 74 61 62 6c 65 2e 20 4f 74  r that table. Ot
1fec0 68 65 72 77 69 73 65 0a 2a 2a 20 72 65 74 75 72  herwise.** retur
1fed0 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66  n NULL..**.** If
1fee0 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
1fef0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 73  e is returned, s
1ff00 65 74 20 2a 70 70 43 6f 6e 74 65 78 74 20 74 6f  et *ppContext to
1ff10 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 57 69   point to the Wi
1ff20 74 68 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  th.** object tha
1ff30 74 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 43  t the returned C
1ff40 54 45 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 2a  TE belongs to..*
1ff50 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
1ff60 43 74 65 20 2a 73 65 61 72 63 68 57 69 74 68 28  Cte *searchWith(
1ff70 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
1ff80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff90 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 75     /* Current ou
1ffa0 74 65 72 6d 6f 73 74 20 57 49 54 48 20 63 6c 61  termost WITH cla
1ffb0 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1ffc0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1ffd0 74 65 6d 2c 20 20 20 20 20 2f 2a 20 46 52 4f 4d  tem,     /* FROM
1ffe0 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
1fff0 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
20000 57 69 74 68 20 2a 2a 70 70 43 6f 6e 74 65 78 74  With **ppContext
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20020 2f 2a 20 4f 55 54 3a 20 57 49 54 48 20 63 6c 61  /* OUT: WITH cla
20030 75 73 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  use return value
20040 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 29   belongs to */.)
20050 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
20060 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 49 74  zName;.  if( pIt
20070 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30  em->zDatabase==0
20080 20 26 26 20 28 7a 4e 61 6d 65 20 3d 20 70 49 74   && (zName = pIt
20090 65 6d 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  em->zName)!=0 ){
200a0 0a 20 20 20 20 57 69 74 68 20 2a 70 3b 0a 20 20  .    With *p;.  
200b0 20 20 66 6f 72 28 70 3d 70 57 69 74 68 3b 20 70    for(p=pWith; p
200c0 3b 20 70 3d 70 2d 3e 70 4f 75 74 65 72 29 7b 0a  ; p=p->pOuter){.
200d0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
200e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
200f0 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
20100 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
20110 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
20120 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
20130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   ){.          *p
20140 70 43 6f 6e 74 65 78 74 20 3d 20 70 3b 0a 20 20  pContext = p;.  
20150 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 26          return &
20160 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 20  p->a[i];.       
20170 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
20180 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
20190 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 64 65 20  .}../* The code 
201a0 67 65 6e 65 72 61 74 6f 72 20 6d 61 69 6e 74 61  generator mainta
201b0 69 6e 73 20 61 20 73 74 61 63 6b 20 6f 66 20 61  ins a stack of a
201c0 63 74 69 76 65 20 57 49 54 48 20 63 6c 61 75 73  ctive WITH claus
201d0 65 73 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  es.** with the i
201e0 6e 6e 65 72 2d 6d 6f 73 74 20 57 49 54 48 20 63  nner-most WITH c
201f0 6c 61 75 73 65 20 62 65 69 6e 67 20 61 74 20 74  lause being at t
20200 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
20210 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
20220 72 6f 75 74 69 6e 65 20 70 75 73 68 65 73 20 74  routine pushes t
20230 68 65 20 57 49 54 48 20 63 6c 61 75 73 65 20 70  he WITH clause p
20240 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
20250 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
20260 6f 6e 74 6f 20 74 68 65 20 74 6f 70 20 6f 66 20  onto the top of 
20270 74 68 65 20 73 74 61 63 6b 2e 20 49 66 20 61 72  the stack. If ar
20280 67 75 6d 65 6e 74 20 62 46 72 65 65 20 69 73 20  gument bFree is 
20290 74 72 75 65 2c 20 74 68 65 6e 20 74 68 69 73 0a  true, then this.
202a0 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65 20 77  ** WITH clause w
202b0 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 70 6f 70  ill never be pop
202c0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
202d0 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ck. In this case
202e0 20 69 74 0a 2a 2a 20 73 68 6f 75 6c 64 20 62 65   it.** should be
202f0 20 66 72 65 65 64 20 61 6c 6f 6e 67 20 77 69 74   freed along wit
20300 68 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  h the Parse obje
20310 63 74 2e 20 49 6e 20 6f 74 68 65 72 20 63 61 73  ct. In other cas
20320 65 73 2c 20 77 68 65 6e 0a 2a 2a 20 62 46 72 65  es, when.** bFre
20330 65 3d 3d 30 2c 20 74 68 65 20 57 69 74 68 20 6f  e==0, the With o
20340 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20 66 72  bject will be fr
20350 65 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  eed along with t
20360 68 65 20 53 45 4c 45 43 54 20 0a 2a 2a 20 73 74  he SELECT .** st
20370 61 74 65 6d 65 6e 74 20 77 69 74 68 20 77 68 69  atement with whi
20380 63 68 20 69 74 20 69 73 20 61 73 73 6f 63 69 61  ch it is associa
20390 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ted..*/.void sql
203a0 69 74 65 33 57 69 74 68 50 75 73 68 28 50 61 72  ite3WithPush(Par
203b0 73 65 20 2a 70 50 61 72 73 65 2c 20 57 69 74 68  se *pParse, With
203c0 20 2a 70 57 69 74 68 2c 20 75 38 20 62 46 72 65   *pWith, u8 bFre
203d0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 62 46  e){.  assert( bF
203e0 72 65 65 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ree==0 || pParse
203f0 2d 3e 70 57 69 74 68 3d 3d 30 20 29 3b 0a 20 20  ->pWith==0 );.  
20400 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20  if( pWith ){.   
20410 20 70 57 69 74 68 2d 3e 70 4f 75 74 65 72 20 3d   pWith->pOuter =
20420 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 3b 0a   pParse->pWith;.
20430 20 20 20 20 70 50 61 72 73 65 2d 3e 70 57 69 74      pParse->pWit
20440 68 20 3d 20 70 57 69 74 68 3b 0a 20 20 20 20 70  h = pWith;.    p
20450 50 61 72 73 65 2d 3e 62 46 72 65 65 57 69 74 68  Parse->bFreeWith
20460 20 3d 20 62 46 72 65 65 3b 0a 20 20 7d 0a 7d 0a   = bFree;.  }.}.
20470 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
20480 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 61  tion checks if a
20490 72 67 75 6d 65 6e 74 20 70 46 72 6f 6d 20 72 65  rgument pFrom re
204a0 66 65 72 73 20 74 6f 20 61 20 43 54 45 20 64 65  fers to a CTE de
204b0 63 6c 61 72 65 64 20 62 79 20 0a 2a 2a 20 61 20  clared by .** a 
204c0 57 49 54 48 20 63 6c 61 75 73 65 20 6f 6e 20 74  WITH clause on t
204d0 68 65 20 73 74 61 63 6b 20 63 75 72 72 65 6e 74  he stack current
204e0 6c 79 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79  ly maintained by
204f0 20 74 68 65 20 70 61 72 73 65 72 2e 20 41 6e 64   the parser. And
20500 2c 0a 2a 2a 20 69 66 20 63 75 72 72 65 6e 74 6c  ,.** if currentl
20510 79 20 70 72 6f 63 65 73 73 69 6e 67 20 61 20 43  y processing a C
20520 54 45 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 69  TE expression, i
20530 66 20 69 74 20 69 73 20 61 20 72 65 63 75 72 73  f it is a recurs
20540 69 76 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ive.** reference
20550 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
20560 43 54 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46  CTE..**.** If pF
20570 72 6f 6d 20 66 61 6c 6c 73 20 69 6e 74 6f 20 65  rom falls into e
20580 69 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  ither of the two
20590 20 63 61 74 65 67 6f 72 69 65 73 20 61 62 6f 76   categories abov
205a0 65 2c 20 70 46 72 6f 6d 2d 3e 70 54 61 62 0a 2a  e, pFrom->pTab.*
205b0 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
205c0 64 73 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64  ds are populated
205d0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 54 68   accordingly. Th
205e0 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
205f0 63 68 65 63 6b 0a 2a 2a 20 28 70 46 72 6f 6d 2d  check.** (pFrom-
20600 3e 70 54 61 62 21 3d 30 29 20 74 6f 20 64 65 74  >pTab!=0) to det
20610 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
20620 72 20 6e 6f 74 20 61 20 73 75 63 63 65 73 73 66  r not a successf
20630 75 6c 20 6d 61 74 63 68 0a 2a 2a 20 77 61 73 20  ul match.** was 
20640 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  found..**.** Whe
20650 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 6d 61  ther or not a ma
20660 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 53 51  tch is found, SQ
20670 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
20680 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 0a  ned if no error.
20690 2a 2a 20 6f 63 63 75 72 73 2e 20 49 66 20 61 6e  ** occurs. If an
206a0 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
206b0 72 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  r, an error mess
206c0 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
206d0 20 74 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 61   the.** parser a
206e0 6e 64 20 73 6f 6d 65 20 65 72 72 6f 72 20 63 6f  nd some error co
206f0 64 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  de other than SQ
20700 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
20710 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20720 77 69 74 68 45 78 70 61 6e 64 28 0a 20 20 57 61  withExpand(.  Wa
20730 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 0a  lker *pWalker, .
20740 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
20750 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 0a 29 7b 0a  _item *pFrom.){.
20760 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
20770 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  = pWalker->pPars
20780 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
20790 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
207a0 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74   struct Cte *pCt
207b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
207c0 20 2f 2a 20 4d 61 74 63 68 65 64 20 43 54 45 20   /* Matched CTE 
207d0 28 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 6d  (or NULL if no m
207e0 61 74 63 68 29 20 2a 2f 0a 20 20 57 69 74 68 20  atch) */.  With 
207f0 2a 70 57 69 74 68 3b 20 20 20 20 20 20 20 20 20  *pWith;         
20800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49             /* WI
20810 54 48 20 63 6c 61 75 73 65 20 74 68 61 74 20 70  TH clause that p
20820 43 74 65 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  Cte belongs to *
20830 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72  /..  assert( pFr
20840 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29 3b 0a 0a  om->pTab==0 );..
20850 20 20 70 43 74 65 20 3d 20 73 65 61 72 63 68 57    pCte = searchW
20860 69 74 68 28 70 50 61 72 73 65 2d 3e 70 57 69 74  ith(pParse->pWit
20870 68 2c 20 70 46 72 6f 6d 2c 20 26 70 57 69 74 68  h, pFrom, &pWith
20880 29 3b 0a 20 20 69 66 28 20 70 43 74 65 20 29 7b  );.  if( pCte ){
20890 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
208a0 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a  ;.    ExprList *
208b0 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 65 6c 65  pEList;.    Sele
208c0 63 74 20 2a 70 53 65 6c 3b 0a 20 20 20 20 53 65  ct *pSel;.    Se
208d0 6c 65 63 74 20 2a 70 4c 65 66 74 3b 20 20 20 20  lect *pLeft;    
208e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
208f0 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  eft-most SELECT 
20900 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
20910 20 69 6e 74 20 62 4d 61 79 52 65 63 75 72 73 69   int bMayRecursi
20920 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ve;            /
20930 2a 20 54 72 75 65 20 69 66 20 63 6f 6d 70 6f 75  * True if compou
20940 6e 64 20 6a 6f 69 6e 65 64 20 62 79 20 55 4e 49  nd joined by UNI
20950 4f 4e 20 5b 41 4c 4c 5d 20 2a 2f 0a 20 20 20 20  ON [ALL] */.    
20960 57 69 74 68 20 2a 70 53 61 76 65 64 57 69 74 68  With *pSavedWith
20970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
20980 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f   Initial value o
20990 66 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20  f pParse->pWith 
209a0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43  */..    /* If pC
209b0 74 65 2d 3e 7a 45 72 72 20 69 73 20 6e 6f 6e 2d  te->zErr is non-
209c0 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
209d0 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73  nt, then this is
209e0 20 61 6e 20 69 6c 6c 65 67 61 6c 0a 20 20 20 20   an illegal.    
209f0 2a 2a 20 72 65 63 75 72 73 69 76 65 20 72 65 66  ** recursive ref
20a00 65 72 65 6e 63 65 20 74 6f 20 43 54 45 20 70 43  erence to CTE pC
20a10 74 65 2e 20 4c 65 61 76 65 20 61 6e 20 65 72 72  te. Leave an err
20a20 6f 72 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  or in pParse and
20a30 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 65   return.    ** e
20a40 61 72 6c 79 2e 20 49 66 20 70 43 74 65 2d 3e 7a  arly. If pCte->z
20a50 45 72 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  Err is NULL, the
20a60 6e 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  n this is not a 
20a70 72 65 63 75 72 73 69 76 65 20 72 65 66 65 72 65  recursive refere
20a80 6e 63 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  nce..    ** In t
20a90 68 69 73 20 63 61 73 65 2c 20 70 72 6f 63 65 65  his case, procee
20aa0 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
20ab0 43 74 65 2d 3e 7a 45 72 72 20 29 7b 0a 20 20 20  Cte->zErr ){.   
20ac0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20ad0 73 67 28 70 50 61 72 73 65 2c 20 70 43 74 65 2d  sg(pParse, pCte-
20ae0 3e 7a 45 72 72 2c 20 70 43 74 65 2d 3e 7a 4e 61  >zErr, pCte->zNa
20af0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
20b00 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
20b10 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
20b20 74 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d  t( pFrom->pTab==
20b30 30 20 29 3b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e  0 );.    pFrom->
20b40 70 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71  pTab = pTab = sq
20b50 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
20b60 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
20b70 6c 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 54  le));.    if( pT
20b80 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 57  ab==0 ) return W
20b90 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 70 54  RC_Abort;.    pT
20ba0 61 62 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ab->nRef = 1;.  
20bb0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20    pTab->zName = 
20bc0 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
20bd0 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29  db, pCte->zName)
20be0 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  ;.    pTab->iPKe
20bf0 79 20 3d 20 2d 31 3b 0a 20 20 20 20 70 54 61 62  y = -1;.    pTab
20c00 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38  ->nRowEst = 1048
20c10 35 37 36 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74  576;.    pTab->t
20c20 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
20c30 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 70 46 72  hemeral;.    pFr
20c40 6f 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  om->pSelect = sq
20c50 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
20c60 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74  b, pCte->pSelect
20c70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
20c80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
20c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
20ca0 4f 4d 45 4d 3b 0a 20 20 20 20 61 73 73 65 72 74  OMEM;.    assert
20cb0 28 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74  ( pFrom->pSelect
20cc0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   );..    /* Chec
20cd0 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72  k if this is a r
20ce0 65 63 75 72 73 69 76 65 20 43 54 45 2e 20 2a 2f  ecursive CTE. */
20cf0 0a 20 20 20 20 70 53 65 6c 20 3d 20 70 46 72 6f  .    pSel = pFro
20d00 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  m->pSelect;.    
20d10 62 4d 61 79 52 65 63 75 72 73 69 76 65 20 3d 20  bMayRecursive = 
20d20 28 20 70 53 65 6c 2d 3e 6f 70 3d 3d 54 4b 5f 41  ( pSel->op==TK_A
20d30 4c 4c 20 7c 7c 20 70 53 65 6c 2d 3e 6f 70 3d 3d  LL || pSel->op==
20d40 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20 20  TK_UNION );.    
20d50 69 66 28 20 62 4d 61 79 52 65 63 75 72 73 69 76  if( bMayRecursiv
20d60 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  e ){.      int i
20d70 3b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  ;.      SrcList 
20d80 2a 70 53 72 63 20 3d 20 70 46 72 6f 6d 2d 3e 70  *pSrc = pFrom->p
20d90 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20  Select->pSrc;.  
20da0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
20db0 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
20dc0 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
20dd0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
20de0 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
20df0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
20e00 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d  Item->zDatabase=
20e10 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
20e20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 21 3d 30 20  pItem->zName!=0 
20e30 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d  .         && 0==
20e40 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
20e50 49 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 43 74  Item->zName, pCt
20e60 65 2d 3e 7a 4e 61 6d 65 29 0a 20 20 20 20 20 20  e->zName).      
20e70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
20e80 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70   pItem->pTab = p
20e90 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Tab;.          p
20ea0 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69 76  Item->isRecursiv
20eb0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
20ec0 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b 0a 20   pTab->nRef++;. 
20ed0 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 73           pSel->s
20ee0 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
20ef0 63 75 72 73 69 76 65 3b 0a 20 20 20 20 20 20 20  cursive;.       
20f00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
20f10 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e  ..    /* Only on
20f20 65 20 72 65 63 75 72 73 69 76 65 20 72 65 66 65  e recursive refe
20f30 72 65 6e 63 65 20 69 73 20 70 65 72 6d 69 74 74  rence is permitt
20f40 65 64 2e 20 2a 2f 20 0a 20 20 20 20 69 66 28 20  ed. */ .    if( 
20f50 70 54 61 62 2d 3e 6e 52 65 66 3e 32 20 29 7b 0a  pTab->nRef>2 ){.
20f60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
20f70 6f 72 4d 73 67 28 0a 20 20 20 20 20 20 20 20 20  orMsg(.         
20f80 20 70 50 61 72 73 65 2c 20 22 6d 75 6c 74 69 70   pParse, "multip
20f90 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  le references to
20fa0 20 72 65 63 75 72 73 69 76 65 20 74 61 62 6c 65   recursive table
20fb0 3a 20 25 73 22 2c 20 70 43 74 65 2d 3e 7a 4e 61  : %s", pCte->zNa
20fc0 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
20fd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20fe0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
20ff0 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
21000 52 65 66 3d 3d 31 20 7c 7c 20 28 28 70 53 65 6c  Ref==1 || ((pSel
21010 2d 3e 73 65 6c 46 6c 61 67 73 26 53 46 5f 52 65  ->selFlags&SF_Re
21020 63 75 72 73 69 76 65 29 20 26 26 20 70 54 61 62  cursive) && pTab
21030 2d 3e 6e 52 65 66 3d 3d 32 20 29 29 3b 0a 0a 20  ->nRef==2 ));.. 
21040 20 20 20 70 43 74 65 2d 3e 7a 45 72 72 20 3d 20     pCte->zErr = 
21050 22 63 69 72 63 75 6c 61 72 20 72 65 66 65 72 65  "circular refere
21060 6e 63 65 3a 20 25 73 22 3b 0a 20 20 20 20 70 53  nce: %s";.    pS
21070 61 76 65 64 57 69 74 68 20 3d 20 70 50 61 72 73  avedWith = pPars
21080 65 2d 3e 70 57 69 74 68 3b 0a 20 20 20 20 70 50  e->pWith;.    pP
21090 61 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 57  arse->pWith = pW
210a0 69 74 68 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ith;.    sqlite3
210b0 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
210c0 65 72 2c 20 62 4d 61 79 52 65 63 75 72 73 69 76  er, bMayRecursiv
210d0 65 20 3f 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  e ? pSel->pPrior
210e0 20 3a 20 70 53 65 6c 29 3b 0a 0a 20 20 20 20 66   : pSel);..    f
210f0 6f 72 28 70 4c 65 66 74 3d 70 53 65 6c 3b 20 70  or(pLeft=pSel; p
21100 4c 65 66 74 2d 3e 70 50 72 69 6f 72 3b 20 70 4c  Left->pPrior; pL
21110 65 66 74 3d 70 4c 65 66 74 2d 3e 70 50 72 69 6f  eft=pLeft->pPrio
21120 72 29 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d  r);.    pEList =
21130 20 70 4c 65 66 74 2d 3e 70 45 4c 69 73 74 3b 0a   pLeft->pEList;.
21140 20 20 20 20 69 66 28 20 70 43 74 65 2d 3e 70 43      if( pCte->pC
21150 6f 6c 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ols ){.      if(
21160 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d   pEList->nExpr!=
21170 70 43 74 65 2d 3e 70 43 6f 6c 73 2d 3e 6e 45 78  pCte->pCols->nEx
21180 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  pr ){.        sq
21190 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
211a0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
211b0 68 61 73 20 25 64 20 76 61 6c 75 65 73 20 66 6f  has %d values fo
211c0 72 20 25 64 20 63 6f 6c 75 6d 6e 73 22 2c 0a 20  r %d columns",. 
211d0 20 20 20 20 20 20 20 20 20 20 20 70 43 74 65 2d             pCte-
211e0 3e 7a 4e 61 6d 65 2c 20 70 45 4c 69 73 74 2d 3e  >zName, pEList->
211f0 6e 45 78 70 72 2c 20 70 43 74 65 2d 3e 70 43 6f  nExpr, pCte->pCo
21200 6c 73 2d 3e 6e 45 78 70 72 0a 20 20 20 20 20 20  ls->nExpr.      
21210 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61    );.        pPa
21220 72 73 65 2d 3e 70 57 69 74 68 20 3d 20 70 53 61  rse->pWith = pSa
21230 76 65 64 57 69 74 68 3b 0a 20 20 20 20 20 20 20  vedWith;.       
21240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
21250 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
21260 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 43 74      pEList = pCt
21270 65 2d 3e 70 43 6f 6c 73 3b 0a 20 20 20 20 7d 0a  e->pCols;.    }.
21280 0a 20 20 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  .    selectColum
21290 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
212a0 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 26  Parse, pEList, &
212b0 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  pTab->nCol, &pTa
212c0 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 69 66  b->aCol);.    if
212d0 28 20 62 4d 61 79 52 65 63 75 72 73 69 76 65 20  ( bMayRecursive 
212e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  ){.      if( pSe
212f0 6c 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  l->selFlags & SF
21300 5f 52 65 63 75 72 73 69 76 65 20 29 7b 0a 20 20  _Recursive ){.  
21310 20 20 20 20 20 20 70 43 74 65 2d 3e 7a 45 72 72        pCte->zErr
21320 20 3d 20 22 6d 75 6c 74 69 70 6c 65 20 72 65 63   = "multiple rec
21330 75 72 73 69 76 65 20 72 65 66 65 72 65 6e 63 65  ursive reference
21340 73 3a 20 25 73 22 3b 0a 20 20 20 20 20 20 7d 65  s: %s";.      }e
21350 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
21360 65 2d 3e 7a 45 72 72 20 3d 20 22 72 65 63 75 72  e->zErr = "recur
21370 73 69 76 65 20 72 65 66 65 72 65 6e 63 65 20 69  sive reference i
21380 6e 20 61 20 73 75 62 71 75 65 72 79 3a 20 25 73  n a subquery: %s
21390 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ";.      }.     
213a0 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
213b0 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 53 65 6c  ct(pWalker, pSel
213c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 74  );.    }.    pCt
213d0 65 2d 3e 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20  e->zErr = 0;.   
213e0 20 70 50 61 72 73 65 2d 3e 70 57 69 74 68 20 3d   pParse->pWith =
213f0 20 70 53 61 76 65 64 57 69 74 68 3b 0a 20 20 7d   pSavedWith;.  }
21400 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
21410 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
21420 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21430 4d 49 54 5f 43 54 45 0a 2f 2a 0a 2a 2a 20 49 66  MIT_CTE./*.** If
21440 20 74 68 65 20 53 45 4c 45 43 54 20 70 61 73 73   the SELECT pass
21450 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
21460 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 6e   argument has an
21470 20 61 73 73 6f 63 69 61 74 65 64 20 57 49 54 48   associated WITH
21480 20 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 70 6f 70   .** clause, pop
21490 20 69 74 20 66 72 6f 6d 20 74 68 65 20 73 74 61   it from the sta
214a0 63 6b 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  ck stored as par
214b0 74 20 6f 66 20 74 68 65 20 50 61 72 73 65 20 6f  t of the Parse o
214c0 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bject..**.** Thi
214d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
214e0 65 64 20 61 73 20 74 68 65 20 78 53 65 6c 65 63  ed as the xSelec
214f0 74 43 61 6c 6c 62 61 63 6b 32 28 29 20 63 61 6c  tCallback2() cal
21500 6c 62 61 63 6b 20 62 79 0a 2a 2a 20 73 71 6c 69  lback by.** sqli
21510 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
21520 29 20 77 68 65 6e 20 77 61 6c 6b 69 6e 67 20 61  ) when walking a
21530 20 53 45 4c 45 43 54 20 74 72 65 65 20 74 6f 20   SELECT tree to 
21540 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 0a 2a 2a  resolve table.**
21550 20 6e 61 6d 65 73 20 61 6e 64 20 6f 74 68 65 72   names and other
21560 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65   FROM clause ele
21570 6d 65 6e 74 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  ments. .*/.stati
21580 63 20 76 6f 69 64 20 73 65 6c 65 63 74 50 6f 70  c void selectPop
21590 57 69 74 68 28 57 61 6c 6b 65 72 20 2a 70 57 61  With(Walker *pWa
215a0 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29  lker, Select *p)
215b0 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
215c0 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
215d0 72 73 65 3b 0a 20 20 57 69 74 68 20 2a 70 57 69  rse;.  With *pWi
215e0 74 68 20 3d 20 66 69 6e 64 52 69 67 68 74 6d 6f  th = findRightmo
215f0 73 74 28 70 29 2d 3e 70 57 69 74 68 3b 0a 20 20  st(p)->pWith;.  
21600 69 66 28 20 70 57 69 74 68 21 3d 30 20 29 7b 0a  if( pWith!=0 ){.
21610 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
21620 73 65 2d 3e 70 57 69 74 68 3d 3d 70 57 69 74 68  se->pWith==pWith
21630 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   );.    pParse->
21640 70 57 69 74 68 20 3d 20 70 57 69 74 68 2d 3e 70  pWith = pWith->p
21650 4f 75 74 65 72 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  Outer;.  }.}.#el
21660 73 65 0a 23 64 65 66 69 6e 65 20 73 65 6c 65 63  se.#define selec
21670 74 50 6f 70 57 69 74 68 20 30 0a 23 65 6e 64 69  tPopWith 0.#endi
21680 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
21690 75 74 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65  utine is a Walke
216a0 72 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22  r callback for "
216b0 65 78 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c  expanding" a SEL
216c0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
216d0 2a 20 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65  * "Expanding" me
216e0 61 6e 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f  ans to do the fo
216f0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
21700 20 20 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65    (1)  Make sure
21710 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
21720 62 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61  bers have been a
21730 73 73 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79  ssigned to every
21740 0a 2a 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d  .**         elem
21750 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
21760 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
21770 20 28 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68   (2)  Fill in th
21780 65 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e  e pTabList->a[].
21790 70 54 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74  pTab fields in t
217a0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
217b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 65 66 69  .**         defi
217c0 6e 65 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  nes FROM clause.
217d0 20 20 57 68 65 6e 20 76 69 65 77 73 20 61 70 70    When views app
217e0 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
217f0 63 6c 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20  clause,.**      
21800 20 20 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74     fill pTabList
21810 2d 3e 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69  ->a[].pSelect wi
21820 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
21830 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
21840 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61  t.**         tha
21850 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
21860 20 76 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69   view.  A copy i
21870 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69  s made of the vi
21880 65 77 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20  ew's SELECT.**  
21890 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
218a0 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
218b0 66 72 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72  freely modify or
218c0 20 64 65 6c 65 74 65 20 74 68 61 74 20 73 74 61   delete that sta
218d0 74 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20  tement.**       
218e0 20 20 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69    without worryi
218f0 6e 67 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67  ng about messing
21900 20 75 70 20 74 68 65 20 70 72 65 73 69 73 74 65   up the presiste
21910 6e 74 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  nt representatio
21920 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20  n.**         of 
21930 74 68 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20  the view..**.** 
21940 20 20 20 28 33 29 20 20 41 64 64 20 74 65 72 6d     (3)  Add term
21950 73 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63  s to the WHERE c
21960 6c 61 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64  lause to accomod
21970 61 74 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20  ate the NATURAL 
21980 6b 65 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20  keyword.**      
21990 20 20 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20     on joins and 
219a0 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
219b0 20 63 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73   clause of joins
219c0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20  ..**.**    (4)  
219d0 53 63 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66  Scan the list of
219e0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
219f0 72 65 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69  result set (pELi
21a00 73 74 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20  st) looking.**  
21a10 20 20 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61         for insta
21a20 6e 63 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20  nces of the "*" 
21a30 6f 70 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20  operator or the 
21a40 54 41 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72  TABLE.* operator
21a50 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20  ..**         If 
21a60 66 6f 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61  found, expand ea
21a70 63 68 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65  ch "*" to be eve
21a80 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65  ry column in eve
21a90 72 79 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  ry table.**     
21aa0 20 20 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20      and TABLE.* 
21ab0 74 6f 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75  to be every colu
21ac0 6d 6e 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a  mn in TABLE..**.
21ad0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
21ae0 6c 65 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c  lectExpander(Wal
21af0 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
21b00 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73  lect *p){.  Pars
21b10 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c  e *pParse = pWal
21b20 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  ker->pParse;.  i
21b30 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72  nt i, j, k;.  Sr
21b40 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b  cList *pTabList;
21b50 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
21b60 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
21b70 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f  cList_item *pFro
21b80 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
21b90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
21ba0 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 52 69 67   Expr *pE, *pRig
21bb0 68 74 2c 20 2a 70 45 78 70 72 3b 0a 20 20 75 31  ht, *pExpr;.  u1
21bc0 36 20 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e  6 selFlags = p->
21bd0 73 65 6c 46 6c 61 67 73 3b 0a 0a 20 20 70 2d 3e  selFlags;..  p->
21be0 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45  selFlags |= SF_E
21bf0 78 70 61 6e 64 65 64 3b 0a 20 20 69 66 28 20 64  xpanded;.  if( d
21c00 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
21c10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
21c20 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
21c30 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 70 53 72  if( NEVER(p->pSr
21c40 63 3d 3d 30 29 20 7c 7c 20 28 73 65 6c 46 6c 61  c==0) || (selFla
21c50 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
21c60 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
21c70 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
21c80 7d 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70  }.  pTabList = p
21c90 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73 74  ->pSrc;.  pEList
21ca0 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
21cb0 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
21cc0 70 50 61 72 73 65 2c 20 66 69 6e 64 52 69 67 68  pParse, findRigh
21cd0 74 6d 6f 73 74 28 70 29 2d 3e 70 57 69 74 68 2c  tmost(p)->pWith,
21ce0 20 30 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20   0);..  /* Make 
21cf0 73 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  sure cursor numb
21d00 65 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73  ers have been as
21d10 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e  signed to all en
21d20 74 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68  tries in.  ** th
21d30 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66  e FROM clause of
21d40 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
21d50 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71  ement..  */.  sq
21d60 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
21d70 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
21d80 2c 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20  , pTabList);..  
21d90 2f 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79  /* Look up every
21da0 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20   table named in 
21db0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
21dc0 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20  of the select.  
21dd0 49 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79  If.  ** an entry
21de0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
21df0 75 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72  use is a subquer
21e00 79 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74  y instead of a t
21e10 61 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20  able or view,.  
21e20 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
21e30 20 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65   transient table
21e40 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65   structure to de
21e50 73 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75  scribe the subqu
21e60 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ery..  */.  for(
21e70 69 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c  i=0, pFrom=pTabL
21e80 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  ist->a; i<pTabLi
21e90 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
21ea0 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62  From++){.    Tab
21eb0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 61 73  le *pTab;.    as
21ec0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 52  sert( pFrom->isR
21ed0 65 63 75 72 73 69 76 65 3d 3d 30 20 7c 7c 20 70  ecursive==0 || p
21ee0 46 72 6f 6d 2d 3e 70 54 61 62 20 29 3b 0a 20 20  From->pTab );.  
21ef0 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 52    if( pFrom->isR
21f00 65 63 75 72 73 69 76 65 20 29 20 63 6f 6e 74 69  ecursive ) conti
21f10 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 46 72  nue;.    if( pFr
21f20 6f 6d 2d 3e 70 54 61 62 21 3d 30 20 29 7b 0a 20  om->pTab!=0 ){. 
21f30 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 74 61       /* This sta
21f40 74 65 6d 65 6e 74 20 68 61 73 20 61 6c 72 65 61  tement has alrea
21f50 64 79 20 62 65 65 6e 20 70 72 65 70 61 72 65 64  dy been prepared
21f60 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  .  There is no n
21f70 65 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  eed.      ** to 
21f80 67 6f 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20  go further. */. 
21f90 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d       assert( i==
21fa0 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
21fb0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20  ITE_OMIT_CTE.   
21fc0 20 20 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68     selectPopWith
21fd0 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 23 65  (pWalker, p);.#e
21fe0 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75 72  ndif.      retur
21ff0 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
22000 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
22010 45 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 69  E_OMIT_CTE.    i
22020 66 28 20 77 69 74 68 45 78 70 61 6e 64 28 70 57  f( withExpand(pW
22030 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 29 20 29 20  alker, pFrom) ) 
22040 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
22050 3b 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d  ;.    if( pFrom-
22060 3e 70 54 61 62 20 29 20 7b 7d 20 65 6c 73 65 0a  >pTab ) {} else.
22070 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
22080 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
22090 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
220a0 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
220b0 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
220c0 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
220d0 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
220e0 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
220f0 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
22100 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
22110 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
22120 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
22130 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
22140 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
22150 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
22160 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
22170 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
22180 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
22190 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
221a0 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
221b0 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
221c0 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
221d0 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
221e0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
221f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
22200 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
22210 2c 20 22 73 71 6c 69 74 65 5f 73 71 5f 25 70 22  , "sqlite_sq_%p"
22220 2c 20 28 76 6f 69 64 2a 29 70 54 61 62 29 3b 0a  , (void*)pTab);.
22230 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 65        while( pSe
22240 6c 2d 3e 70 50 72 69 6f 72 20 29 7b 20 70 53 65  l->pPrior ){ pSe
22250 6c 20 3d 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  l = pSel->pPrior
22260 3b 20 7d 0a 20 20 20 20 20 20 73 65 6c 65 63 74  ; }.      select
22270 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c  ColumnsFromExprL
22280 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
22290 2d 3e 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d  ->pEList, &pTab-
222a0 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43  >nCol, &pTab->aC
222b0 6f 6c 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ol);.      pTab-
222c0 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 20  >iPKey = -1;.   
222d0 20 20 20 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74     pTab->nRowEst
222e0 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 20 20   = 1048576;.    
222f0 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
22300 20 7c 3d 20 54 46 5f 45 70 68 65 6d 65 72 61 6c   |= TF_Ephemeral
22310 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
22320 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
22330 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 6f  ordinary table o
22340 72 20 76 69 65 77 20 6e 61 6d 65 20 69 6e 20 74  r view name in t
22350 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
22360 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
22370 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30 20 29  pFrom->pTab==0 )
22380 3b 0a 20 20 20 20 20 20 70 46 72 6f 6d 2d 3e 70  ;.      pFrom->p
22390 54 61 62 20 3d 20 70 54 61 62 20 3d 20 73 71 6c  Tab = pTab = sql
223a0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
223b0 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 70  tem(pParse, 0, p
223c0 46 72 6f 6d 29 3b 0a 20 20 20 20 20 20 69 66 28  From);.      if(
223d0 20 70 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72   pTab==0 ) retur
223e0 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
223f0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 52 65     if( pTab->nRe
22400 66 3d 3d 30 78 66 66 66 66 20 29 7b 0a 20 20 20  f==0xffff ){.   
22410 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
22420 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
22430 6f 20 6d 61 6e 79 20 72 65 66 65 72 65 6e 63 65  o many reference
22440 73 20 74 6f 20 5c 22 25 73 5c 22 3a 20 6d 61 78  s to \"%s\": max
22450 20 36 35 35 33 35 22 2c 0a 20 20 20 20 20 20 20   65535",.       
22460 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
22470 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f 6d 2d  ;.        pFrom-
22480 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  >pTab = 0;.     
22490 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
224a0 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
224b0 20 20 20 70 54 61 62 2d 3e 6e 52 65 66 2b 2b 3b     pTab->nRef++;
224c0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
224d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
224e0 7c 7c 20 21 64 65 66 69 6e 65 64 20 28 53 51 4c  || !defined (SQL
224f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
22500 54 41 42 4c 45 29 0a 20 20 20 20 20 20 69 66 28  TABLE).      if(
22510 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 7c   pTab->pSelect |
22520 7c 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  | IsVirtual(pTab
22530 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
22540 57 65 20 72 65 61 63 68 20 68 65 72 65 20 69 66  We reach here if
22550 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
22560 20 69 73 20 61 20 72 65 61 6c 6c 79 20 61 20 76   is a really a v
22570 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  iew */.        i
22580 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  f( sqlite3ViewGe
22590 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
225a0 72 73 65 2c 20 70 54 61 62 29 20 29 20 72 65 74  rse, pTab) ) ret
225b0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
225c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
225d0 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  From->pSelect==0
225e0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 46 72 6f   );.        pFro
225f0 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
22600 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
22610 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 2c  , pTab->pSelect,
22620 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
22630 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
22640 57 61 6c 6b 65 72 2c 20 70 46 72 6f 6d 2d 3e 70  Walker, pFrom->p
22650 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 7d  Select);.      }
22660 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
22670 20 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65     /* Locate the
22680 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 62 79 20   index named by 
22690 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63  the INDEXED BY c
226a0 6c 61 75 73 65 2c 20 69 66 20 61 6e 79 2e 20 2a  lause, if any. *
226b0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
226c0 33 49 6e 64 65 78 65 64 42 79 4c 6f 6f 6b 75 70  3IndexedByLookup
226d0 28 70 50 61 72 73 65 2c 20 70 46 72 6f 6d 29 20  (pParse, pFrom) 
226e0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
226f0 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
22700 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
22710 73 73 20 4e 41 54 55 52 41 4c 20 6b 65 79 77 6f  ss NATURAL keywo
22720 72 64 73 2c 20 61 6e 64 20 4f 4e 20 61 6e 64 20  rds, and ON and 
22730 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 6f 66  USING clauses of
22740 20 6a 6f 69 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69   joins..  */.  i
22750 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
22760 6c 65 64 20 7c 7c 20 73 71 6c 69 74 65 50 72 6f  led || sqlitePro
22770 63 65 73 73 4a 6f 69 6e 28 70 50 61 72 73 65 2c  cessJoin(pParse,
22780 20 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   p) ){.    retur
22790 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
227a0 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 76 65 72 79  ..  /* For every
227b0 20 22 2a 22 20 74 68 61 74 20 6f 63 63 75 72 73   "*" that occurs
227c0 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6c   in the column l
227d0 69 73 74 2c 20 69 6e 73 65 72 74 20 74 68 65 20  ist, insert the 
227e0 6e 61 6d 65 73 20 6f 66 0a 20 20 2a 2a 20 61 6c  names of.  ** al
227f0 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61 6c 6c  l columns in all
22800 20 74 61 62 6c 65 73 2e 20 20 41 6e 64 20 66 6f   tables.  And fo
22810 72 20 65 76 65 72 79 20 54 41 42 4c 45 2e 2a 20  r every TABLE.* 
22820 69 6e 73 65 72 74 20 74 68 65 20 6e 61 6d 65 73  insert the names
22830 0a 20 20 2a 2a 20 6f 66 20 61 6c 6c 20 63 6f 6c  .  ** of all col
22840 75 6d 6e 73 20 69 6e 20 54 41 42 4c 45 2e 20 20  umns in TABLE.  
22850 54 68 65 20 70 61 72 73 65 72 20 69 6e 73 65 72  The parser inser
22860 74 65 64 20 61 20 73 70 65 63 69 61 6c 20 65 78  ted a special ex
22870 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 77 69  pression.  ** wi
22880 74 68 20 74 68 65 20 54 4b 5f 41 4c 4c 20 6f 70  th the TK_ALL op
22890 65 72 61 74 6f 72 20 66 6f 72 20 65 61 63 68 20  erator for each 
228a0 22 2a 22 20 74 68 61 74 20 69 74 20 66 6f 75 6e  "*" that it foun
228b0 64 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d in the column 
228c0 6c 69 73 74 2e 0a 20 20 2a 2a 20 54 68 65 20 66  list..  ** The f
228d0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6a 75  ollowing code ju
228e0 73 74 20 68 61 73 20 74 6f 20 6c 6f 63 61 74 65  st has to locate
228f0 20 74 68 65 20 54 4b 5f 41 4c 4c 20 65 78 70 72   the TK_ALL expr
22900 65 73 73 69 6f 6e 73 20 61 6e 64 20 65 78 70 61  essions and expa
22910 6e 64 0a 20 20 2a 2a 20 65 61 63 68 20 6f 6e 65  nd.  ** each one
22920 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
22930 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 61  all columns in a
22940 6c 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  ll tables..  **.
22950 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6c    ** The first l
22960 6f 6f 70 20 6a 75 73 74 20 63 68 65 63 6b 73 20  oop just checks 
22970 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
22980 61 72 65 20 61 6e 79 20 22 2a 22 20 6f 70 65 72  are any "*" oper
22990 61 74 6f 72 73 0a 20 20 2a 2a 20 74 68 61 74 20  ators.  ** that 
229a0 6e 65 65 64 20 65 78 70 61 6e 64 69 6e 67 2e 0a  need expanding..
229b0 20 20 2a 2f 0a 20 20 66 6f 72 28 6b 3d 30 3b 20    */.  for(k=0; 
229c0 6b 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  k<pEList->nExpr;
229d0 20 6b 2b 2b 29 7b 0a 20 20 20 20 70 45 20 3d 20   k++){.    pE = 
229e0 70 45 4c 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78  pEList->a[k].pEx
229f0 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 2d 3e  pr;.    if( pE->
22a00 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65  op==TK_ALL ) bre
22a10 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
22a20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
22a30 7c 20 70 45 2d 3e 70 52 69 67 68 74 21 3d 30 20  | pE->pRight!=0 
22a40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22a50 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c  E->op!=TK_DOT ||
22a60 20 28 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26   (pE->pLeft!=0 &
22a70 26 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  & pE->pLeft->op=
22a80 3d 54 4b 5f 49 44 29 20 29 3b 0a 20 20 20 20 69  =TK_ID) );.    i
22a90 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f  f( pE->op==TK_DO
22aa0 54 20 26 26 20 70 45 2d 3e 70 52 69 67 68 74 2d  T && pE->pRight-
22ab0 3e 6f 70 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72  >op==TK_ALL ) br
22ac0 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b  eak;.  }.  if( k
22ad0 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
22ae0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
22af0 49 66 20 77 65 20 67 65 74 20 68 65 72 65 20 69  If we get here i
22b00 74 20 6d 65 61 6e 73 20 74 68 65 20 72 65 73 75  t means the resu
22b10 6c 74 20 73 65 74 20 63 6f 6e 74 61 69 6e 73 20  lt set contains 
22b20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a  one or more "*".
22b30 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73      ** operators
22b40 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
22b50 20 65 78 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70   expanded.  Loop
22b60 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
22b70 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
22b80 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
22b90 74 20 61 6e 64 20 65 78 70 61 6e 64 20 74 68 65  t and expand the
22ba0 6d 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20  m one by one..  
22bb0 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20    */.    struct 
22bc0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
22bd0 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20   = pEList->a;.  
22be0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77    ExprList *pNew
22bf0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c   = 0;.    int fl
22c00 61 67 73 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ags = pParse->db
22c10 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74  ->flags;.    int
22c20 20 6c 6f 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c   longNames = (fl
22c30 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75 6c  ags & SQLITE_Ful
22c40 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20  lColNames)!=0.  
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c60 20 20 20 20 26 26 20 28 66 6c 61 67 73 20 26 20      && (flags & 
22c70 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
22c80 61 6d 65 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 2f  ames)==0;..    /
22c90 2a 20 57 68 65 6e 20 70 72 6f 63 65 73 73 69 6e  * When processin
22ca0 67 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75  g FROM-clause su
22cb0 62 71 75 65 72 69 65 73 2c 20 69 74 20 69 73 20  bqueries, it is 
22cc0 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
22cd0 20 20 20 20 2a 2a 20 74 68 61 74 20 66 75 6c 6c      ** that full
22ce0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 73 3d 4f 46  _column_names=OF
22cf0 46 20 61 6e 64 20 73 68 6f 72 74 5f 63 6f 6c 75  F and short_colu
22d00 6d 6e 5f 6e 61 6d 65 73 3d 4f 4e 2e 20 20 54 68  mn_names=ON.  Th
22d10 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  e.    ** sqlite3
22d20 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
22d30 74 28 29 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  t() routine make
22d40 73 20 69 74 20 73 6f 2e 20 2a 2f 0a 20 20 20 20  s it so. */.    
22d50 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
22d60 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64  lags & SF_Nested
22d70 46 72 6f 6d 29 3d 3d 30 0a 20 20 20 20 20 20 20  From)==0.       
22d80 20 20 20 7c 7c 20 28 28 66 6c 61 67 73 20 26 20     || ((flags & 
22d90 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f 6c 4e 61  SQLITE_FullColNa
22da0 6d 65 73 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  mes)==0 &&.     
22db0 20 20 20 20 20 20 20 20 20 28 66 6c 61 67 73 20           (flags 
22dc0 26 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  & SQLITE_ShortCo
22dd0 6c 4e 61 6d 65 73 29 21 3d 30 29 20 29 3b 0a 0a  lNames)!=0) );..
22de0 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
22df0 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6b 2b  EList->nExpr; k+
22e00 2b 29 7b 0a 20 20 20 20 20 20 70 45 20 3d 20 61  +){.      pE = a
22e10 5b 6b 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [k].pExpr;.     
22e20 20 70 52 69 67 68 74 20 3d 20 70 45 2d 3e 70 52   pRight = pE->pR
22e30 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
22e40 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44  rt( pE->op!=TK_D
22e50 4f 54 20 7c 7c 20 70 52 69 67 68 74 21 3d 30 20  OT || pRight!=0 
22e60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 2d  );.      if( pE-
22e70 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 20 26 26 20 28  >op!=TK_ALL && (
22e80 70 45 2d 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c  pE->op!=TK_DOT |
22e90 7c 20 70 52 69 67 68 74 2d 3e 6f 70 21 3d 54 4b  | pRight->op!=TK
22ea0 5f 41 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _ALL) ){.       
22eb0 20 2f 2a 20 54 68 69 73 20 70 61 72 74 69 63 75   /* This particu
22ec0 6c 61 72 20 65 78 70 72 65 73 73 69 6f 6e 20 64  lar expression d
22ed0 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
22ee0 62 65 20 65 78 70 61 6e 64 65 64 2e 0a 20 20 20  be expanded..   
22ef0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
22f00 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
22f10 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
22f20 72 73 65 2c 20 70 4e 65 77 2c 20 61 5b 6b 5d 2e  rse, pNew, a[k].
22f30 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
22f40 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
22f50 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
22f60 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 4e 61  ew->nExpr-1].zNa
22f70 6d 65 20 3d 20 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b  me = a[k].zName;
22f80 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
22f90 3e 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31  >a[pNew->nExpr-1
22fa0 5d 2e 7a 53 70 61 6e 20 3d 20 61 5b 6b 5d 2e 7a  ].zSpan = a[k].z
22fb0 53 70 61 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  Span;.          
22fc0 61 5b 6b 5d 2e 7a 4e 61 6d 65 20 3d 20 30 3b 0a  a[k].zName = 0;.
22fd0 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e 7a            a[k].z
22fe0 53 70 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Span = 0;.      
22ff0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 5b 6b 5d    }.        a[k]
23000 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20  .pExpr = 0;.    
23010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23020 20 2f 2a 20 54 68 69 73 20 65 78 70 72 65 73 73   /* This express
23030 69 6f 6e 20 69 73 20 61 20 22 2a 22 20 6f 72 20  ion is a "*" or 
23040 61 20 22 54 41 42 4c 45 2e 2a 22 20 61 6e 64 20  a "TABLE.*" and 
23050 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
23060 20 20 20 20 2a 2a 20 65 78 70 61 6e 64 65 64 2e      ** expanded.
23070 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
23080 74 61 62 6c 65 53 65 65 6e 20 3d 20 30 3b 20 20  tableSeen = 0;  
23090 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20      /* Set to 1 
230a0 77 68 65 6e 20 54 41 42 4c 45 20 6d 61 74 63 68  when TABLE match
230b0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68  es */.        ch
230c0 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 20  ar *zTName = 0; 
230d0 20 20 20 20 20 20 2f 2a 20 74 65 78 74 20 6f 66        /* text of
230e0 20 6e 61 6d 65 20 6f 66 20 54 41 42 4c 45 20 2a   name of TABLE *
230f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  /.        if( pE
23100 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a  ->op==TK_DOT ){.
23110 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23120 28 20 70 45 2d 3e 70 4c 65 66 74 21 3d 30 20 29  ( pE->pLeft!=0 )
23130 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
23140 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
23150 65 72 74 79 28 70 45 2d 3e 70 4c 65 66 74 2c 20  erty(pE->pLeft, 
23160 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
23170 20 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65            zTName
23180 20 3d 20 70 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e   = pE->pLeft->u.
23190 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
231a0 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  }.        for(i=
231b0 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69 73  0, pFrom=pTabLis
231c0 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
231d0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46 72  ->nSrc; i++, pFr
231e0 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  om++){.         
231f0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
23200 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  From->pTab;.    
23210 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
23220 75 62 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c  ub = pFrom->pSel
23230 65 63 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ect;.          c
23240 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
23250 70 46 72 6f 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pFrom->zAlias;. 
23260 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
23270 68 61 72 20 2a 7a 53 63 68 65 6d 61 4e 61 6d 65  har *zSchemaName
23280 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
23290 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
232a0 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
232b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
232c0 20 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61    zTabName = pTa
232d0 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
232e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
232f0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
23300 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
23310 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
23320 3d 3d 30 20 7c 7c 20 28 70 53 75 62 2d 3e 73 65  ==0 || (pSub->se
23330 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65 73 74  lFlags & SF_Nest
23340 65 64 46 72 6f 6d 29 3d 3d 30 20 29 7b 0a 20 20  edFrom)==0 ){.  
23350 20 20 20 20 20 20 20 20 20 20 70 53 75 62 20 3d            pSub =
23360 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
23370 69 66 28 20 7a 54 4e 61 6d 65 20 26 26 20 73 71  if( zTName && sq
23380 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 4e  lite3StrICmp(zTN
23390 61 6d 65 2c 20 7a 54 61 62 4e 61 6d 65 29 21 3d  ame, zTabName)!=
233a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
233b0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
233c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
233d0 20 20 20 20 20 20 20 69 44 62 20 3d 20 73 71 6c         iDb = sql
233e0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
233f0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
23400 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
23410 20 20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 3d 20    zSchemaName = 
23420 69 44 62 3e 3d 30 20 3f 20 64 62 2d 3e 61 44 62  iDb>=0 ? db->aDb
23430 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 3a 20 22 2a  [iDb].zName : "*
23440 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
23450 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
23460 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
23470 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
23480 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
23490 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
234a0 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
234b0 20 63 68 61 72 20 2a 7a 43 6f 6c 6e 61 6d 65 3b   char *zColname;
234c0 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 75 74 65    /* The compute
234d0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  d column name */
234e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
234f0 72 20 2a 7a 54 6f 46 72 65 65 3b 20 20 20 2f 2a  r *zToFree;   /*
23500 20 4d 61 6c 6c 6f 63 65 64 20 73 74 72 69 6e 67   Malloced string
23510 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
23520 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 20  e freed */.     
23530 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 73 43 6f         Token sCo
23540 6c 6e 61 6d 65 3b 20 20 2f 2a 20 43 6f 6d 70 75  lname;  /* Compu
23550 74 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ted column name 
23560 61 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 0a 20  as a token */.. 
23570 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
23580 74 28 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  t( zName );.    
23590 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61          if( zTNa
235a0 6d 65 20 26 26 20 70 53 75 62 0a 20 20 20 20 20  me && pSub.     
235b0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
235c0 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
235d0 70 53 75 62 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  pSub->pEList->a[
235e0 6a 5d 2e 7a 53 70 61 6e 2c 20 30 2c 20 7a 54 4e  j].zSpan, 0, zTN
235f0 61 6d 65 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20  ame, 0)==0.     
23600 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
23610 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
23620 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
23630 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
23640 49 66 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 6d  If a column is m
23650 61 72 6b 65 64 20 61 73 20 27 68 69 64 64 65 6e  arked as 'hidden
23660 27 20 28 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  ' (currently onl
23670 79 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 20  y possible.     
23680 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 76 69         ** for vi
23690 72 74 75 61 6c 20 74 61 62 6c 65 73 29 2c 20 64  rtual tables), d
236a0 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 69 74  o not include it
236b0 20 69 6e 20 74 68 65 20 65 78 70 61 6e 64 65 64   in the expanded
236c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
236d0 72 65 73 75 6c 74 2d 73 65 74 20 6c 69 73 74 2e  result-set list.
236e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
236f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23700 49 73 48 69 64 64 65 6e 43 6f 6c 75 6d 6e 28 26  IsHiddenColumn(&
23710 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 29 20 29  pTab->aCol[j]) )
23720 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23730 61 73 73 65 72 74 28 49 73 56 69 72 74 75 61 6c  assert(IsVirtual
23740 28 70 54 61 62 29 29 3b 0a 20 20 20 20 20 20 20  (pTab));.       
23750 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
23760 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23770 20 20 20 20 20 20 20 20 20 20 20 74 61 62 6c 65             table
23780 53 65 65 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 20  Seen = 1;..     
23790 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 26         if( i>0 &
237a0 26 20 7a 54 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  & zTName==0 ){. 
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
237c0 20 28 70 46 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70   (pFrom->jointyp
237d0 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 29 21  e & JT_NATURAL)!
237e0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
237f0 20 20 20 26 26 20 74 61 62 6c 65 41 6e 64 43 6f     && tableAndCo
23800 6c 75 6d 6e 49 6e 64 65 78 28 70 54 61 62 4c 69  lumnIndex(pTabLi
23810 73 74 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c  st, i, zName, 0,
23820 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   0).            
23830 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
23840 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 4e 41 54       /* In a NAT
23850 55 52 41 4c 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20  URAL join, omit 
23860 74 68 65 20 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73  the join columns
23870 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 20   from the .     
23880 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61             ** ta
23890 62 6c 65 20 74 6f 20 74 68 65 20 72 69 67 68 74  ble to the right
238a0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238c0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
238d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
238e0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
238f0 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 70  te3IdListIndex(p
23900 46 72 6f 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e  From->pUsing, zN
23910 61 6d 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ame)>=0 ){.     
23920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23930 20 61 20 6a 6f 69 6e 20 77 69 74 68 20 61 20 55   a join with a U
23940 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 6f 6d 69  SING clause, omi
23950 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
23960 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23970 20 2a 2a 20 75 73 69 6e 67 20 63 6c 61 75 73 65   ** using clause
23980 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20   from the table 
23990 6f 6e 20 74 68 65 20 72 69 67 68 74 2e 20 2a 2f  on the right. */
239a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
239b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
239c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
239d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
239e0 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 73 71       pRight = sq
239f0 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
23a00 5f 49 44 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  _ID, zName);.   
23a10 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
23a20 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  e = zName;.     
23a30 20 20 20 20 20 20 20 7a 54 6f 46 72 65 65 20 3d         zToFree =
23a40 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
23a50 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c  if( longNames ||
23a60 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e   pTabList->nSrc>
23a70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
23a80 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 3b 0a     Expr *pLeft;.
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4c                pL
23aa0 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
23ab0 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 54 61  r(db, TK_ID, zTa
23ac0 62 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  bName);.        
23ad0 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 73 71        pExpr = sq
23ae0 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
23af0 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  e, TK_DOT, pLeft
23b00 2c 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20  , pRight, 0);.  
23b10 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23b20 7a 53 63 68 65 6d 61 4e 61 6d 65 20 29 7b 0a 20  zSchemaName ){. 
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
23b40 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
23b50 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c 20 7a 53  pr(db, TK_ID, zS
23b60 63 68 65 6d 61 4e 61 6d 65 29 3b 0a 20 20 20 20  chemaName);.    
23b70 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
23b80 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
23b90 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
23ba0 20 70 4c 65 66 74 2c 20 70 45 78 70 72 2c 20 30   pLeft, pExpr, 0
23bb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
23bc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
23bd0 20 69 66 28 20 6c 6f 6e 67 4e 61 6d 65 73 20 29   if( longNames )
23be0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23bf0 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20 73 71 6c    zColname = sql
23c00 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
23c10 22 25 73 2e 25 73 22 2c 20 7a 54 61 62 4e 61 6d  "%s.%s", zTabNam
23c20 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
23c30 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f 46 72             zToFr
23c40 65 65 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a 20  ee = zColname;. 
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
23c60 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
23c70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23c80 70 45 78 70 72 20 3d 20 70 52 69 67 68 74 3b 0a  pExpr = pRight;.
23c90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23ca0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d            pNew =
23cb0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23cc0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
23cd0 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  New, pExpr);.   
23ce0 20 20 20 20 20 20 20 20 20 73 43 6f 6c 6e 61 6d           sColnam
23cf0 65 2e 7a 20 3d 20 7a 43 6f 6c 6e 61 6d 65 3b 0a  e.z = zColname;.
23d00 20 20 20 20 20 20 20 20 20 20 20 20 73 43 6f 6c              sCol
23d10 6e 61 6d 65 2e 6e 20 3d 20 73 71 6c 69 74 65 33  name.n = sqlite3
23d20 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6e 61 6d  Strlen30(zColnam
23d30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
23d40 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
23d50 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
23d60 4e 65 77 2c 20 26 73 43 6f 6c 6e 61 6d 65 2c 20  New, &sColname, 
23d70 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
23d80 69 66 28 20 70 4e 65 77 20 26 26 20 28 70 2d 3e  if( pNew && (p->
23d90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
23da0 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a  stedFrom)!=0 ){.
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
23dc0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
23dd0 65 6d 20 2a 70 58 20 3d 20 26 70 4e 65 77 2d 3e  em *pX = &pNew->
23de0 61 5b 70 4e 65 77 2d 3e 6e 45 78 70 72 2d 31 5d  a[pNew->nExpr-1]
23df0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23e00 69 66 28 20 70 53 75 62 20 29 7b 0a 20 20 20 20  if( pSub ){.    
23e10 20 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e              pX->
23e20 7a 53 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44  zSpan = sqlite3D
23e30 62 53 74 72 44 75 70 28 64 62 2c 20 70 53 75 62  bStrDup(db, pSub
23e40 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  ->pEList->a[j].z
23e50 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Span);.         
23e60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
23e70 20 70 58 2d 3e 7a 53 70 61 6e 3d 3d 30 20 29 3b   pX->zSpan==0 );
23e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
23e90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23ea0 20 20 20 20 20 20 70 58 2d 3e 7a 53 70 61 6e 20        pX->zSpan 
23eb0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
23ec0 28 64 62 2c 20 22 25 73 2e 25 73 2e 25 73 22 2c  (db, "%s.%s.%s",
23ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68              zSch
23f00 65 6d 61 4e 61 6d 65 2c 20 7a 54 61 62 4e 61 6d  emaName, zTabNam
23f10 65 2c 20 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20  e, zColname);.  
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
23f30 73 74 63 61 73 65 28 20 70 58 2d 3e 7a 53 70 61  stcase( pX->zSpa
23f40 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  n==0 );.        
23f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23f60 20 20 20 20 20 20 70 58 2d 3e 62 53 70 61 6e 49        pX->bSpanI
23f70 73 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  sTab = 1;.      
23f80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23f90 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
23fa0 65 28 64 62 2c 20 7a 54 6f 46 72 65 65 29 3b 0a  e(db, zToFree);.
23fb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
23fd0 28 20 21 74 61 62 6c 65 53 65 65 6e 20 29 7b 0a  ( !tableSeen ){.
23fe0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 54            if( zT
23ff0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Name ){.        
24000 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
24010 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
24020 73 75 63 68 20 74 61 62 6c 65 3a 20 25 73 22 2c  such table: %s",
24030 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20   zTName);.      
24040 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24050 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
24060 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
24070 6e 6f 20 74 61 62 6c 65 73 20 73 70 65 63 69 66  no tables specif
24080 69 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ied");.         
24090 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
240a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
240b0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
240c0 6c 65 74 65 28 64 62 2c 20 70 45 4c 69 73 74 29  lete(db, pEList)
240d0 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69 73 74 20  ;.    p->pEList 
240e0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23 69 66 20  = pNew;.  }.#if 
240f0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
24100 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45 4c 69 73  N.  if( p->pELis
24110 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  t && p->pEList->
24120 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
24130 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
24140 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
24150 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
24160 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
24170 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75 6c 74  olumns in result
24180 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23 65 6e 64   set");.  }.#end
24190 69 66 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  if.  return WRC_
241a0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
241b0 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65  ** No-op routine
241c0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 2d 74   for the parse-t
241d0 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2a 0a 2a  ree walker..**.*
241e0 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
241f0 69 6e 65 20 69 73 20 74 68 65 20 57 61 6c 6b 65  ine is the Walke
24200 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  r.xExprCallback 
24210 74 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  then expression 
24220 74 72 65 65 73 0a 2a 2a 20 61 72 65 20 77 61 6c  trees.** are wal
24230 6b 65 64 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ked without any 
24240 61 63 74 69 6f 6e 73 20 62 65 69 6e 67 20 74 61  actions being ta
24250 6b 65 6e 20 61 74 20 65 61 63 68 20 6e 6f 64 65  ken at each node
24260 2e 20 20 50 72 65 73 75 6d 61 62 6c 79 2c 0a 2a  .  Presumably,.*
24270 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
24280 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
24290 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c  Walker.xExprCall
242a0 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a 20 57 61  back then .** Wa
242b0 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c  lker.xSelectCall
242c0 62 61 63 6b 20 69 73 20 73 65 74 20 74 6f 20 64  back is set to d
242d0 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75 73 65 66  o something usef
242e0 75 6c 20 66 6f 72 20 65 76 65 72 79 20 0a 2a 2a  ul for every .**
242f0 20 73 75 62 71 75 65 72 79 20 69 6e 20 74 68 65   subquery in the
24300 20 70 61 72 73 65 72 20 74 72 65 65 2e 0a 2a 2f   parser tree..*/
24310 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
24320 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b 65 72 20  WalkNoop(Walker 
24330 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70 72 20 2a  *NotUsed, Expr *
24340 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
24350 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
24360 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
24370 29 3b 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  );.  return WRC_
24380 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
24390 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
243a0 22 65 78 70 61 6e 64 73 22 20 61 20 53 45 4c 45  "expands" a SELE
243b0 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64  CT statement and
243c0 20 61 6c 6c 20 6f 66 20 69 74 73 20 73 75 62 71   all of its subq
243d0 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f 72 20 61  ueries..** For a
243e0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
243f0 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74 20 69 74  ation on what it
24400 20 6d 65 61 6e 73 20 74 6f 20 22 65 78 70 61 6e   means to "expan
24410 64 22 20 61 20 53 45 4c 45 43 54 0a 2a 2a 20 73  d" a SELECT.** s
24420 74 61 74 65 6d 65 6e 74 2c 20 73 65 65 20 74 68  tatement, see th
24430 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65  e comment on the
24440 20 73 65 6c 65 63 74 45 78 70 61 6e 64 20 77 6f   selectExpand wo
24450 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 61 62  rker callback ab
24460 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 61 6e  ove..**.** Expan
24470 64 69 6e 67 20 61 20 53 45 4c 45 43 54 20 73 74  ding a SELECT st
24480 61 74 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66  atement is the f
24490 69 72 73 74 20 73 74 65 70 20 69 6e 20 70 72 6f  irst step in pro
244a0 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20 53 45 4c  cessing a.** SEL
244b0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
244c0 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
244d0 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 65 78 70  ment must be exp
244e0 61 6e 64 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  anded before.** 
244f0 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
24500 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 0a 2a 2a  is performed..**
24510 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e 67 20  .** If anything 
24520 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61 6e 20 65  goes wrong, an e
24530 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
24540 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70 50 61  written into pPa
24550 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  rse..** The call
24560 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  ing function can
24570 20 64 65 74 65 63 74 20 74 68 65 20 70 72 6f 62   detect the prob
24580 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  lem by looking a
24590 74 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 0a 2a  t pParse->nErr.*
245a0 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72 73 65 2d  * and/or pParse-
245b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
245c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
245d0 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  d sqlite3SelectE
245e0 78 70 61 6e 64 28 50 61 72 73 65 20 2a 70 50 61  xpand(Parse *pPa
245f0 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 53 65  rse, Select *pSe
24600 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b 65 72 20  lect){.  Walker 
24610 77 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  w;.  memset(&w, 
24620 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
24630 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
24640 20 3d 20 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b   = exprWalkNoop;
24650 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
24660 61 72 73 65 3b 0a 20 20 69 66 28 20 70 50 61 72  arse;.  if( pPar
24670 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20  se->hasCompound 
24680 29 7b 0a 20 20 20 20 77 2e 78 53 65 6c 65 63 74  ){.    w.xSelect
24690 43 61 6c 6c 62 61 63 6b 20 3d 20 63 6f 6e 76 65  Callback = conve
246a0 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74  rtCompoundSelect
246b0 54 6f 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20  ToSubquery;.    
246c0 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
246d0 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a  t(&w, pSelect);.
246e0 20 20 7d 0a 20 20 77 2e 78 53 65 6c 65 63 74 43    }.  w.xSelectC
246f0 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65 63 74  allback = select
24700 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e 78 53  Expander;.  w.xS
24710 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
24720 20 73 65 6c 65 63 74 50 6f 70 57 69 74 68 3b 0a   selectPopWith;.
24730 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
24740 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
24750 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
24760 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
24770 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  RY./*.** This is
24780 20 61 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63   a Walker.xSelec
24790 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c 6c 62 61  tCallback callba
247a0 63 6b 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ck for the sqlit
247b0 65 33 53 65 6c 65 63 74 54 79 70 65 49 6e 66 6f  e3SelectTypeInfo
247c0 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
247d0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  .**.** For each 
247e0 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73 75 62 71  FROM-clause subq
247f0 75 65 72 79 2c 20 61 64 64 20 43 6f 6c 75 6d 6e  uery, add Column
24800 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f 6c 75 6d  .zType and Colum
24810 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  n.zColl.** infor
24820 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 54 61  mation to the Ta
24830 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
24840 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74 68  at represents th
24850 65 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  e result set.** 
24860 6f 66 20 74 68 61 74 20 73 75 62 71 75 65 72 79  of that subquery
24870 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  ..**.** The Tabl
24880 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
24890 20 72 65 70 72 65 73 65 6e 74 73 20 74 68 65 20   represents the 
248a0 72 65 73 75 6c 74 20 73 65 74 20 77 61 73 20 63  result set was c
248b0 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a 20 62 79  onstructed.** by
248c0 20 73 65 6c 65 63 74 45 78 70 61 6e 64 65 72 28   selectExpander(
248d0 29 20 62 75 74 20 74 68 65 20 74 79 70 65 20 61  ) but the type a
248e0 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
248f0 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20 6f 6d 69  ormation was omi
24900 74 74 65 64 0a 2a 2a 20 61 74 20 74 68 61 74 20  tted.** at that 
24910 70 6f 69 6e 74 20 62 65 63 61 75 73 65 20 69 64  point because id
24920 65 6e 74 69 66 69 65 72 73 20 68 61 64 20 6e 6f  entifiers had no
24930 74 20 79 65 74 20 62 65 65 6e 20 72 65 73 6f 6c  t yet been resol
24940 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ved.  This.** ro
24950 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
24960 61 66 74 65 72 20 69 64 65 6e 74 69 66 69 65 72  after identifier
24970 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a 2a 2f 0a   resolution..*/.
24980 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
24990 63 74 41 64 64 53 75 62 71 75 65 72 79 54 79 70  ctAddSubqueryTyp
249a0 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a 70 57  eInfo(Walker *pW
249b0 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
249c0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
249d0 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  se;.  int i;.  S
249e0 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
249f0 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
24a00 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b 0a  st_item *pFrom;.
24a10 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 65  .  assert( p->se
24a20 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f  lFlags & SF_Reso
24a30 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20 28 70  lved );.  if( (p
24a40 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
24a50 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d 30 20  HasTypeInfo)==0 
24a60 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  ){.    p->selFla
24a70 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79 70 65  gs |= SF_HasType
24a80 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72 73 65  Info;.    pParse
24a90 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
24aa0 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74  se;.    pTabList
24ab0 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
24ac0 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d 3d 70  for(i=0, pFrom=p
24ad0 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54  TabList->a; i<pT
24ae0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
24af0 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20 20 20  +, pFrom++){.   
24b00 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
24b10 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20   pFrom->pTab;.  
24b20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
24b30 54 61 62 21 3d 30 29 20 26 26 20 28 70 54 61 62  Tab!=0) && (pTab
24b40 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
24b50 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 29 7b  Ephemeral)!=0 ){
24b60 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 75  .        /* A su
24b70 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20 46  b-query in the F
24b80 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
24b90 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20 20  SELECT */.      
24ba0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d    Select *pSel =
24bb0 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 3b   pFrom->pSelect;
24bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
24bd0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  l ){.          w
24be0 68 69 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69  hile( pSel->pPri
24bf0 6f 72 20 29 20 70 53 65 6c 20 3d 20 70 53 65 6c  or ) pSel = pSel
24c00 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
24c10 20 20 20 20 73 65 6c 65 63 74 41 64 64 43 6f 6c      selectAddCol
24c20 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 74  umnTypeAndCollat
24c30 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  ion(pParse, pTab
24c40 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 20  , pSel);.       
24c50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24c60 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
24c70 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
24c80 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70 65  ne adds datatype
24c90 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20 73   and collating s
24ca0 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74  equence informat
24cb0 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54 61  ion to.** the Ta
24cc0 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 6f  ble structures o
24cd0 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73  f all FROM-claus
24ce0 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20  e subqueries in 
24cf0 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  a.** SELECT stat
24d00 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73 65  ement..**.** Use
24d10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 66   this routine af
24d20 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  ter name resolut
24d30 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
24d40 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
24d50 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61 72  tAddTypeInfo(Par
24d60 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65  se *pParse, Sele
24d70 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23 69  ct *pSelect){.#i
24d80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24d90 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61 6c  T_SUBQUERY.  Wal
24da0 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
24db0 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
24dc0 29 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  );.  w.xSelectCa
24dd0 6c 6c 62 61 63 6b 32 20 3d 20 73 65 6c 65 63 74  llback2 = select
24de0 41 64 64 53 75 62 71 75 65 72 79 54 79 70 65 49  AddSubqueryTypeI
24df0 6e 66 6f 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  nfo;.  w.xExprCa
24e00 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 57 61 6c  llback = exprWal
24e10 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70 50 61 72 73  kNoop;.  w.pPars
24e20 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 71  e = pParse;.  sq
24e30 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
24e40 26 77 2c 20 70 53 65 6c 65 63 74 29 3b 0a 23 65  &w, pSelect);.#e
24e50 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  ndif.}.../*.** T
24e60 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
24e70 20 75 70 20 61 20 53 45 4c 45 43 54 20 73 74 61   up a SELECT sta
24e80 74 65 6d 65 6e 74 20 66 6f 72 20 70 72 6f 63 65  tement for proce
24e90 73 73 69 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 66  ssing.  The.** f
24ea0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 63 63 6f  ollowing is acco
24eb0 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a 0a 2a 2a 20  mplished:.**.** 
24ec0 20 20 20 20 2a 20 20 56 44 42 45 20 43 75 72 73      *  VDBE Curs
24ed0 6f 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  or numbers are a
24ee0 73 73 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 46  ssigned to all F
24ef0 52 4f 4d 2d 63 6c 61 75 73 65 20 74 65 72 6d 73  ROM-clause terms
24f00 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 45 70 68 65  ..**     *  Ephe
24f10 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
24f20 63 74 73 20 61 72 65 20 63 72 65 61 74 65 64 20  cts are created 
24f30 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61  for all FROM-cla
24f40 75 73 65 20 73 75 62 71 75 65 72 69 65 73 2e 0a  use subqueries..
24f50 2a 2a 20 20 20 20 20 2a 20 20 4f 4e 20 61 6e 64  **     *  ON and
24f60 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73 20 61   USING clauses a
24f70 72 65 20 73 68 69 66 74 65 64 20 69 6e 74 6f 20  re shifted into 
24f80 57 48 45 52 45 20 73 74 61 74 65 6d 65 6e 74 73  WHERE statements
24f90 0a 2a 2a 20 20 20 20 20 2a 20 20 57 69 6c 64 63  .**     *  Wildc
24fa0 61 72 64 73 20 22 2a 22 20 61 6e 64 20 22 54 41  ards "*" and "TA
24fb0 42 4c 45 2e 2a 22 20 69 6e 20 72 65 73 75 6c 74  BLE.*" in result
24fc0 20 73 65 74 73 20 61 72 65 20 65 78 70 61 6e 64   sets are expand
24fd0 65 64 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 49 64  ed..**     *  Id
24fe0 65 6e 74 69 66 69 65 72 73 20 69 6e 20 65 78 70  entifiers in exp
24ff0 72 65 73 73 69 6f 6e 20 61 72 65 20 6d 61 74 63  ression are matc
25000 68 65 64 20 74 6f 20 74 61 62 6c 65 73 2e 0a 2a  hed to tables..*
25010 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
25020 65 20 61 63 74 73 20 72 65 63 75 72 73 69 76 65  e acts recursive
25030 6c 79 20 6f 6e 20 61 6c 6c 20 73 75 62 71 75 65  ly on all subque
25040 72 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ries within the 
25050 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
25060 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
25070 70 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  p(.  Parse *pPar
25080 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
25090 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
250a0 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
250b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
250c0 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
250d0 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
250e0 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
250f0 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
25100 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
25110 6f 72 20 63 6f 6e 74 61 69 6e 65 72 20 2a 2f 0a  or container */.
25120 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25130 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
25140 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
25150 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
25160 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
25170 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
25180 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
25190 61 67 73 20 26 20 53 46 5f 48 61 73 54 79 70 65  ags & SF_HasType
251a0 49 6e 66 6f 20 29 20 72 65 74 75 72 6e 3b 0a 20  Info ) return;. 
251b0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
251c0 70 61 6e 64 28 70 50 61 72 73 65 2c 20 70 29 3b  pand(pParse, p);
251d0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
251e0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
251f0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
25200 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ;.  sqlite3Resol
25210 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
25220 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
25230 43 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  C);.  if( pParse
25240 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
25250 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
25260 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  urn;.  sqlite3Se
25270 6c 65 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28  lectAddTypeInfo(
25280 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d 0a 0a 2f  pParse, p);.}../
25290 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 61  *.** Reset the a
252a0 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75 6c  ggregate accumul
252b0 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
252c0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
252d0 6c 61 74 6f 72 20 69 73 20 61 20 73 65 74 20 6f  lator is a set o
252e0 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 74  f memory cells t
252f0 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69 6e 74 65  hat hold.** inte
25300 72 6d 65 64 69 61 74 65 20 72 65 73 75 6c 74 73  rmediate results
25310 20 77 68 69 6c 65 20 63 61 6c 63 75 6c 61 74 69   while calculati
25320 6e 67 20 61 6e 20 61 67 67 72 65 67 61 74 65 2e  ng an aggregate.
25330 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
25340 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
25350 20 74 68 61 74 20 73 74 6f 72 65 73 20 4e 55 4c   that stores NUL
25360 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20 74 68 6f  Ls in all of tho
25370 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 63 65 6c  se memory.** cel
25380 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ls..*/.static vo
25390 69 64 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61  id resetAccumula
253a0 74 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73  tor(Parse *pPars
253b0 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70 41 67 67  e, AggInfo *pAgg
253c0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
253d0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
253e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
253f0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
25400 20 2a 70 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e   *pFunc;.  int n
25410 52 65 67 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e  Reg = pAggInfo->
25420 6e 46 75 6e 63 20 2b 20 70 41 67 67 49 6e 66 6f  nFunc + pAggInfo
25430 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 66 28  ->nColumn;.  if(
25440 20 6e 52 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nReg==0 ) retur
25450 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  n;.#ifdef SQLITE
25460 5f 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72 69  _DEBUG.  /* Veri
25470 66 79 20 74 68 61 74 20 61 6c 6c 20 41 67 67 49  fy that all AggI
25480 6e 66 6f 20 72 65 67 69 73 74 65 72 73 20 61 72  nfo registers ar
25490 65 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  e within the ran
254a0 67 65 20 73 70 65 63 69 66 69 65 64 20 62 79 0a  ge specified by.
254b0 20 20 2a 2a 20 41 67 67 49 6e 66 6f 2e 6d 6e 52    ** AggInfo.mnR
254c0 65 67 2e 2e 41 67 67 49 6e 66 6f 2e 6d 78 52 65  eg..AggInfo.mxRe
254d0 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  g */.  assert( n
254e0 52 65 67 3d 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d  Reg==pAggInfo->m
254f0 78 52 65 67 2d 70 41 67 67 49 6e 66 6f 2d 3e 6d  xReg-pAggInfo->m
25500 6e 52 65 67 2b 31 20 29 3b 0a 20 20 66 6f 72 28  nReg+1 );.  for(
25510 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
25520 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
25530 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67      assert( pAgg
25540 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 4d  Info->aCol[i].iM
25550 65 6d 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e 6d 6e  em>=pAggInfo->mn
25560 52 65 67 0a 20 20 20 20 20 20 20 20 20 26 26 20  Reg.         && 
25570 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 69  pAggInfo->aCol[i
25580 5d 2e 69 4d 65 6d 3c 3d 70 41 67 67 49 6e 66 6f  ].iMem<=pAggInfo
25590 2d 3e 6d 78 52 65 67 20 29 3b 0a 20 20 7d 0a 20  ->mxReg );.  }. 
255a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67   for(i=0; i<pAgg
255b0 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b  Info->nFunc; i++
255c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
255d0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69  AggInfo->aFunc[i
255e0 5d 2e 69 4d 65 6d 3e 3d 70 41 67 67 49 6e 66 6f  ].iMem>=pAggInfo
255f0 2d 3e 6d 6e 52 65 67 0a 20 20 20 20 20 20 20 20  ->mnReg.        
25600 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 61 46   && pAggInfo->aF
25610 75 6e 63 5b 69 5d 2e 69 4d 65 6d 3c 3d 70 41 67  unc[i].iMem<=pAg
25620 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 20 29 3b 0a  gInfo->mxReg );.
25630 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
25640 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
25650 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 41  , OP_Null, 0, pA
25660 67 67 49 6e 66 6f 2d 3e 6d 6e 52 65 67 2c 20 70  ggInfo->mnReg, p
25670 41 67 67 49 6e 66 6f 2d 3e 6d 78 52 65 67 29 3b  AggInfo->mxReg);
25680 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41 67  .  for(pFunc=pAg
25690 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69 3d  gInfo->aFunc, i=
256a0 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e  0; i<pAggInfo->n
256b0 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e 63  Func; i++, pFunc
256c0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 75  ++){.    if( pFu
256d0 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 3e 3d 30  nc->iDistinct>=0
256e0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
256f0 70 45 20 3d 20 70 46 75 6e 63 2d 3e 70 45 78 70  pE = pFunc->pExp
25700 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  r;.      assert(
25710 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
25720 79 28 70 45 2c 20 45 50 5f 78 49 73 53 65 6c 65  y(pE, EP_xIsSele
25730 63 74 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ct) );.      if(
25740 20 70 45 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20   pE->x.pList==0 
25750 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69 73 74 2d 3e  || pE->x.pList->
25760 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
25770 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25780 4d 73 67 28 70 50 61 72 73 65 2c 20 22 44 49 53  Msg(pParse, "DIS
25790 54 49 4e 43 54 20 61 67 67 72 65 67 61 74 65 73  TINCT aggregates
257a0 20 6d 75 73 74 20 68 61 76 65 20 65 78 61 63 74   must have exact
257b0 6c 79 20 6f 6e 65 20 22 0a 20 20 20 20 20 20 20  ly one ".       
257c0 20 20 20 20 22 61 72 67 75 6d 65 6e 74 22 29 3b      "argument");
257d0 0a 20 20 20 20 20 20 20 20 70 46 75 6e 63 2d 3e  .        pFunc->
257e0 69 44 69 73 74 69 6e 63 74 20 3d 20 2d 31 3b 0a  iDistinct = -1;.
257f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
25800 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
25810 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66 6f  eyInfo = keyInfo
25820 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61  FromExprList(pPa
25830 72 73 65 2c 20 70 45 2d 3e 78 2e 70 4c 69 73 74  rse, pE->x.pList
25840 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
25850 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
25860 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65  v, OP_OpenEpheme
25870 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69 73  ral, pFunc->iDis
25880 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  tinct, 0, 0,.   
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70 4b         (char*)pK
258b0 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
258c0 46 4f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  FO);.      }.   
258d0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
258e0 49 6e 76 6f 6b 65 20 74 68 65 20 4f 50 5f 41 67  Invoke the OP_Ag
258f0 67 46 69 6e 61 6c 69 7a 65 20 6f 70 63 6f 64 65  gFinalize opcode
25900 20 66 6f 72 20 65 76 65 72 79 20 61 67 67 72 65   for every aggre
25910 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
25920 20 69 6e 20 74 68 65 20 41 67 67 49 6e 66 6f 20   in the AggInfo 
25930 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
25940 61 74 69 63 20 76 6f 69 64 20 66 69 6e 61 6c 69  atic void finali
25950 7a 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 50  zeAggFunctions(P
25960 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41 67  arse *pParse, Ag
25970 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 29  gInfo *pAggInfo)
25980 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
25990 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
259a0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 41  nt i;.  struct A
259b0 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a 70 46 3b  ggInfo_func *pF;
259c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d 70  .  for(i=0, pF=p
259d0 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b 20  AggInfo->aFunc; 
259e0 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  i<pAggInfo->nFun
259f0 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a 20  c; i++, pF++){. 
25a00 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
25a10 73 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e  st = pF->pExpr->
25a20 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  x.pList;.    ass
25a30 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
25a40 70 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c  perty(pF->pExpr,
25a50 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
25a60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
25a70 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41 67  eAddOp4(v, OP_Ag
25a80 67 46 69 6e 61 6c 2c 20 70 46 2d 3e 69 4d 65 6d  gFinal, pF->iMem
25a90 2c 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  , pList ? pList-
25aa0 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 2c 0a 20  >nExpr : 0, 0,. 
25ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ac0 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d 3e       (void*)pF->
25ad0 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44 45  pFunc, P4_FUNCDE
25ae0 46 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  F);.  }.}../*.**
25af0 20 55 70 64 61 74 65 20 74 68 65 20 61 63 63 75   Update the accu
25b00 6d 75 6c 61 74 6f 72 20 6d 65 6d 6f 72 79 20 63  mulator memory c
25b10 65 6c 6c 73 20 66 6f 72 20 61 6e 20 61 67 67 72  ells for an aggr
25b20 65 67 61 74 65 20 62 61 73 65 64 20 6f 6e 0a 2a  egate based on.*
25b30 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  * the current cu
25b40 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
25b50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 70  /.static void up
25b60 64 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28  dateAccumulator(
25b70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 41  Parse *pParse, A
25b80 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
25b90 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
25ba0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
25bb0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 65 67  int i;.  int reg
25bc0 48 69 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  Hit = 0;.  int a
25bd0 64 64 72 48 69 74 54 65 73 74 20 3d 20 30 3b 0a  ddrHitTest = 0;.
25be0 20 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f    struct AggInfo
25bf0 5f 66 75 6e 63 20 2a 70 46 3b 0a 20 20 73 74 72  _func *pF;.  str
25c00 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
25c10 2a 70 43 3b 0a 0a 20 20 70 41 67 67 49 6e 66 6f  *pC;..  pAggInfo
25c20 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20 31  ->directMode = 1
25c30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 3d  ;.  for(i=0, pF=
25c40 70 41 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 3b  pAggInfo->aFunc;
25c50 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75   i<pAggInfo->nFu
25c60 6e 63 3b 20 69 2b 2b 2c 20 70 46 2b 2b 29 7b 0a  nc; i++, pF++){.
25c70 20 20 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20      int nArg;.  
25c80 20 20 69 6e 74 20 61 64 64 72 4e 65 78 74 20 3d    int addrNext =
25c90 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 41   0;.    int regA
25ca0 67 67 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  gg;.    ExprList
25cb0 20 2a 70 4c 69 73 74 20 3d 20 70 46 2d 3e 70 45   *pList = pF->pE
25cc0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
25cd0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
25ce0 61 73 50 72 6f 70 65 72 74 79 28 70 46 2d 3e 70  asProperty(pF->p
25cf0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
25d00 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ct) );.    if( p
25d10 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 6e 41  List ){.      nA
25d20 72 67 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  rg = pList->nExp
25d30 72 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  r;.      regAgg 
25d40 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
25d50 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 41  Range(pParse, nA
25d60 72 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  rg);.      sqlit
25d70 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
25d80 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  st(pParse, pList
25d90 2c 20 72 65 67 41 67 67 2c 20 53 51 4c 49 54 45  , regAgg, SQLITE
25da0 5f 45 43 45 4c 5f 44 55 50 29 3b 0a 20 20 20 20  _ECEL_DUP);.    
25db0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 41 72  }else{.      nAr
25dc0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 67  g = 0;.      reg
25dd0 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Agg = 0;.    }. 
25de0 20 20 20 69 66 28 20 70 46 2d 3e 69 44 69 73 74     if( pF->iDist
25df0 69 6e 63 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  inct>=0 ){.     
25e00 20 61 64 64 72 4e 65 78 74 20 3d 20 73 71 6c 69   addrNext = sqli
25e10 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
25e20 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  (v);.      asser
25e30 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20 20  t( nArg==1 );.  
25e40 20 20 20 20 63 6f 64 65 44 69 73 74 69 6e 63 74      codeDistinct
25e50 28 70 50 61 72 73 65 2c 20 70 46 2d 3e 69 44 69  (pParse, pF->iDi
25e60 73 74 69 6e 63 74 2c 20 61 64 64 72 4e 65 78 74  stinct, addrNext
25e70 2c 20 31 2c 20 72 65 67 41 67 67 29 3b 0a 20 20  , 1, regAgg);.  
25e80 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 2d 3e    }.    if( pF->
25e90 70 46 75 6e 63 2d 3e 66 75 6e 63 46 6c 61 67 73  pFunc->funcFlags
25ea0 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
25eb0 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
25ec0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
25ed0 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 75 63  = 0;.      struc
25ee0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
25ef0 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 69 6e  *pItem;.      in
25f00 74 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t j;.      asser
25f10 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 20 20  t( pList!=0 );  
25f20 2f 2a 20 70 4c 69 73 74 21 3d 30 20 69 66 20 70  /* pList!=0 if p
25f30 46 2d 3e 70 46 75 6e 63 20 68 61 73 20 4e 45 45  F->pFunc has NEE
25f40 44 43 4f 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 66  DCOLL */.      f
25f50 6f 72 28 6a 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(j=0, pItem=pL
25f60 69 73 74 2d 3e 61 3b 20 21 70 43 6f 6c 6c 20 26  ist->a; !pColl &
25f70 26 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 2c 20 70  & j<nArg; j++, p
25f80 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
25f90 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
25fa0 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
25fb0 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
25fc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25fd0 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
25fe0 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70         pColl = p
25ff0 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74  Parse->db->pDflt
26000 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
26010 20 20 20 20 69 66 28 20 72 65 67 48 69 74 3d 3d      if( regHit==
26020 30 20 26 26 20 70 41 67 67 49 6e 66 6f 2d 3e 6e  0 && pAggInfo->n
26030 41 63 63 75 6d 75 6c 61 74 6f 72 20 29 20 72 65  Accumulator ) re
26040 67 48 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  gHit = ++pParse-
26050 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
26060 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
26070 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 72 65  , OP_CollSeq, re
26080 67 48 69 74 2c 20 30 2c 20 30 2c 20 28 63 68 61  gHit, 0, 0, (cha
26090 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f  r *)pColl, P4_CO
260a0 4c 4c 53 45 51 29 3b 0a 20 20 20 20 7d 0a 20 20  LLSEQ);.    }.  
260b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
260c0 4f 70 34 28 76 2c 20 4f 50 5f 41 67 67 53 74 65  Op4(v, OP_AggSte
260d0 70 2c 20 30 2c 20 72 65 67 41 67 67 2c 20 70 46  p, 0, regAgg, pF
260e0 2d 3e 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20  ->iMem,.        
260f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
26100 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
26110 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P4_FUNCDEF);.   
26120 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
26130 67 65 50 35 28 76 2c 20 28 75 38 29 6e 41 72 67  geP5(v, (u8)nArg
26140 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
26150 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
26160 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72 65  hange(pParse, re
26170 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a 20 20 20  gAgg, nArg);.   
26180 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
26190 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
261a0 20 72 65 67 41 67 67 2c 20 6e 41 72 67 29 3b 0a   regAgg, nArg);.
261b0 20 20 20 20 69 66 28 20 61 64 64 72 4e 65 78 74      if( addrNext
261c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
261d0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
261e0 6c 28 76 2c 20 61 64 64 72 4e 65 78 74 29 3b 0a  l(v, addrNext);.
261f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26200 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
26210 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
26220 20 20 2f 2a 20 42 65 66 6f 72 65 20 70 6f 70 75    /* Before popu
26230 6c 61 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d  lating the accum
26240 75 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73  ulator registers
26250 2c 20 63 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  , clear the colu
26260 6d 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 4f  mn cache..  ** O
26270 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6e 79  therwise, if any
26280 20 6f 66 20 74 68 65 20 72 65 71 75 69 72 65 64   of the required
26290 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 61   column values a
262a0 72 65 20 61 6c 72 65 61 64 79 20 70 72 65 73 65  re already prese
262b0 6e 74 20 0a 20 20 2a 2a 20 69 6e 20 72 65 67 69  nt .  ** in regi
262c0 73 74 65 72 73 2c 20 73 71 6c 69 74 65 33 45 78  sters, sqlite3Ex
262d0 70 72 43 6f 64 65 28 29 20 6d 61 79 20 75 73 65  prCode() may use
262e0 20 4f 50 5f 53 43 6f 70 79 20 74 6f 20 63 6f 70   OP_SCopy to cop
262f0 79 20 74 68 65 20 76 61 6c 75 65 0a 20 20 2a 2a  y the value.  **
26300 20 74 6f 20 70 43 2d 3e 69 4d 65 6d 2e 20 42 75   to pC->iMem. Bu
26310 74 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  t by the time th
26320 65 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 2c  e value is used,
26330 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 72 65   the original re
26340 67 69 73 74 65 72 0a 20 20 2a 2a 20 6d 61 79 20  gister.  ** may 
26350 68 61 76 65 20 62 65 65 6e 20 75 73 65 64 2c 20  have been used, 
26360 69 6e 76 61 6c 69 64 61 74 69 6e 67 20 74 68 65  invalidating the
26370 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 75 66 66   underlying buff
26380 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20  er holding the. 
26390 20 2a 2a 20 74 65 78 74 20 6f 72 20 62 6c 6f 62   ** text or blob
263a0 20 76 61 6c 75 65 2e 20 53 65 65 20 74 69 63 6b   value. See tick
263b0 65 74 20 5b 38 38 33 30 33 34 64 63 62 35 5d 2e  et [883034dcb5].
263c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 6f 74 68  .  **.  ** Anoth
263d0 65 72 20 73 6f 6c 75 74 69 6f 6e 20 77 6f 75 6c  er solution woul
263e0 64 20 62 65 20 74 6f 20 63 68 61 6e 67 65 20 74  d be to change t
263f0 68 65 20 4f 50 5f 53 43 6f 70 79 20 75 73 65 64  he OP_SCopy used
26400 20 74 6f 20 63 6f 70 79 20 63 61 63 68 65 64 0a   to copy cached.
26410 20 20 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 61    ** values to a
26420 6e 20 4f 50 5f 43 6f 70 79 2e 0a 20 20 2a 2f 0a  n OP_Copy..  */.
26430 20 20 69 66 28 20 72 65 67 48 69 74 20 29 7b 0a    if( regHit ){.
26440 20 20 20 20 61 64 64 72 48 69 74 54 65 73 74 20      addrHitTest 
26450 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
26460 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
26470 67 48 69 74 29 3b 20 56 64 62 65 43 6f 76 65 72  gHit); VdbeCover
26480 61 67 65 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71  age(v);.  }.  sq
26490 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
264a0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66  ear(pParse);.  f
264b0 6f 72 28 69 3d 30 2c 20 70 43 3d 70 41 67 67 49  or(i=0, pC=pAggI
264c0 6e 66 6f 2d 3e 61 43 6f 6c 3b 20 69 3c 70 41 67  nfo->aCol; i<pAg
264d0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
264e0 74 6f 72 3b 20 69 2b 2b 2c 20 70 43 2b 2b 29 7b  tor; i++, pC++){
264f0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
26500 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 43 2d  Code(pParse, pC-
26510 3e 70 45 78 70 72 2c 20 70 43 2d 3e 69 4d 65 6d  >pExpr, pC->iMem
26520 29 3b 0a 20 20 7d 0a 20 20 70 41 67 67 49 6e 66  );.  }.  pAggInf
26530 6f 2d 3e 64 69 72 65 63 74 4d 6f 64 65 20 3d 20  o->directMode = 
26540 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
26550 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
26560 65 29 3b 0a 20 20 69 66 28 20 61 64 64 72 48 69  e);.  if( addrHi
26570 74 54 65 73 74 20 29 7b 0a 20 20 20 20 73 71 6c  tTest ){.    sql
26580 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
26590 28 76 2c 20 61 64 64 72 48 69 74 54 65 73 74 29  (v, addrHitTest)
265a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
265b0 64 64 20 61 20 73 69 6e 67 6c 65 20 4f 50 5f 45  dd a single OP_E
265c0 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69  xplain instructi
265d0 6f 6e 20 74 6f 20 74 68 65 20 56 44 42 45 20 74  on to the VDBE t
265e0 6f 20 65 78 70 6c 61 69 6e 20 61 20 73 69 6d 70  o explain a simp
265f0 6c 65 0a 2a 2a 20 63 6f 75 6e 74 28 2a 29 20 71  le.** count(*) q
26600 75 65 72 79 20 28 22 53 45 4c 45 43 54 20 63 6f  uery ("SELECT co
26610 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 54 61 62  unt(*) FROM pTab
26620 22 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ")..*/.#ifndef S
26630 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
26640 49 4e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  IN.static void e
26650 78 70 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e  xplainSimpleCoun
26660 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
26670 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
26680 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
26690 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
266a0 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
266b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
266c0 62 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65  ble being querie
266d0 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
266e0 64 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  dx              
266f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
26700 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
26710 20 73 63 61 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a   scan, or NULL *
26720 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
26730 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
26740 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 71 70 20  .    char *zEqp 
26750 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
26760 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 53 43  (pParse->db, "SC
26770 41 4e 20 54 41 42 4c 45 20 25 73 25 73 25 73 22  AN TABLE %s%s%s"
26780 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
26790 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
267a0 70 49 64 78 20 3f 20 22 20 55 53 49 4e 47 20 43  pIdx ? " USING C
267b0 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22 20  OVERING INDEX " 
267c0 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 70 49  : "",.        pI
267d0 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65  dx ? pIdx->zName
267e0 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20 20   : "".    );.   
267f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26800 70 34 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  p4(.        pPar
26810 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50 5f 45 78  se->pVdbe, OP_Ex
26820 70 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69  plain, pParse->i
26830 53 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20  SelectId, 0, 0, 
26840 7a 45 71 70 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zEqp, P4_DYNAMIC
26850 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  .    );.  }.}.#e
26860 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 65 78 70  lse.# define exp
26870 6c 61 69 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28  lainSimpleCount(
26880 61 2c 62 2c 63 29 0a 23 65 6e 64 69 66 0a 0a 2f  a,b,c).#endif../
26890 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
268a0 64 65 20 66 6f 72 20 74 68 65 20 53 45 4c 45 43  de for the SELEC
268b0 54 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65  T statement give
268c0 6e 20 69 6e 20 74 68 65 20 70 20 61 72 67 75 6d  n in the p argum
268d0 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ent.  .**.** The
268e0 20 72 65 73 75 6c 74 73 20 61 72 65 20 72 65 74   results are ret
268f0 75 72 6e 65 64 20 61 63 63 6f 72 64 69 6e 67 20  urned according 
26900 74 6f 20 74 68 65 20 53 65 6c 65 63 74 44 65 73  to the SelectDes
26910 74 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20  t structure..** 
26920 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  See comments in 
26930 73 71 6c 69 74 65 49 6e 74 2e 68 20 66 6f 72 20  sqliteInt.h for 
26940 66 75 72 74 68 65 72 20 69 6e 66 6f 72 6d 61 74  further informat
26950 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ion..**.** This 
26960 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
26970 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
26980 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
26990 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
269a0 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
269b0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
269c0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
269d0 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
269e0 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
269f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
26a00 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
26a10 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
26a20 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
26a30 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
26a40 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
26a50 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
26a60 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
26a70 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
26a80 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
26a90 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
26aa0 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
26ab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
26ac0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
26ad0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
26ae0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
26af0 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
26b00 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
26b10 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
26b20 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
26b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
26b40 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
26b50 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
26b60 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
26b70 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
26b80 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
26b90 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
26ba0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
26bb0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
26bc0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
26bd0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
26be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26bf0 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
26c00 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
26c10 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
26c20 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
26c30 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
26c40 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
26c50 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
26c60 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
26c70 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
26c80 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
26c90 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
26ca0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
26cb0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
26cc0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
26cd0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
26ce0 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
26cf0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
26d00 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
26d10 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
26d20 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
26d30 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
26d40 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
26d50 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
26d60 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
26d70 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
26d80 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
26d90 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
26da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
26db0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
26dc0 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
26dd0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
26de0 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
26df0 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
26e00 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
26e10 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 44  struction */.  D
26e20 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74  istinctCtx sDist
26e30 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e  inct; /* Info on
26e40 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
26e50 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
26e60 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  d */.  AggInfo s
26e70 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
26e80 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
26e90 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
26ea0 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
26eb0 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
26ec0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
26ed0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
26ee0 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
26ef0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
26f00 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
26f10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
26f20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26f30 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
26f40 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
26f50 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
26f60 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
26f70 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
26f80 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
26f90 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
26fa0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
26fb0 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
26fc0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
26fd0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
26fe0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
26ff0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
27000 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
27010 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
27020 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
27030 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
27040 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
27050 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
27060 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72  ));..  if( Ignor
27070 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
27080 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
27090 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
270a0 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
270b0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
270c0 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
270d0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
270e0 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
270f0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
27100 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20  T_Discard);.    
27110 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
27120 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
27130 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
27140 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
27150 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
27160 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
27170 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
27180 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
27190 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
271a0 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
271b0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
271c0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
271d0 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
271e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
271f0 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
27200 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65  , p, 0);.  pOrde
27210 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
27220 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
27230 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
27240 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
27250 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
27260 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
27270 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
27280 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
27290 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
272a0 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
272b0 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
272c0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
272d0 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
272e0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
272f0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
27300 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
27310 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
27320 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
27330 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
27340 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
27350 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
27360 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
27370 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
27380 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
27390 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
273a0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
273b0 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
273c0 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
273d0 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
273e0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
273f0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
27400 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
27410 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
27420 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
27430 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
27440 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
27450 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
27460 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
27470 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
27480 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
27490 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
274a0 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
274b0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
274c0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
274d0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
274e0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
274f0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
27500 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
27510 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
27520 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
27530 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
27540 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
27550 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
27560 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74    /* Sometimes t
27570 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75  he code for a su
27580 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67  bquery will be g
27590 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68  enerated more th
275a0 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20  an.    ** once, 
275b0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
275c0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57  is part of the W
275d0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61  HERE clause in a
275e0 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20   LEFT JOIN,.    
275f0 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  ** for example. 
27600 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
27610 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65  o not regenerate
27620 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e   the code to man
27630 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76  ifest.    ** a v
27640 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f  iew or the co-ro
27650 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65  utine to impleme
27660 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  nt a view.  The 
27670 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20  first instance. 
27680 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69     ** is suffici
27690 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20  ent, though the 
276a0 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  subroutine to ma
276b0 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20  nifest the view 
276c0 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a  does need.    **
276d0 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61   to be invoked a
276e0 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
276f0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
27700 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Sub ){.      if(
27710 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
27720 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tine==0 ){.     
27730 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
27740 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
27750 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
27760 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rn, pItem->addrF
27770 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d  illSub);.      }
27780 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
27790 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
277a0 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
277b0 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
277c0 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
277d0 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
277e0 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
277f0 72 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20  red to by this, 
27800 74 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63  the parent selec
27810 74 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c  t. The child sel
27820 65 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63  ect.    ** may c
27830 6f 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f  ontain expressio
27840 6e 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f  n trees of at mo
27850 73 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54  st.    ** (SQLIT
27860 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
27870 2d 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20  -Parse.nHeight) 
27880 68 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20  height. This is 
27890 61 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72  a bit.    ** mor
278a0 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74  e conservative t
278b0 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62  han necessary, b
278c0 75 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74  ut much easier t
278d0 68 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20  han enforcing.  
278e0 20 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69    ** an exact li
278f0 6d 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mit..    */.    
27900 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
27910 2b 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  += sqlite3Select
27920 45 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a  ExprHeight(p);..
27930 20 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28      isAggSub = (
27940 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pSub->selFlags &
27950 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d   SF_Aggregate)!=
27960 30 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74  0;.    if( flatt
27970 65 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73  enSubquery(pPars
27980 65 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20  e, p, i, isAgg, 
27990 69 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20  isAggSub) ){.   
279a0 20 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75     /* This subqu
279b0 65 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72  ery can be absor
279c0 62 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72  bed into its par
279d0 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ent. */.      if
279e0 28 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20  ( isAggSub ){.  
279f0 20 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b        isAgg = 1;
27a00 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46  .        p->selF
27a10 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65  lags |= SF_Aggre
27a20 67 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gate;.      }.  
27a30 20 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20      i = -1;.    
27a40 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69  }else if( pTabLi
27a50 73 74 2d 3e 6e 53 72 63 3d 3d 31 0a 20 20 20 20  st->nSrc==1.    
27a60 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69         && Optimi
27a70 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62  zationEnabled(db
27a80 2c 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72  , SQLITE_SubqCor
27a90 6f 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20  outine).    ){. 
27aa0 20 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e       /* Implemen
27ab0 74 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74  t a co-routine t
27ac0 68 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20  hat will return 
27ad0 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20  a single row of 
27ae0 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20  the result.     
27af0 20 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20   ** set on each 
27b00 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20  invocation..    
27b10 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
27b20 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ddrTop = sqlite3
27b30 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
27b40 76 29 2b 31 3b 0a 20 20 20 20 20 20 70 49 74 65  v)+1;.      pIte
27b50 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
27b60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
27b70 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27b80 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69  AddOp3(v, OP_Ini
27b90 74 43 6f 72 6f 75 74 69 6e 65 2c 20 70 49 74 65  tCoroutine, pIte
27ba0 6d 2d 3e 72 65 67 52 65 74 75 72 6e 2c 20 30 2c  m->regReturn, 0,
27bb0 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 20   addrTop);.     
27bc0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
27bd0 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54   "%s", pItem->pT
27be0 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ab->zName));.   
27bf0 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69     pItem->addrFi
27c00 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70 3b  llSub = addrTop;
27c10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
27c20 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
27c30 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  st, SRT_Coroutin
27c40 65 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  e, pItem->regRet
27c50 75 72 6e 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  urn);.      expl
27c60 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 70 49  ainSetInteger(pI
27c70 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20  tem->iSelectId, 
27c80 28 75 38 29 70 50 61 72 73 65 2d 3e 69 4e 65 78  (u8)pParse->iNex
27c90 74 53 65 6c 65 63 74 49 64 29 3b 0a 20 20 20 20  tSelectId);.    
27ca0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
27cb0 70 50 61 72 73 65 2c 20 70 53 75 62 2c 20 26 64  pParse, pSub, &d
27cc0 65 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74 65  est);.      pIte
27cd0 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74  m->pTab->nRowEst
27ce0 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 70 53 75   = (unsigned)pSu
27cf0 62 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20  b->nSelectRow;. 
27d00 20 20 20 20 20 70 49 74 65 6d 2d 3e 76 69 61 43       pItem->viaC
27d10 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 20 20  oroutine = 1;.  
27d20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67 52 65      pItem->regRe
27d30 73 75 6c 74 20 3d 20 64 65 73 74 2e 69 53 64 73  sult = dest.iSds
27d40 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
27d50 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
27d60 5f 45 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 70  _EndCoroutine, p
27d70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29  Item->regReturn)
27d80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27d90 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
27da0 64 64 72 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  ddrTop-1);.     
27db0 20 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d   sqlite3ClearTem
27dc0 70 52 65 67 43 61 63 68 65 28 70 50 61 72 73 65  pRegCache(pParse
27dd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
27de0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
27df0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
27e00 74 20 77 69 6c 6c 20 66 69 6c 6c 20 61 6e 20 65  t will fill an e
27e10 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 77  phemeral table w
27e20 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ith.      ** the
27e30 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
27e40 20 73 75 62 71 75 65 72 79 2e 20 20 70 49 74 65   subquery.  pIte
27e50 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 77  m->addrFillSub w
27e60 69 6c 6c 20 70 6f 69 6e 74 0a 20 20 20 20 20 20  ill point.      
27e70 2a 2a 20 74 6f 20 74 68 65 20 61 64 64 72 65 73  ** to the addres
27e80 73 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74  s of the generat
27e90 65 64 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  ed subroutine.  
27ea0 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
27eb0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 20 72  .      ** is a r
27ec0 65 67 69 73 74 65 72 20 61 6c 6c 6f 63 61 74 65  egister allocate
27ed0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 73 75  d to hold the su
27ee0 62 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20  broutine return 
27ef0 61 64 64 72 65 73 73 0a 20 20 20 20 20 20 2a 2f  address.      */
27f00 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 41 64  .      int topAd
27f10 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e  dr;.      int on
27f20 63 65 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20  ceAddr = 0;.    
27f30 20 20 69 6e 74 20 72 65 74 41 64 64 72 3b 0a 20    int retAddr;. 
27f40 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
27f50 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3d  em->addrFillSub=
27f60 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  =0 );.      pIte
27f70 6d 2d 3e 72 65 67 52 65 74 75 72 6e 20 3d 20 2b  m->regReturn = +
27f80 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
27f90 20 20 20 20 20 74 6f 70 41 64 64 72 20 3d 20 73       topAddr = s
27fa0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
27fb0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
27fc0 30 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  0, pItem->regRet
27fd0 75 72 6e 29 3b 0a 20 20 20 20 20 20 70 49 74 65  urn);.      pIte
27fe0 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 20 3d  m->addrFillSub =
27ff0 20 74 6f 70 41 64 64 72 2b 31 3b 0a 20 20 20 20   topAddr+1;.    
28000 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 73 43    if( pItem->isC
28010 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 29 7b 0a  orrelated==0 ){.
28020 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
28030 65 20 73 75 62 71 75 65 72 79 20 69 73 20 6e 6f  e subquery is no
28040 74 20 63 6f 72 72 65 6c 61 74 65 64 20 61 6e 64  t correlated and
28050 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69   if we are not i
28060 6e 73 69 64 65 20 6f 66 0a 20 20 20 20 20 20 20  nside of.       
28070 20 2a 2a 20 61 20 74 72 69 67 67 65 72 2c 20 74   ** a trigger, t
28080 68 65 6e 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  hen we only need
28090 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20   to compute the 
280a0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 75 62  value of the sub
280b0 71 75 65 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  query.        **
280c0 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 20 20   once. */.      
280d0 20 20 6f 6e 63 65 41 64 64 72 20 3d 20 73 71 6c    onceAddr = sql
280e0 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50 61  ite3CodeOnce(pPa
280f0 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  rse); VdbeCovera
28100 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 56  ge(v);.        V
28110 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
28120 6d 61 74 65 72 69 61 6c 69 7a 65 20 5c 22 25 73  materialize \"%s
28130 5c 22 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  \"", pItem->pTab
28140 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
28150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28160 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28  VdbeNoopComment(
28170 28 76 2c 20 22 6d 61 74 65 72 69 61 6c 69 7a 65  (v, "materialize
28180 20 5c 22 25 73 5c 22 22 2c 20 70 49 74 65 6d 2d   \"%s\"", pItem-
28190 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  >pTab->zName));.
281a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
281b0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
281c0 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 45  nit(&dest, SRT_E
281d0 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d 3e  phemTab, pItem->
281e0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
281f0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
28200 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74  r(pItem->iSelect
28210 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d 3e  Id, (u8)pParse->
28220 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a  iNextSelectId);.
28230 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
28240 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75 62  ect(pParse, pSub
28250 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
28260 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52 6f  pItem->pTab->nRo
28270 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
28280 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52 6f  )pSub->nSelectRo
28290 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  w;.      if( onc
282a0 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33 56  eAddr ) sqlite3V
282b0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6f  dbeJumpHere(v, o
282c0 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20 20  nceAddr);.      
282d0 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74 65  retAddr = sqlite
282e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
282f0 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d 2d  P_Return, pItem-
28300 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20  >regReturn);.   
28310 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
28320 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49 74  v, "end %s", pIt
28330 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
28340 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28350 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
28360 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64 72  topAddr, retAddr
28370 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
28380 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63 68  ClearTempRegCach
28390 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 7d  e(pParse);.    }
283a0 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72 73  .    if( /*pPars
283b0 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62 2d  e->nErr ||*/ db-
283c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
283d0 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c 65  .      goto sele
283e0 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  ct_end;.    }.  
283f0 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
28400 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  t -= sqlite3Sele
28410 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29 3b  ctExprHeight(p);
28420 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d 20  .    pTabList = 
28430 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66 28  p->pSrc;.    if(
28440 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65 72   !IgnorableOrder
28450 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20 20  by(pDest) ){.   
28460 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 2d     pOrderBy = p-
28470 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 7d  >pOrderBy;.    }
28480 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
28490 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64 69  p->pEList;.#endi
284a0 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d 3e  f.  pWhere = p->
284b0 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75 70  pWhere;.  pGroup
284c0 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
284d0 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70 2d  ;.  pHaving = p-
284e0 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69 73  >pHaving;.  sDis
284f0 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20 28  tinct.isTnct = (
28500 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
28510 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a 0a  _Distinct)!=0;..
28520 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28530 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
28540 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ECT.  /* If ther
28550 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75 65  e is are a seque
28560 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c 20  nce of queries, 
28570 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20 6f  do the earlier o
28580 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f 0a  nes first..  */.
28590 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
285a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6d 75 6c 74  ){.    rc = mult
285b0 69 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  iSelect(pParse, 
285c0 70 2c 20 70 44 65 73 74 29 3b 0a 20 20 20 20 65  p, pDest);.    e
285d0 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
285e0 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
285f0 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
28600 63 74 49 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ctId);.    retur
28610 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
28620 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
28630 69 73 20 62 6f 74 68 20 61 20 47 52 4f 55 50 20  is both a GROUP 
28640 42 59 20 61 6e 64 20 61 6e 20 4f 52 44 45 52 20  BY and an ORDER 
28650 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
28660 65 79 20 61 72 65 0a 20 20 2a 2a 20 69 64 65 6e  ey are.  ** iden
28670 74 69 63 61 6c 2c 20 74 68 65 6e 20 64 69 73 61  tical, then disa
28680 62 6c 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ble the ORDER BY
28690 20 63 6c 61 75 73 65 20 73 69 6e 63 65 20 74 68   clause since th
286a0 65 20 47 52 4f 55 50 20 42 59 0a 20 20 2a 2a 20  e GROUP BY.  ** 
286b0 77 69 6c 6c 20 63 61 75 73 65 20 65 6c 65 6d 65  will cause eleme
286c0 6e 74 73 20 74 6f 20 63 6f 6d 65 20 6f 75 74 20  nts to come out 
286d0 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
286e0 72 64 65 72 2e 20 20 54 68 69 73 20 69 73 0a 20  rder.  This is. 
286f0 20 2a 2a 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   ** an optimizat
28700 69 6f 6e 20 2d 20 74 68 65 20 63 6f 72 72 65 63  ion - the correc
28710 74 20 61 6e 73 77 65 72 20 73 68 6f 75 6c 64 20  t answer should 
28720 72 65 73 75 6c 74 20 72 65 67 61 72 64 6c 65 73  result regardles
28730 73 2e 0a 20 20 2a 2a 20 55 73 65 20 74 68 65 20  s..  ** Use the 
28740 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
28750 64 65 72 20 66 6c 61 67 20 77 69 74 68 20 53 51  der flag with SQ
28760 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
28770 54 49 4d 49 5a 45 52 0a 20 20 2a 2a 20 74 6f 20  TIMIZER.  ** to 
28780 64 69 73 61 62 6c 65 20 74 68 69 73 20 6f 70 74  disable this opt
28790 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 65  imization for te
287a0 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a  sting purposes..
287b0 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
287c0 65 33 45 78 70 72 4c 69 73 74 43 6f 6d 70 61 72  e3ExprListCompar
287d0 65 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 70  e(p->pGroupBy, p
287e0 4f 72 64 65 72 42 79 2c 20 2d 31 29 3d 3d 30 0a  OrderBy, -1)==0.
287f0 20 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69           && Opti
28800 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28  mizationEnabled(
28810 64 62 2c 20 53 51 4c 49 54 45 5f 47 72 6f 75 70  db, SQLITE_Group
28820 42 79 4f 72 64 65 72 29 20 29 7b 0a 20 20 20 20  ByOrder) ){.    
28830 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
28840 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 71  }..  /* If the q
28850 75 65 72 79 20 69 73 20 44 49 53 54 49 4e 43 54  uery is DISTINCT
28860 20 77 69 74 68 20 61 6e 20 4f 52 44 45 52 20 42   with an ORDER B
28870 59 20 62 75 74 20 69 73 20 6e 6f 74 20 61 6e 20  Y but is not an 
28880 61 67 67 72 65 67 61 74 65 2c 20 61 6e 64 20 0a  aggregate, and .
28890 20 20 2a 2a 20 69 66 20 74 68 65 20 73 65 6c 65    ** if the sele
288a0 63 74 2d 6c 69 73 74 20 69 73 20 74 68 65 20 73  ct-list is the s
288b0 61 6d 65 20 61 73 20 74 68 65 20 4f 52 44 45 52  ame as the ORDER
288c0 20 42 59 20 6c 69 73 74 2c 20 74 68 65 6e 20 74   BY list, then t
288d0 68 69 73 20 71 75 65 72 79 0a 20 20 2a 2a 20 63  his query.  ** c
288e0 61 6e 20 62 65 20 72 65 77 72 69 74 74 65 6e 20  an be rewritten 
288f0 61 73 20 61 20 47 52 4f 55 50 20 42 59 2e 20 49  as a GROUP BY. I
28900 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
28910 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
28920 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
28930 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20  CT xyz FROM ... 
28940 4f 52 44 45 52 20 42 59 20 78 79 7a 0a 20 20 2a  ORDER BY xyz.  *
28950 2a 0a 20 20 2a 2a 20 69 73 20 74 72 61 6e 73 66  *.  ** is transf
28960 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 2a 2a 0a 20  ormed to:.  **. 
28970 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 78   **     SELECT x
28980 79 7a 20 46 52 4f 4d 20 2e 2e 2e 20 47 52 4f 55  yz FROM ... GROU
28990 50 20 42 59 20 78 79 7a 0a 20 20 2a 2a 0a 20 20  P BY xyz.  **.  
289a0 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  ** The second fo
289b0 72 6d 20 69 73 20 70 72 65 66 65 72 72 65 64 20  rm is preferred 
289c0 61 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65  as a single inde
289d0 78 20 28 6f 72 20 74 65 6d 70 2d 74 61 62 6c 65  x (or temp-table
289e0 29 20 6d 61 79 20 62 65 20 0a 20 20 2a 2a 20 75  ) may be .  ** u
289f0 73 65 64 20 66 6f 72 20 62 6f 74 68 20 74 68 65  sed for both the
28a00 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 44 49   ORDER BY and DI
28a10 53 54 49 4e 43 54 20 70 72 6f 63 65 73 73 69 6e  STINCT processin
28a20 67 2e 20 41 73 20 6f 72 69 67 69 6e 61 6c 6c 79  g. As originally
28a30 20 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74   .  ** written t
28a40 68 65 20 71 75 65 72 79 20 6d 75 73 74 20 75 73  he query must us
28a50 65 20 61 20 74 65 6d 70 2d 74 61 62 6c 65 20 66  e a temp-table f
28a60 6f 72 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  or at least one 
28a70 6f 66 20 74 68 65 20 4f 52 44 45 52 20 0a 20 20  of the ORDER .  
28a80 2a 2a 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  ** BY and DISTIN
28a90 43 54 2c 20 61 6e 64 20 61 6e 20 69 6e 64 65 78  CT, and an index
28aa0 20 6f 72 20 73 65 70 61 72 61 74 65 20 74 65 6d   or separate tem
28ab0 70 2d 74 61 62 6c 65 20 66 6f 72 20 74 68 65 20  p-table for the 
28ac0 6f 74 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  other..  */.  if
28ad0 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
28ae0 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46   (SF_Distinct|SF
28af0 5f 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46  _Aggregate))==SF
28b00 5f 44 69 73 74 69 6e 63 74 20 0a 20 20 20 26 26  _Distinct .   &&
28b10 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
28b20 43 6f 6d 70 61 72 65 28 70 4f 72 64 65 72 42 79  Compare(pOrderBy
28b30 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 29  , p->pEList, -1)
28b40 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  ==0.  ){.    p->
28b50 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
28b60 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70 2d  Distinct;.    p-
28b70 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69  >pGroupBy = sqli
28b80 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
28b90 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29  b, p->pEList, 0)
28ba0 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
28bb0 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
28bc0 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a    pOrderBy = 0;.
28bd0 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74 68      /* Notice th
28be0 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74 20  at even thought 
28bf0 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73 20  SF_Distinct has 
28c00 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72 6f  been cleared fro
28c10 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a 20  m p->selFlags,. 
28c20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74 69     ** the sDisti
28c30 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73 74  nct.isTnct is st
28c40 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65 2c  ill set.  Hence,
28c50 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65 6e   isTnct represen
28c60 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 72  ts the.    ** or
28c70 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20 6f  iginal setting o
28c80 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e 63  f the SF_Distinc
28c90 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65 20  t flag, not the 
28ca0 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67 20  current setting 
28cb0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  */.    assert( s
28cc0 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20  Distinct.isTnct 
28cd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
28ce0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
28cf0 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
28d00 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a 20  n this sorting. 
28d10 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74 20   ** index might 
28d20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e 75  end up being unu
28d30 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61 20  sed if the data 
28d40 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78 74  can be .  ** ext
28d50 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73 6f  racted in pre-so
28d60 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66 20  rted order.  If 
28d70 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73 65  that is the case
28d80 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
28d90 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
28da0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 6c   instruction wil
28db0 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20  l be changed to 
28dc0 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65 0a  an OP_Noop once.
28dd0 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20 6f    ** we figure o
28de0 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72 74  ut that the sort
28df0 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  ing index is not
28e00 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61 64   needed.  The ad
28e10 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a 2a  drSortIndex.  **
28e20 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73 65   variable is use
28e30 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20  d to facilitate 
28e40 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a  that change..  *
28e50 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  /.  if( pOrderBy
28e60 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f 20   ){.    KeyInfo 
28e70 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 70  *pKeyInfo;.    p
28e80 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
28e90 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
28ea0 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20  arse, pOrderBy, 
28eb0 30 29 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  0);.    pOrderBy
28ec0 2d 3e 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61  ->iECursor = pPa
28ed0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
28ee0 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d   p->addrOpenEphm
28ef0 5b 32 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e  [2] = addrSortIn
28f00 64 65 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69  dex =.      sqli
28f10 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
28f20 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
28f30 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
28f50 72 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72  rderBy->iECursor
28f60 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
28f70 72 2b 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  r+2, 0,.        
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f90 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e     (char*)pKeyIn
28fa0 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b  fo, P4_KEYINFO);
28fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64  .  }else{.    ad
28fc0 64 72 53 6f 72 74 49 6e 64 65 78 20 3d 20 2d 31  drSortIndex = -1
28fd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
28fe0 68 65 20 6f 75 74 70 75 74 20 69 73 20 64 65 73  he output is des
28ff0 74 69 6e 65 64 20 66 6f 72 20 61 20 74 65 6d 70  tined for a temp
29000 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 6f 70 65  orary table, ope
29010 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 0a 20 20  n that table..  
29020 2a 2f 0a 20 20 69 66 28 20 70 44 65 73 74 2d 3e  */.  if( pDest->
29030 65 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d  eDest==SRT_Ephem
29040 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Tab ){.    sqlit
29050 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
29060 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
29070 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d  , pDest->iSDParm
29080 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
29090 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
290a0 74 68 65 20 6c 69 6d 69 74 65 72 2e 0a 20 20 2a  the limiter..  *
290b0 2f 0a 20 20 69 45 6e 64 20 3d 20 73 71 6c 69 74  /.  iEnd = sqlit
290c0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
290d0 76 29 3b 0a 20 20 70 2d 3e 6e 53 65 6c 65 63 74  v);.  p->nSelect
290e0 52 6f 77 20 3d 20 4c 41 52 47 45 53 54 5f 49 4e  Row = LARGEST_IN
290f0 54 36 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69  T64;.  computeLi
29100 6d 69 74 52 65 67 69 73 74 65 72 73 28 70 50 61  mitRegisters(pPa
29110 72 73 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20  rse, p, iEnd);. 
29120 20 69 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d   if( p->iLimit==
29130 30 20 26 26 20 61 64 64 72 53 6f 72 74 49 6e 64  0 && addrSortInd
29140 65 78 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ex>=0 ){.    sql
29150 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
29160 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d   addrSortIndex)-
29170 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72  >opcode = OP_Sor
29180 74 65 72 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e  terOpen;.    p->
29190 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55  selFlags |= SF_U
291a0 73 65 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20  seSorter;.  }.. 
291b0 20 2f 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75   /* Open a virtu
291c0 61 6c 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  al index to use 
291d0 66 6f 72 20 74 68 65 20 64 69 73 74 69 6e 63 74  for the distinct
291e0 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   set..  */.  if(
291f0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
29200 46 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20  F_Distinct ){.  
29210 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54    sDistinct.tabT
29220 6e 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  nct = pParse->nT
29230 61 62 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69  ab++;.    sDisti
29240 6e 63 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73  nct.addrTnct = s
29250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
29260 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
29270 65 72 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  eral,.          
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29290 20 20 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e        sDistinct.
292a0 74 61 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20  tabTnct, 0, 0,. 
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
292d0 63 68 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f  char*)keyInfoFro
292e0 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  mExprList(pParse
292f0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30 29 2c  , p->pEList, 0),
29300 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29320 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20   P4_KEYINFO);.  
29330 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
29340 6e 67 65 50 35 28 76 2c 20 42 54 52 45 45 5f 55  ngeP5(v, BTREE_U
29350 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20 20 20 73  NORDERED);.    s
29360 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
29370 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
29380 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 3b 0a 20  NCT_UNORDERED;. 
29390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 44 69 73   }else{.    sDis
293a0 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 20  tinct.eTnctType 
293b0 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  = WHERE_DISTINCT
293c0 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20 20 69 66  _NOOP;.  }..  if
293d0 28 20 21 69 73 41 67 67 20 26 26 20 70 47 72 6f  ( !isAgg && pGro
293e0 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  upBy==0 ){.    /
293f0 2a 20 4e 6f 20 61 67 67 72 65 67 61 74 65 20 66  * No aggregate f
29400 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 20  unctions and no 
29410 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
29420 2a 2f 0a 20 20 20 20 75 31 36 20 77 63 74 72 6c  */.    u16 wctrl
29430 46 6c 61 67 73 20 3d 20 28 73 44 69 73 74 69 6e  Flags = (sDistin
29440 63 74 2e 69 73 54 6e 63 74 20 3f 20 57 48 45 52  ct.isTnct ? WHER
29450 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
29460 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65  : 0);..    /* Be
29470 67 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  gin the database
29480 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 70 57   scan. */.    pW
29490 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68  Info = sqlite3Wh
294a0 65 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c  ereBegin(pParse,
294b0 20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72   pTabList, pWher
294c0 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 2d 3e  e, pOrderBy, p->
294d0 70 45 4c 69 73 74 2c 0a 20 20 20 20 20 20 20 20  pEList,.        
294e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294f0 20 20 20 20 20 20 20 77 63 74 72 6c 46 6c 61 67         wctrlFlag
29500 73 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  s, 0);.    if( p
29510 57 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20  WInfo==0 ) goto 
29520 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20  select_end;.    
29530 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
29540 4f 75 74 70 75 74 52 6f 77 43 6f 75 6e 74 28 70  OutputRowCount(p
29550 57 49 6e 66 6f 29 20 3c 20 70 2d 3e 6e 53 65 6c  WInfo) < p->nSel
29560 65 63 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ectRow ){.      
29570 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20  p->nSelectRow = 
29580 73 71 6c 69 74 65 33 57 68 65 72 65 4f 75 74 70  sqlite3WhereOutp
29590 75 74 52 6f 77 43 6f 75 6e 74 28 70 57 49 6e 66  utRowCount(pWInf
295a0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
295b0 28 20 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e  ( sDistinct.isTn
295c0 63 74 20 26 26 20 73 71 6c 69 74 65 33 57 68 65  ct && sqlite3Whe
295d0 72 65 49 73 44 69 73 74 69 6e 63 74 28 70 57 49  reIsDistinct(pWI
295e0 6e 66 6f 29 20 29 7b 0a 20 20 20 20 20 20 73 44  nfo) ){.      sD
295f0 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79 70  istinct.eTnctTyp
29600 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  e = sqlite3Where
29610 49 73 44 69 73 74 69 6e 63 74 28 70 57 49 6e 66  IsDistinct(pWInf
29620 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  o);.    }.    if
29630 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 73 71  ( pOrderBy && sq
29640 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72 64 65  lite3WhereIsOrde
29650 72 65 64 28 70 57 49 6e 66 6f 29 20 29 20 70 4f  red(pWInfo) ) pO
29660 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 20  rderBy = 0;..   
29670 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20 69   /* If sorting i
29680 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63 72  ndex that was cr
29690 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72  eated by a prior
296a0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
296b0 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  l .    ** instru
296c0 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20 6e  ction ended up n
296d0 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64 2c  ot being needed,
296e0 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68 65   then change the
296f0 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
29700 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61 6e  l.    ** into an
29710 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a 2f   OP_Noop..    */
29720 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f 72  .    if( addrSor
29730 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f 72  tIndex>=0 && pOr
29740 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20 20  derBy==0 ){.    
29750 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
29760 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64 64  ngeToNoop(v, add
29770 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20 20  rSortIndex);.   
29780 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45 70     p->addrOpenEp
29790 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  hm[2] = -1;.    
297a0 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  }..    /* Use th
297b0 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65 72  e standard inner
297c0 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73 65   loop. */.    se
297d0 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50  lectInnerLoop(pP
297e0 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74 2c  arse, p, pEList,
297f0 20 2d 31 2c 20 70 4f 72 64 65 72 42 79 2c 20 26   -1, pOrderBy, &
29800 73 44 69 73 74 69 6e 63 74 2c 20 70 44 65 73 74  sDistinct, pDest
29810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29820 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
29830 72 65 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28  reContinueLabel(
29840 70 57 49 6e 66 6f 29 2c 0a 20 20 20 20 20 20 20  pWInfo),.       
29850 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
29860 69 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61  ite3WhereBreakLa
29870 62 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 0a 20  bel(pWInfo));.. 
29880 20 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61     /* End the da
29890 74 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70  tabase scan loop
298a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
298b0 69 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49  ite3WhereEnd(pWI
298c0 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
298d0 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20     /* This case 
298e0 77 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74  when there exist
298f0 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
29900 69 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20  ions or a GROUP 
29910 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  BY clause.    **
29920 20 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20   or both */.    
29930 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
29940 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
29950 65 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ext for processi
29960 6e 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66  ng aggregate inf
29970 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
29980 69 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20  int iAMem;      
29990 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
299a0 20 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f   address for sto
299b0 72 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f  ring current GRO
299c0 55 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74  UP BY */.    int
299d0 20 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20   iBMem;         
299e0 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64   /* First Mem ad
299f0 64 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f  dress for previo
29a00 75 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20  us GROUP BY */. 
29a10 20 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b     int iUseFlag;
29a20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64         /* Mem ad
29a30 64 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c  dress holding fl
29a40 61 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  ag indicating th
29a50 61 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20  at at least.    
29a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a70 20 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f      ** one row o
29a80 66 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74  f the input to t
29a90 68 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61  he aggregator ha
29aa0 73 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20  s been.         
29ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
29ac0 2a 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  * processed */. 
29ad0 20 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61     int iAbortFla
29ae0 67 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64  g;     /* Mem ad
29af0 64 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73  dress which caus
29b00 65 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69  es query abort i
29b10 66 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20  f positive */.  
29b20 20 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72    int groupBySor
29b30 74 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f  t;    /* Rows co
29b40 6d 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69  me from source i
29b50 6e 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72  n GROUP BY order
29b60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72   */.    int addr
29b70 45 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45  End;        /* E
29b80 6e 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  nd of processing
29b90 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54   for this SELECT
29ba0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74   */.    int sort
29bb0 50 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50  PTab = 0;   /* P
29bc0 73 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20  seudotable used 
29bd0 74 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e  to decode sortin
29be0 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20  g results */.   
29bf0 20 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30   int sortOut = 0
29c00 3b 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72  ;    /* Output r
29c10 65 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65  egister from the
29c20 20 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20 20 20   sorter */..    
29c30 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e  /* Remove any an
29c40 64 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65  d all aliases be
29c50 74 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74  tween the result
29c60 20 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20   set and the.   
29c70 20 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61   ** GROUP BY cla
29c80 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
29c90 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
29ca0 20 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20        int k;    
29cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cc0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
29cd0 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72  ter */.      str
29ce0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
29cf0 6d 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f  m *pItem;  /* Fo
29d00 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
29d10 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c  xpression in a l
29d20 69 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f  ist */..      fo
29d30 72 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  r(k=p->pEList->n
29d40 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70  Expr, pItem=p->p
29d50 45 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b  EList->a; k>0; k
29d60 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  --, pItem++){.  
29d70 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
29d80 2e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20  .iAlias = 0;.   
29d90 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6b     }.      for(k
29da0 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  =pGroupBy->nExpr
29db0 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
29dc0 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d 2d 2c 20 70  ->a; k>0; k--, p
29dd0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
29de0 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 41 6c 69   pItem->u.x.iAli
29df0 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
29e00 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65        if( p->nSe
29e10 6c 65 63 74 52 6f 77 3e 31 30 30 20 29 20 70 2d  lectRow>100 ) p-
29e20 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 31 30  >nSelectRow = 10
29e30 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
29e40 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f      p->nSelectRo
29e50 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a  w = 1;.    }.. .
29e60 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
29e70 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f  label to jump to
29e80 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
29e90 20 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79   abort the query
29ea0 20 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20   */.    addrEnd 
29eb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
29ec0 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
29ed0 2f 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f  /* Convert TK_CO
29ee0 4c 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20  LUMN nodes into 
29ef0 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e  TK_AGG_COLUMN an
29f00 64 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69  d make entries i
29f10 6e 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66  n.    ** sAggInf
29f20 6f 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47  o for all TK_AGG
29f30 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20  _FUNCTION nodes 
29f40 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  in expressions o
29f50 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c  f the.    ** SEL
29f60 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20  ECT statement.. 
29f70 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74     */.    memset
29f80 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
29f90 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e  (sNC));.    sNC.
29fa0 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
29fb0 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
29fc0 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
29fd0 20 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d    sNC.pAggInfo =
29fe0 20 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20   &sAggInfo;.    
29ff0 73 41 67 67 49 6e 66 6f 2e 6d 6e 52 65 67 20 3d  sAggInfo.mnReg =
2a000 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b   pParse->nMem+1;
2a010 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 6e 53  .    sAggInfo.nS
2a020 6f 72 74 69 6e 67 43 6f 6c 75 6d 6e 20 3d 20 70  ortingColumn = p
2a030 47 72 6f 75 70 42 79 20 3f 20 70 47 72 6f 75 70  GroupBy ? pGroup
2a040 42 79 2d 3e 6e 45 78 70 72 2b 31 20 3a 20 30 3b  By->nExpr+1 : 0;
2a050 0a 20 20 20 20 73 41 67 67 49 6e 66 6f 2e 70 47  .    sAggInfo.pG
2a060 72 6f 75 70 42 79 20 3d 20 70 47 72 6f 75 70 42  roupBy = pGroupB
2a070 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  y;.    sqlite3Ex
2a080 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74  prAnalyzeAggList
2a090 28 26 73 4e 43 2c 20 70 45 4c 69 73 74 29 3b 0a  (&sNC, pEList);.
2a0a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
2a0b0 6e 61 6c 79 7a 65 41 67 67 4c 69 73 74 28 26 73  nalyzeAggList(&s
2a0c0 4e 43 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20  NC, pOrderBy);. 
2a0d0 20 20 20 69 66 28 20 70 48 61 76 69 6e 67 20 29     if( pHaving )
2a0e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2a0f0 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
2a100 61 74 65 73 28 26 73 4e 43 2c 20 70 48 61 76 69  ates(&sNC, pHavi
2a110 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ng);.    }.    s
2a120 41 67 67 49 6e 66 6f 2e 6e 41 63 63 75 6d 75 6c  AggInfo.nAccumul
2a130 61 74 6f 72 20 3d 20 73 41 67 67 49 6e 66 6f 2e  ator = sAggInfo.
2a140 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 66 6f 72  nColumn;.    for
2a150 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e 66 6f  (i=0; i<sAggInfo
2a160 2e 6e 46 75 6e 63 3b 20 69 2b 2b 29 7b 0a 20 20  .nFunc; i++){.  
2a170 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
2a180 72 48 61 73 50 72 6f 70 65 72 74 79 28 73 41 67  rHasProperty(sAg
2a190 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70  gInfo.aFunc[i].p
2a1a0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
2a1b0 63 74 29 20 29 3b 0a 20 20 20 20 20 20 73 4e 43  ct) );.      sNC
2a1c0 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 49  .ncFlags |= NC_I
2a1d0 6e 41 67 67 46 75 6e 63 3b 0a 20 20 20 20 20 20  nAggFunc;.      
2a1e0 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
2a1f0 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20  zeAggList(&sNC, 
2a200 73 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 5b 69  sAggInfo.aFunc[i
2a210 5d 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ].pExpr->x.pList
2a220 29 3b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46  );.      sNC.ncF
2a230 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 49 6e 41 67  lags &= ~NC_InAg
2a240 67 46 75 6e 63 3b 0a 20 20 20 20 7d 0a 20 20 20  gFunc;.    }.   
2a250 20 73 41 67 67 49 6e 66 6f 2e 6d 78 52 65 67 20   sAggInfo.mxReg 
2a260 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
2a270 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
2a280 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
2a290 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 0a 20 20 20  select_end;..   
2a2a0 20 2f 2a 20 50 72 6f 63 65 73 73 69 6e 67 20 66   /* Processing f
2a2b0 6f 72 20 61 67 67 72 65 67 61 74 65 73 20 77 69  or aggregates wi
2a2c0 74 68 20 47 52 4f 55 50 20 42 59 20 69 73 20 76  th GROUP BY is v
2a2d0 65 72 79 20 64 69 66 66 65 72 65 6e 74 20 61 6e  ery different an
2a2e0 64 0a 20 20 20 20 2a 2a 20 6d 75 63 68 20 6d 6f  d.    ** much mo
2a2f0 72 65 20 63 6f 6d 70 6c 65 78 20 74 68 61 6e 20  re complex than 
2a300 61 67 67 72 65 67 61 74 65 73 20 77 69 74 68 6f  aggregates witho
2a310 75 74 20 61 20 47 52 4f 55 50 20 42 59 2e 0a 20  ut a GROUP BY.. 
2a320 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
2a330 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
2a340 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
2a350 6f 3b 20 20 2f 2a 20 4b 65 79 69 6e 67 20 69 6e  o;  /* Keying in
2a360 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
2a370 65 20 67 72 6f 75 70 20 62 79 20 63 6c 61 75 73  e group by claus
2a380 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a  e */.      int j
2a390 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1;             /
2a3a0 2a 20 41 2d 76 73 2d 42 20 63 6f 6d 70 61 72 69  * A-vs-B compari
2a3b0 73 69 6f 6e 20 6a 75 6d 70 20 2a 2f 0a 20 20 20  sion jump */.   
2a3c0 20 20 20 69 6e 74 20 61 64 64 72 4f 75 74 70 75     int addrOutpu
2a3d0 74 52 6f 77 3b 20 20 2f 2a 20 53 74 61 72 74 20  tRow;  /* Start 
2a3e0 6f 66 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  of subroutine th
2a3f0 61 74 20 6f 75 74 70 75 74 73 20 61 20 72 65 73  at outputs a res
2a400 75 6c 74 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ult row */.     
2a410 20 69 6e 74 20 72 65 67 4f 75 74 70 75 74 52 6f   int regOutputRo
2a420 77 3b 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61  w;   /* Return a
2a430 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
2a440 66 6f 72 20 6f 75 74 70 75 74 20 73 75 62 72 6f  for output subro
2a450 75 74 69 6e 65 20 2a 2f 0a 20 20 20 20 20 20 69  utine */.      i
2a460 6e 74 20 61 64 64 72 53 65 74 41 62 6f 72 74 3b  nt addrSetAbort;
2a470 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 62     /* Set the ab
2a480 6f 72 74 20 66 6c 61 67 20 61 6e 64 20 72 65 74  ort flag and ret
2a490 75 72 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  urn */.      int
2a4a0 20 61 64 64 72 54 6f 70 4f 66 4c 6f 6f 70 3b 20   addrTopOfLoop; 
2a4b0 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
2a4c0 6e 70 75 74 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20  nput loop */.   
2a4d0 20 20 20 69 6e 74 20 61 64 64 72 53 6f 72 74 69     int addrSorti
2a4e0 6e 67 49 64 78 3b 20 2f 2a 20 54 68 65 20 4f 50  ngIdx; /* The OP
2a4f0 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 66  _OpenEphemeral f
2a500 6f 72 20 74 68 65 20 73 6f 72 74 69 6e 67 20 69  or the sorting i
2a510 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
2a520 74 20 61 64 64 72 52 65 73 65 74 3b 20 20 20 20  t addrReset;    
2a530 20 20 2f 2a 20 53 75 62 72 6f 75 74 69 6e 65 20    /* Subroutine 
2a540 66 6f 72 20 72 65 73 65 74 74 69 6e 67 20 74 68  for resetting th
2a550 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 2a 2f  e accumulator */
2a560 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65  .      int regRe
2a570 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  set;       /* Re
2a580 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65 67  turn address reg
2a590 69 73 74 65 72 20 66 6f 72 20 72 65 73 65 74 20  ister for reset 
2a5a0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 0a 20  subroutine */.. 
2a5b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
2a5c0 20 69 73 20 61 20 47 52 4f 55 50 20 42 59 20 63   is a GROUP BY c
2a5d0 6c 61 75 73 65 20 77 65 20 6d 69 67 68 74 20 6e  lause we might n
2a5e0 65 65 64 20 61 20 73 6f 72 74 69 6e 67 20 69 6e  eed a sorting in
2a5f0 64 65 78 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  dex to.      ** 
2a600 69 6d 70 6c 65 6d 65 6e 74 20 69 74 2e 20 20 41  implement it.  A
2a610 6c 6c 6f 63 61 74 65 20 74 68 61 74 20 73 6f 72  llocate that sor
2a620 74 69 6e 67 20 69 6e 64 65 78 20 6e 6f 77 2e 20  ting index now. 
2a630 20 49 66 20 69 74 20 74 75 72 6e 73 20 6f 75 74   If it turns out
2a640 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77  .      ** that w
2a650 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 69 74  e do not need it
2a660 20 61 66 74 65 72 20 61 6c 6c 2c 20 74 68 65 20   after all, the 
2a670 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 20 69 6e  OP_SorterOpen in
2a680 73 74 72 75 63 74 69 6f 6e 0a 20 20 20 20 20 20  struction.      
2a690 2a 2a 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65  ** will be conve
2a6a0 72 74 65 64 20 69 6e 74 6f 20 61 20 4e 6f 6f 70  rted into a Noop
2a6b0 2e 20 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  .  .      */.   
2a6c0 20 20 20 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74     sAggInfo.sort
2a6d0 69 6e 67 49 64 78 20 3d 20 70 50 61 72 73 65 2d  ingIdx = pParse-
2a6e0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >nTab++;.      p
2a6f0 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e 66  KeyInfo = keyInf
2a700 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  oFromExprList(pP
2a710 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c 20  arse, pGroupBy, 
2a720 30 29 3b 0a 20 20 20 20 20 20 61 64 64 72 53 6f  0);.      addrSo
2a730 72 74 69 6e 67 49 64 78 20 3d 20 73 71 6c 69 74  rtingIdx = sqlit
2a740 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2a750 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 0a  OP_SorterOpen, .
2a760 20 20 20 20 20 20 20 20 20 20 73 41 67 67 49 6e            sAggIn
2a770 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
2a780 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
2a790 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20 20 20 20 20  Column, .       
2a7a0 20 20 20 30 2c 20 28 63 68 61 72 2a 29 70 4b 65     0, (char*)pKe
2a7b0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2a7c0 4f 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e  O);..      /* In
2a7d0 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20  itialize memory 
2a7e0 6c 6f 63 61 74 69 6f 6e 73 20 75 73 65 64 20 62  locations used b
2a7f0 79 20 47 52 4f 55 50 20 42 59 20 61 67 67 72 65  y GROUP BY aggre
2a800 67 61 74 65 20 70 72 6f 63 65 73 73 69 6e 67 0a  gate processing.
2a810 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
2a820 55 73 65 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72  UseFlag = ++pPar
2a830 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
2a840 69 41 62 6f 72 74 46 6c 61 67 20 3d 20 2b 2b 70  iAbortFlag = ++p
2a850 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
2a860 20 20 20 72 65 67 4f 75 74 70 75 74 52 6f 77 20     regOutputRow 
2a870 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2a880 3b 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70  ;.      addrOutp
2a890 75 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56  utRow = sqlite3V
2a8a0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
2a8b0 0a 20 20 20 20 20 20 72 65 67 52 65 73 65 74 20  .      regReset 
2a8c0 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
2a8d0 3b 0a 20 20 20 20 20 20 61 64 64 72 52 65 73 65  ;.      addrRese
2a8e0 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
2a8f0 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
2a900 20 20 20 69 41 4d 65 6d 20 3d 20 70 50 61 72 73     iAMem = pPars
2a910 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 20  e->nMem + 1;.   
2a920 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
2a930 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  += pGroupBy->nEx
2a940 70 72 3b 0a 20 20 20 20 20 20 69 42 4d 65 6d 20  pr;.      iBMem 
2a950 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
2a960 20 31 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65   1;.      pParse
2a970 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 47 72 6f 75 70  ->nMem += pGroup
2a980 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
2a990 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2a9a0 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
2a9b0 2c 20 30 2c 20 69 41 62 6f 72 74 46 6c 61 67 29  , 0, iAbortFlag)
2a9c0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2a9d0 65 6e 74 28 28 76 2c 20 22 63 6c 65 61 72 20 61  ent((v, "clear a
2a9e0 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20 20  bort flag"));.  
2a9f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2aa00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
2aa10 67 65 72 2c 20 30 2c 20 69 55 73 65 46 6c 61 67  ger, 0, iUseFlag
2aa20 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2aa30 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64 69 63 61  ment((v, "indica
2aa40 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 65  te accumulator e
2aa50 6d 70 74 79 22 29 29 3b 0a 20 20 20 20 20 20 73  mpty"));.      s
2aa60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2aa70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
2aa80 69 41 4d 65 6d 2c 20 69 41 4d 65 6d 2b 70 47 72  iAMem, iAMem+pGr
2aa90 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2d 31 29 3b  oupBy->nExpr-1);
2aaa0 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  ..      /* Begin
2aab0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
2aac0 6c 20 65 78 74 72 61 63 74 20 61 6c 6c 20 73 6f  l extract all so
2aad0 75 72 63 65 20 72 6f 77 73 20 69 6e 20 47 52 4f  urce rows in GRO
2aae0 55 50 20 42 59 20 6f 72 64 65 72 2e 0a 20 20 20  UP BY order..   
2aaf0 20 20 20 2a 2a 20 54 68 69 73 20 6d 69 67 68 74     ** This might
2ab00 20 69 6e 76 6f 6c 76 65 20 74 77 6f 20 73 65 70   involve two sep
2ab10 61 72 61 74 65 20 6c 6f 6f 70 73 20 77 69 74 68  arate loops with
2ab20 20 61 6e 20 4f 50 5f 53 6f 72 74 20 69 6e 20 62   an OP_Sort in b
2ab30 65 74 77 65 65 6e 2c 20 6f 72 0a 20 20 20 20 20  etween, or.     
2ab40 20 2a 2a 20 69 74 20 6d 69 67 68 74 20 62 65 20   ** it might be 
2ab50 61 20 73 69 6e 67 6c 65 20 6c 6f 6f 70 20 74 68  a single loop th
2ab60 61 74 20 75 73 65 73 20 61 6e 20 69 6e 64 65 78  at uses an index
2ab70 20 74 6f 20 65 78 74 72 61 63 74 20 69 6e 66 6f   to extract info
2ab80 72 6d 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  rmation.      **
2ab90 20 69 6e 20 74 68 65 20 72 69 67 68 74 20 6f 72   in the right or
2aba0 64 65 72 20 74 6f 20 62 65 67 69 6e 20 77 69 74  der to begin wit
2abb0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
2abc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2abd0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
2abe0 20 72 65 67 52 65 73 65 74 2c 20 61 64 64 72 52   regReset, addrR
2abf0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 70 57 49  eset);.      pWI
2ac00 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
2ac10 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
2ac20 70 54 61 62 4c 69 73 74 2c 20 70 57 68 65 72 65  pTabList, pWhere
2ac30 2c 20 70 47 72 6f 75 70 42 79 2c 20 30 2c 20 0a  , pGroupBy, 0, .
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac60 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 2c 20   WHERE_GROUPBY, 
2ac70 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57  0);.      if( pW
2ac80 49 6e 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73  Info==0 ) goto s
2ac90 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
2aca0 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2acb0 65 49 73 4f 72 64 65 72 65 64 28 70 57 49 6e 66  eIsOrdered(pWInf
2acc0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  o) ){.        /*
2acd0 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
2ace0 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
2acf0 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
2ad00 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
2ad10 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
2ad20 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
2ad30 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
2ad40 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
2ad50 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
2ad60 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
2ad70 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
2ad80 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
2ad90 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
2ada0 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
2adb0 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
2adc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2add0 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
2ade0 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
2adf0 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
2ae00 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
2ae10 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
2ae20 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
2ae30 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
2ae40 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
2ae50 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
2ae60 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
2ae70 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
2ae80 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
2ae90 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
2aea0 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
2aeb0 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
2aec0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
2aed0 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
2aee0 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
2aef0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
2af00 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
2af10 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  pBy;..        ex
2af20 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
2af30 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
2af40 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69      (sDistinct.i
2af50 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c  sTnct && (p->sel
2af60 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
2af70 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  t)==0) ?.       
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49               "DI
2af90 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50  STINCT" : "GROUP
2afa0 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20   BY");..        
2afb0 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
2afc0 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
2afd0 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
2afe0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
2aff0 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31  l = nGroupBy + 1
2b000 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
2b010 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
2b020 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
2b030 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
2b040 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2b050 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
2b060 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
2b070 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
2b080 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
2b090 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
2b0a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b0b0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
2b0c0 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
2b0d0 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2b0e0 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
2b0f0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
2b100 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
2b110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
2b120 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
2b130 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
2b140 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20   regBase, 0);.  
2b150 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b160 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
2b170 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f  quence, sAggInfo
2b180 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42  .sortingIdx,regB
2b190 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20  ase+nGroupBy);. 
2b1a0 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
2b1b0 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
2b1c0 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
2b1d0 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
2b1e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
2b1f0 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
2b200 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
2b210 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
2b220 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
2b230 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
2b240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2b250 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61  t r1 = j + regBa
2b260 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
2b270 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20  int r2;..       
2b280 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
2b290 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
2b2a0 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  mn(pParse, .    
2b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2c0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
2b2d0 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f  >pTab, pCol->iCo
2b2e0 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
2b2f0 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  le, r1, 0);.    
2b300 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d          if( r1!=
2b310 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r2 ){.          
2b320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b330 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
2b340 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20  y, r2, r1);.    
2b350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b360 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
2b370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2b380 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
2b390 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
2b3a0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
2b3b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b3c0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
2b3d0 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
2b3e0 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
2b3f0 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
2b400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2b410 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
2b420 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
2b430 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
2b440 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
2b450 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
2b460 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
2b470 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
2b480 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
2b490 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
2b4a0 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
2b4b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
2b4c0 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
2b4d0 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
2b4e0 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  o.sortingIdxPTab
2b4f0 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50   = sortPTab = pP
2b500 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2b510 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20        sortOut = 
2b520 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
2b530 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
2b540 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2b550 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
2b560 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c  seudo, sortPTab,
2b570 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b   sortOut, nCol);
2b580 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2b590 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
2b5a0 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67  _SorterSort, sAg
2b5b0 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
2b5c0 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
2b5d0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2b5e0 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
2b5f0 72 74 22 29 29 3b 20 56 64 62 65 43 6f 76 65 72  rt")); VdbeCover
2b600 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
2b610 73 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74  sAggInfo.useSort
2b620 69 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20  ingIdx = 1;.    
2b630 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2b640 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2b650 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2b660 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
2b670 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20  e current GROUP 
2b680 42 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f  BY terms and sto
2b690 72 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32  re in b0, b1, b2
2b6a0 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30  ....      ** (b0
2b6b0 20 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74   is memory locat
2b6c0 69 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20  ion iBMem+0, b1 
2b6d0 69 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20  is iBMem+1, and 
2b6e0 73 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20  so forth).      
2b6f0 2a 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20  ** Then compare 
2b700 74 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55  the current GROU
2b710 50 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e  P BY terms again
2b720 73 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  st the GROUP BY 
2b730 74 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66  terms.      ** f
2b740 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
2b750 20 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73   row currently s
2b760 74 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c  tored in a0, a1,
2b770 20 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   a2....      */.
2b780 20 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c        addrTopOfL
2b790 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oop = sqlite3Vdb
2b7a0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2b7b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
2b7c0 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
2b7d0 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  rse);.      if( 
2b7e0 67 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20  groupBySort ){. 
2b7f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2b800 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
2b810 6f 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49  orterData, sAggI
2b820 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20  nfo.sortingIdx, 
2b830 73 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20  sortOut);.      
2b840 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  }.      for(j=0;
2b850 20 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   j<pGroupBy->nEx
2b860 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; j++){.      
2b870 20 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72    if( groupBySor
2b880 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
2b890 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2b8a0 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73  (v, OP_Column, s
2b8b0 6f 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65  ortPTab, j, iBMe
2b8c0 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  m+j);.          
2b8d0 69 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74  if( j==0 ) sqlit
2b8e0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
2b8f0 2c 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41  , OPFLAG_CLEARCA
2b900 43 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  CHE);.        }e
2b910 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
2b920 41 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f  AggInfo.directMo
2b930 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  de = 1;.        
2b940 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
2b950 65 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70  e(pParse, pGroup
2b960 42 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  By->a[j].pExpr, 
2b970 69 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20  iBMem+j);.      
2b980 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2b990 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2b9a0 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72  Op4(v, OP_Compar
2b9b0 65 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c  e, iAMem, iBMem,
2b9c0 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72   pGroupBy->nExpr
2b9d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b9e0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2b9f0 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
2ba00 6f 52 65 66 28 70 4b 65 79 49 6e 66 6f 29 2c 20  oRef(pKeyInfo), 
2ba10 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20  P4_KEYINFO);.   
2ba20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
2ba30 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
2ba40 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2ba50 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
2ba60 5f 4a 75 6d 70 2c 20 6a 31 2b 31 2c 20 30 2c 20  _Jump, j1+1, 0, 
2ba70 6a 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72  j1+1); VdbeCover
2ba80 61 67 65 28 76 29 3b 0a 0a 20 20 20 20 20 20 2f  age(v);..      /
2ba90 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
2baa0 74 68 61 74 20 72 75 6e 73 20 77 68 65 6e 65 76  that runs whenev
2bab0 65 72 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  er the GROUP BY 
2bac0 63 68 61 6e 67 65 73 2e 0a 20 20 20 20 20 20 2a  changes..      *
2bad0 2a 20 43 68 61 6e 67 65 73 20 69 6e 20 74 68 65  * Changes in the
2bae0 20 47 52 4f 55 50 20 42 59 20 61 72 65 20 64 65   GROUP BY are de
2baf0 74 65 63 74 65 64 20 62 79 20 74 68 65 20 70 72  tected by the pr
2bb00 65 76 69 6f 75 73 20 63 6f 64 65 0a 20 20 20 20  evious code.    
2bb10 20 20 2a 2a 20 62 6c 6f 63 6b 2e 20 20 49 66 20    ** block.  If 
2bb20 74 68 65 72 65 20 77 65 72 65 20 6e 6f 20 63 68  there were no ch
2bb30 61 6e 67 65 73 2c 20 74 68 69 73 20 62 6c 6f 63  anges, this bloc
2bb40 6b 20 69 73 20 73 6b 69 70 70 65 64 2e 0a 20 20  k is skipped..  
2bb50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2bb60 54 68 69 73 20 63 6f 64 65 20 63 6f 70 69 65 73  This code copies
2bb70 20 63 75 72 72 65 6e 74 20 67 72 6f 75 70 20 62   current group b
2bb80 79 20 74 65 72 6d 73 20 69 6e 20 62 30 2c 62 31  y terms in b0,b1
2bb90 2c 62 32 2c 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a  ,b2,....      **
2bba0 20 6f 76 65 72 20 74 6f 20 61 30 2c 61 31 2c 61   over to a0,a1,a
2bbb0 32 2e 20 20 49 74 20 74 68 65 6e 20 63 61 6c 6c  2.  It then call
2bbc0 73 20 74 68 65 20 6f 75 74 70 75 74 20 73 75 62  s the output sub
2bbd0 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a  routine.      **
2bbe0 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
2bbf0 61 67 67 72 65 67 61 74 65 20 61 63 63 75 6d 75  aggregate accumu
2bc00 6c 61 74 6f 72 20 72 65 67 69 73 74 65 72 73 20  lator registers 
2bc10 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 0a 20  in preparation. 
2bc20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
2bc30 6e 65 78 74 20 47 52 4f 55 50 20 42 59 20 62 61  next GROUP BY ba
2bc40 74 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tch..      */.  
2bc50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
2bc60 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20  odeMove(pParse, 
2bc70 69 42 4d 65 6d 2c 20 69 41 4d 65 6d 2c 20 70 47  iBMem, iAMem, pG
2bc80 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 29 3b 0a  roupBy->nExpr);.
2bc90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2bca0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2bcb0 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
2bcc0 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
2bcd0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2bce0 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
2bcf0 20 6f 6e 65 20 72 6f 77 22 29 29 3b 0a 20 20 20   one row"));.   
2bd00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2bd10 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp2(v, OP_IfPos
2bd20 2c 20 69 41 62 6f 72 74 46 6c 61 67 2c 20 61 64  , iAbortFlag, ad
2bd30 64 72 45 6e 64 29 3b 20 56 64 62 65 43 6f 76 65  drEnd); VdbeCove
2bd40 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 56  rage(v);.      V
2bd50 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
2bd60 63 68 65 63 6b 20 61 62 6f 72 74 20 66 6c 61 67  check abort flag
2bd70 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
2bd80 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2bd90 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 73  OP_Gosub, regRes
2bda0 65 74 2c 20 61 64 64 72 52 65 73 65 74 29 3b 0a  et, addrReset);.
2bdb0 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2bdc0 74 28 28 76 2c 20 22 72 65 73 65 74 20 61 63 63  t((v, "reset acc
2bdd0 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20 20  umulator"));..  
2bde0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
2bdf0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
2be00 6d 75 6c 61 74 6f 72 73 20 62 61 73 65 64 20 6f  mulators based o
2be10 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
2be20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 75  .      ** the cu
2be30 72 72 65 6e 74 20 72 6f 77 0a 20 20 20 20 20 20  rrent row.      
2be40 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2be50 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2be60 6a 31 29 3b 0a 20 20 20 20 20 20 75 70 64 61 74  j1);.      updat
2be70 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
2be80 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2be90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2bea0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2beb0 6e 74 65 67 65 72 2c 20 31 2c 20 69 55 73 65 46  nteger, 1, iUseF
2bec0 6c 61 67 29 3b 0a 20 20 20 20 20 20 56 64 62 65  lag);.      Vdbe
2bed0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69 6e 64  Comment((v, "ind
2bee0 69 63 61 74 65 20 64 61 74 61 20 69 6e 20 61 63  icate data in ac
2bef0 63 75 6d 75 6c 61 74 6f 72 22 29 29 3b 0a 0a 20  cumulator"));.. 
2bf00 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74       /* End of t
2bf10 68 65 20 6c 6f 6f 70 0a 20 20 20 20 20 20 2a 2f  he loop.      */
2bf20 0a 20 20 20 20 20 20 69 66 28 20 67 72 6f 75 70  .      if( group
2bf30 42 79 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  BySort ){.      
2bf40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2bf50 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
2bf60 4e 65 78 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73  Next, sAggInfo.s
2bf70 6f 72 74 69 6e 67 49 64 78 2c 20 61 64 64 72 54  ortingIdx, addrT
2bf80 6f 70 4f 66 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  opOfLoop);.     
2bf90 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
2bfa0 76 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  v);.      }else{
2bfb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2bfc0 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29  WhereEnd(pWInfo)
2bfd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2bfe0 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f  3VdbeChangeToNoo
2bff0 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e 67  p(v, addrSorting
2c000 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Idx);.      }.. 
2c010 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 74       /* Output t
2c020 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66 20  he final row of 
2c030 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f 0a  result.      */.
2c040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c050 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
2c060 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  sub, regOutputRo
2c070 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77  w, addrOutputRow
2c080 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2c090 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75 74  ment((v, "output
2c0a0 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a 0a   final row"));..
2c0b0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 76        /* Jump ov
2c0c0 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  er the subroutin
2c0d0 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  es.      */.    
2c0e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2c0f0 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
2c100 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20 20  0, addrEnd);..  
2c110 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
2c120 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
2c130 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e 67  t outputs a sing
2c140 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  le row of the re
2c150 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  sult.      ** se
2c160 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75 74  t.  This subrout
2c170 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73 20  ine first looks 
2c180 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67 2e  at the iUseFlag.
2c190 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20 20    If iUseFlag.  
2c1a0 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20 74      ** is less t
2c1b0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
2c1c0 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f 75  zero, the subrou
2c1d0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
2c1e0 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74 68    If.      ** th
2c1f0 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61 6c  e processing cal
2c200 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  ls for the query
2c210 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73 20   to abort, this 
2c220 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20 20  subroutine.     
2c230 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20 74   ** increments t
2c240 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d 65  he iAbortFlag me
2c250 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62 65  mory location be
2c260 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
2c270 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
2c280 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20 63   to signal the c
2c290 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e 0a  aller to abort..
2c2a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
2c2b0 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73 71  ddrSetAbort = sq
2c2c0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2c2d0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
2c2e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
2c2f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
2c300 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a  1, iAbortFlag);.
2c310 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2c320 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72 74  t((v, "set abort
2c330 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
2c340 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2c350 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20  1(v, OP_Return, 
2c360 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20  regOutputRow);. 
2c370 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c380 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
2c390 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a  addrOutputRow);.
2c3a0 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75 74        addrOutput
2c3b0 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Row = sqlite3Vdb
2c3c0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
2c3d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2c3e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
2c3f0 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c 20  fPos, iUseFlag, 
2c400 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32 29  addrOutputRow+2)
2c410 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
2c420 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
2c430 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62  ment((v, "Groupb
2c440 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
2c450 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29  or entry point")
2c460 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c470 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2c480 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
2c490 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69  utRow);.      fi
2c4a0 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
2c4b0 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
2c4c0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
2c4d0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
2c4e0 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
2c4f0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
2c500 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
2c510 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
2c520 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
2c530 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
2c540 2c 20 2d 31 2c 20 70 4f 72 64 65 72 42 79 2c 0a  , -1, pOrderBy,.
2c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c560 20 20 20 20 20 20 26 73 44 69 73 74 69 6e 63 74        &sDistinct
2c570 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20 20 20  , pDest,.       
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2c590 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31 2c 20  ddrOutputRow+1, 
2c5a0 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b 0a 20  addrSetAbort);. 
2c5b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2c5c0 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 74  AddOp1(v, OP_Ret
2c5d0 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74 52 6f  urn, regOutputRo
2c5e0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
2c5f0 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64 20 67  mment((v, "end g
2c600 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20 67 65  roupby result ge
2c610 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20 20 20  nerator"));..   
2c620 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
2c630 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74   subroutine that
2c640 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68 65 20   will reset the 
2c650 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d 75 6c  group-by accumul
2c660 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ator.      */.  
2c670 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2c680 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61  esolveLabel(v, a
2c690 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20  ddrReset);.     
2c6a0 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61 74 6f   resetAccumulato
2c6b0 72 28 70 50 61 72 73 65 2c 20 26 73 41 67 67 49  r(pParse, &sAggI
2c6c0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nfo);.      sqli
2c6d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2c6e0 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67 52   OP_Return, regR
2c6f0 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20 20 20  eset);.     .   
2c700 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47 72 6f   } /* endif pGro
2c710 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61 67 67  upBy.  Begin agg
2c720 72 65 67 61 74 65 20 71 75 65 72 69 65 73 20 77  regate queries w
2c730 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42 59 3a  ithout GROUP BY:
2c740 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20   */.    else {. 
2c750 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
2c760 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  Del = 0;.#ifndef
2c770 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52   SQLITE_OMIT_BTR
2c780 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20 54 61  EECOUNT.      Ta
2c790 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 20  ble *pTab;.     
2c7a0 20 69 66 28 20 28 70 54 61 62 20 3d 20 69 73 53   if( (pTab = isS
2c7b0 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20 26 73  impleCount(p, &s
2c7c0 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29 7b 0a  AggInfo))!=0 ){.
2c7d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 73          /* If is
2c7e0 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20 72 65  SimpleCount() re
2c7f0 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
2c800 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72 75 63  to a Table struc
2c810 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  ture, then.     
2c820 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20 73 74     ** the SQL st
2c830 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20 74 68  atement is of th
2c840 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20 20 20  e form:.        
2c850 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2c860 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2c870 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20 20 20  FROM <tbl>.     
2c880 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2c890 20 77 68 65 72 65 20 74 68 65 20 54 61 62 6c 65   where the Table
2c8a0 20 73 74 72 75 63 74 75 72 65 20 72 65 74 75 72   structure retur
2c8b0 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73 20 74  ned represents t
2c8c0 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20 20 20  able <tbl>..    
2c8d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
2c8e0 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * This statement
2c8f0 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20 74 68   is so common th
2c900 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d 69 7a  at it is optimiz
2c910 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20 54 68  ed specially. Th
2c920 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 50 5f  e.        ** OP_
2c930 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  Count instructio
2c940 6e 20 69 73 20 65 78 65 63 75 74 65 64 20 65 69  n is executed ei
2c950 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e 74 6b  ther on the intk
2c960 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a 20 20  ey table that.  
2c970 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
2c980 73 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74  s the data for t
2c990 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20 6f 6e  able <tbl> or on
2c9a0 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e 64 65   one of its inde
2c9b0 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20 20 20  xes. It.        
2c9c0 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74 6f 20  ** is better to 
2c9d0 65 78 65 63 75 74 65 20 74 68 65 20 6f 70 20 6f  execute the op o
2c9e0 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73 20 69  n an index, as i
2c9f0 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d 6f 73  ndexes are almos
2ca00 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  t.        ** alw
2ca10 61 79 73 20 73 70 72 65 61 64 20 61 63 72 6f 73  ays spread acros
2ca20 73 20 6c 65 73 73 20 70 61 67 65 73 20 74 68 61  s less pages tha
2ca30 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73 70 6f  n their correspo
2ca40 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a 20 20  nding tables..  
2ca50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2ca60 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62 20 3d   const int iDb =
2ca70 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
2ca80 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
2ca90 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
2caa0 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
2cab0 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61 72 73  int iCsr = pPars
2cac0 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
2cad0 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e  * Cursor to scan
2cae0 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20 20 20   b-tree */.     
2caf0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb10 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
2cb20 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
2cb30 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20          KeyInfo 
2cb40 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 20 20  *pKeyInfo = 0;  
2cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb60 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63 61 6e  Keyinfo for scan
2cb70 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ned index */.   
2cb80 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73       Index *pBes
2cb90 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
2cba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73            /* Bes
2cbb0 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20 73 6f  t index found so
2cbc0 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20   far */.        
2cbd0 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54 61 62  int iRoot = pTab
2cbe0 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 20  ->tnum;         
2cbf0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
2cc00 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62 2d 74  e of scanned b-t
2cc10 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ree */..        
2cc20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
2cc30 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
2cc40 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  iDb);.        sq
2cc50 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
2cc60 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62  Parse, iDb, pTab
2cc70 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d  ->tnum, 0, pTab-
2cc80 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 20 20  >zName);..      
2cc90 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2cca0 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 68  the index that h
2ccb0 61 73 20 74 68 65 20 6c 6f 77 65 73 74 20 73 63  as the lowest sc
2ccc0 61 6e 20 63 6f 73 74 2e 0a 20 20 20 20 20 20 20  an cost..       
2ccd0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
2cce0 32 30 31 31 2d 30 34 2d 31 35 29 20 44 6f 20 6e  2011-04-15) Do n
2ccf0 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 73 63 61  ot do a full sca
2cd00 6e 20 6f 66 20 61 6e 20 75 6e 6f 72 64 65 72 65  n of an unordere
2cd10 64 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  d index..       
2cd20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 28   **.        ** (
2cd30 32 30 31 33 2d 31 30 2d 30 33 29 20 44 6f 20 6e  2013-10-03) Do n
2cd40 6f 74 20 63 6f 75 6e 74 20 74 68 65 20 65 6e 74  ot count the ent
2cd50 72 69 65 73 20 69 6e 20 61 20 70 61 72 74 69 61  ries in a partia
2cd60 6c 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  l index..       
2cd70 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49   **.        ** I
2cd80 6e 20 70 72 61 63 74 69 63 65 20 74 68 65 20 4b  n practice the K
2cd90 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
2cda0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73 65   will not be use
2cdb0 64 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 0a 20  d. It is only . 
2cdc0 20 20 20 20 20 20 20 2a 2a 20 70 61 73 73 65 64         ** passed
2cdd0 20 74 6f 20 6b 65 65 70 20 4f 50 5f 4f 70 65 6e   to keep OP_Open
2cde0 52 65 61 64 20 68 61 70 70 79 2e 0a 20 20 20 20  Read happy..    
2cdf0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2ce00 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61  f( !HasRowid(pTa
2ce10 62 29 20 29 20 70 42 65 73 74 20 3d 20 73 71 6c  b) ) pBest = sql
2ce20 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
2ce30 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20  dex(pTab);.     
2ce40 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
2ce50 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
2ce60 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
2ce70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2ce80 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65   pIdx->bUnordere
2ce90 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  d==0.           
2cea0 26 26 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  && pIdx->szIdxRo
2ceb0 77 3c 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  w<pTab->szTabRow
2cec0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70  .           && p
2ced0 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  Idx->pPartIdxWhe
2cee0 72 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  re==0.          
2cef0 20 26 26 20 28 21 70 42 65 73 74 20 7c 7c 20 70   && (!pBest || p
2cf00 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 42  Idx->szIdxRow<pB
2cf10 65 73 74 2d 3e 73 7a 49 64 78 52 6f 77 29 0a 20  est->szIdxRow). 
2cf20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
2cf30 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d 20          pBest = 
2cf40 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  pIdx;.          
2cf50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2cf60 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b      if( pBest ){
2cf70 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 6f 74  .          iRoot
2cf80 20 3d 20 70 42 65 73 74 2d 3e 74 6e 75 6d 3b 0a   = pBest->tnum;.
2cf90 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
2cfa0 66 6f 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  fo = sqlite3KeyI
2cfb0 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73  nfoOfIndex(pPars
2cfc0 65 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 20  e, pBest);.     
2cfd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
2cfe0 20 4f 70 65 6e 20 61 20 72 65 61 64 2d 6f 6e 6c   Open a read-onl
2cff0 79 20 63 75 72 73 6f 72 2c 20 65 78 65 63 75 74  y cursor, execut
2d000 65 20 74 68 65 20 4f 50 5f 43 6f 75 6e 74 2c 20  e the OP_Count, 
2d010 63 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72  close the cursor
2d020 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  . */.        sql
2d030 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
2d040 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  t(v, OP_OpenRead
2d050 2c 20 69 43 73 72 2c 20 69 52 6f 6f 74 2c 20 69  , iCsr, iRoot, i
2d060 44 62 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Db, 1);.        
2d070 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b 0a  if( pKeyInfo ){.
2d080 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d090 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
2d0a0 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b 65   -1, (char *)pKe
2d0b0 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46  yInfo, P4_KEYINF
2d0c0 4f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  O);.        }.  
2d0d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d0e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6f  eAddOp2(v, OP_Co
2d0f0 75 6e 74 2c 20 69 43 73 72 2c 20 73 41 67 67 49  unt, iCsr, sAggI
2d100 6e 66 6f 2e 61 46 75 6e 63 5b 30 5d 2e 69 4d 65  nfo.aFunc[0].iMe
2d110 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
2d120 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2d130 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 43 73 72 29   OP_Close, iCsr)
2d140 3b 0a 20 20 20 20 20 20 20 20 65 78 70 6c 61 69  ;.        explai
2d150 6e 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 50 61  nSimpleCount(pPa
2d160 72 73 65 2c 20 70 54 61 62 2c 20 70 42 65 73 74  rse, pTab, pBest
2d170 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
2d180 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2d190 4f 4d 49 54 5f 42 54 52 45 45 43 4f 55 4e 54 20  OMIT_BTREECOUNT 
2d1a0 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
2d1b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
2d1c0 68 65 20 71 75 65 72 79 20 69 73 20 6f 66 20 6f  he query is of o
2d1d0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
2d1e0 69 6e 67 20 66 6f 72 6d 73 3a 0a 20 20 20 20 20  ing forms:.     
2d1f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
2d200 20 20 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29     SELECT min(x)
2d210 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20   FROM ....      
2d220 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 6d 61    **   SELECT ma
2d230 78 28 78 29 20 46 52 4f 4d 20 2e 2e 2e 0a 20 20  x(x) FROM ....  
2d240 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2d250 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 74 68   ** If it is, th
2d260 65 6e 20 61 73 6b 20 74 68 65 20 63 6f 64 65 20  en ask the code 
2d270 69 6e 20 77 68 65 72 65 2e 63 20 74 6f 20 61 74  in where.c to at
2d280 74 65 6d 70 74 20 74 6f 20 73 6f 72 74 20 72 65  tempt to sort re
2d290 73 75 6c 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  sults.        **
2d2a0 20 61 73 20 69 66 20 74 68 65 72 65 20 77 61 73   as if there was
2d2b0 20 61 6e 20 22 4f 52 44 45 52 20 4f 4e 20 78 22   an "ORDER ON x"
2d2c0 20 6f 72 20 22 4f 52 44 45 52 20 4f 4e 20 78 20   or "ORDER ON x 
2d2d0 44 45 53 43 22 20 63 6c 61 75 73 65 2e 20 0a 20  DESC" clause. . 
2d2e0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 77 68 65         ** If whe
2d2f0 72 65 2e 63 20 69 73 20 61 62 6c 65 20 74 6f 20  re.c is able to 
2d300 70 72 6f 64 75 63 65 20 72 65 73 75 6c 74 73 20  produce results 
2d310 73 6f 72 74 65 64 20 69 6e 20 74 68 69 73 20 6f  sorted in this o
2d320 72 64 65 72 2c 20 74 68 65 6e 0a 20 20 20 20 20  rder, then.     
2d330 20 20 20 2a 2a 20 61 64 64 20 76 64 62 65 20 63     ** add vdbe c
2d340 6f 64 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ode to break out
2d350 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69   of the processi
2d360 6e 67 20 6c 6f 6f 70 20 61 66 74 65 72 20 74 68  ng loop after th
2d370 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  e .        ** fi
2d380 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 28 73  rst iteration (s
2d390 69 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 69  ince the first i
2d3a0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
2d3b0 6c 6f 6f 70 20 69 73 20 0a 20 20 20 20 20 20 20  loop is .       
2d3c0 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74   ** guaranteed t
2d3d0 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
2d3e0 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 6d 69   row with the mi
2d3f0 6e 69 6d 75 6d 20 6f 72 20 6d 61 78 69 6d 75 6d  nimum or maximum
2d400 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c   .        ** val
2d410 75 65 20 6f 66 20 78 2c 20 74 68 65 20 6f 6e 6c  ue of x, the onl
2d420 79 20 72 6f 77 20 72 65 71 75 69 72 65 64 29 2e  y row required).
2d430 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
2d440 20 20 20 20 2a 2a 20 41 20 73 70 65 63 69 61 6c      ** A special
2d450 20 66 6c 61 67 20 6d 75 73 74 20 62 65 20 70 61   flag must be pa
2d460 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57  ssed to sqlite3W
2d470 68 65 72 65 42 65 67 69 6e 28 29 20 74 6f 20 73  hereBegin() to s
2d480 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20 20 20  lightly.        
2d490 2a 2a 20 6d 6f 64 69 66 79 20 62 65 68 61 76 69  ** modify behavi
2d4a0 6f 72 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20  or as follows:. 
2d4b0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
2d4c0 20 20 2a 2a 20 20 20 2b 20 49 66 20 74 68 65 20    **   + If the 
2d4d0 71 75 65 72 79 20 69 73 20 61 20 22 53 45 4c 45  query is a "SELE
2d4e0 43 54 20 6d 69 6e 28 78 29 22 2c 20 74 68 65 6e  CT min(x)", then
2d4f0 20 74 68 65 20 6c 6f 6f 70 20 63 6f 64 65 64 20   the loop coded 
2d500 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  by.        **   
2d510 20 20 77 68 65 72 65 2e 63 20 73 68 6f 75 6c 64    where.c should
2d520 20 6e 6f 74 20 69 74 65 72 61 74 65 20 6f 76 65   not iterate ove
2d530 72 20 61 6e 79 20 76 61 6c 75 65 73 20 77 69 74  r any values wit
2d540 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 0a 20  h a NULL value. 
2d550 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 66 6f         **     fo
2d560 72 20 78 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  r x..        **.
2d570 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 54          **   + T
2d580 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 63 6f 64  he optimizer cod
2d590 65 20 69 6e 20 77 68 65 72 65 2e 63 20 28 74 68  e in where.c (th
2d5a0 65 20 74 68 69 6e 67 20 74 68 61 74 20 64 65 63  e thing that dec
2d5b0 69 64 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ides which.     
2d5c0 20 20 20 2a 2a 20 20 20 20 20 69 6e 64 65 78 20     **     index 
2d5d0 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20 75 73  or indices to us
2d5e0 65 29 20 73 68 6f 75 6c 64 20 70 6c 61 63 65 20  e) should place 
2d5f0 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 69 6f  a different prio
2d600 72 69 74 79 20 6f 6e 20 0a 20 20 20 20 20 20 20  rity on .       
2d610 20 2a 2a 20 20 20 20 20 73 61 74 69 73 66 79 69   **     satisfyi
2d620 6e 67 20 74 68 65 20 27 4f 52 44 45 52 20 42 59  ng the 'ORDER BY
2d630 27 20 63 6c 61 75 73 65 20 74 68 61 6e 20 69 74  ' clause than it
2d640 20 64 6f 65 73 20 69 6e 20 6f 74 68 65 72 20 63   does in other c
2d650 61 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ases..        **
2d660 20 20 20 20 20 52 65 66 65 72 20 74 6f 20 63 6f       Refer to co
2d670 64 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20  de and comments 
2d680 69 6e 20 77 68 65 72 65 2e 63 20 66 6f 72 20 64  in where.c for d
2d690 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 20 20 20  etails..        
2d6a0 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c  */.        ExprL
2d6b0 69 73 74 20 2a 70 4d 69 6e 4d 61 78 20 3d 20 30  ist *pMinMax = 0
2d6c0 3b 0a 20 20 20 20 20 20 20 20 75 38 20 66 6c 61  ;.        u8 fla
2d6d0 67 20 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42  g = WHERE_ORDERB
2d6e0 59 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  Y_NORMAL;.      
2d6f0 20 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72    .        asser
2d700 74 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 3d 3d  t( p->pGroupBy==
2d710 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
2d720 65 72 74 28 20 66 6c 61 67 3d 3d 30 20 29 3b 0a  ert( flag==0 );.
2d730 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
2d740 48 61 76 69 6e 67 3d 3d 30 20 29 7b 0a 20 20 20  Having==0 ){.   
2d750 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20 6d 69         flag = mi
2d760 6e 4d 61 78 51 75 65 72 79 28 26 73 41 67 67 49  nMaxQuery(&sAggI
2d770 6e 66 6f 2c 20 26 70 4d 69 6e 4d 61 78 29 3b 0a  nfo, &pMinMax);.
2d780 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d790 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 3d 3d    assert( flag==
2d7a0 30 20 7c 7c 20 28 70 4d 69 6e 4d 61 78 21 3d 30  0 || (pMinMax!=0
2d7b0 20 26 26 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78   && pMinMax->nEx
2d7c0 70 72 3d 3d 31 29 20 29 3b 0a 0a 20 20 20 20 20  pr==1) );..     
2d7d0 20 20 20 69 66 28 20 66 6c 61 67 20 29 7b 0a 20     if( flag ){. 
2d7e0 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d 61 78           pMinMax
2d7f0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
2d800 73 74 44 75 70 28 64 62 2c 20 70 4d 69 6e 4d 61  stDup(db, pMinMa
2d810 78 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  x, 0);.         
2d820 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61 78 3b   pDel = pMinMax;
2d830 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d840 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d 3e 6d  MinMax && !db->m
2d850 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
2d860 20 20 20 20 20 20 20 20 20 20 20 70 4d 69 6e 4d             pMinM
2d870 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  ax->a[0].sortOrd
2d880 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45 52 45  er = flag!=WHERE
2d890 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f 31 3a  _ORDERBY_MIN ?1:
2d8a0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  0;.            p
2d8b0 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70 45 78  MinMax->a[0].pEx
2d8c0 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
2d8d0 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  MN;.          }.
2d8e0 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
2d8f0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73       /* This cas
2d900 65 20 72 75 6e 73 20 69 66 20 74 68 65 20 61 67  e runs if the ag
2d910 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f 20 47  gregate has no G
2d920 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
2d930 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
2d940 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6d 75  processing is mu
2d950 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e 63 65  ch simpler since
2d960 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61   there is only a
2d970 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20   single row.    
2d980 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75 74      ** of output
2d990 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2d9a0 20 20 20 20 20 72 65 73 65 74 41 63 63 75 6d 75       resetAccumu
2d9b0 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73  lator(pParse, &s
2d9c0 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20  AggInfo);.      
2d9d0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
2d9e0 65 33 57 68 65 72 65 42 65 67 69 6e 28 70 50 61  e3WhereBegin(pPa
2d9f0 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2da00 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78 2c 30  Where, pMinMax,0
2da10 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20 20 20  ,flag,0);.      
2da20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d 30 20    if( pWInfo==0 
2da30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
2da40 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2da50 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20 20  te(db, pDel);.  
2da60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c          goto sel
2da70 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20  ect_end;.       
2da80 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64 61 74   }.        updat
2da90 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70 50 61  eAccumulator(pPa
2daa0 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29 3b  rse, &sAggInfo);
2dab0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2dac0 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c 20 70   pMinMax==0 || p
2dad0 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d 3d 31  MinMax->nExpr==1
2dae0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2daf0 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 4f 72  sqlite3WhereIsOr
2db00 64 65 72 65 64 28 70 57 49 6e 66 6f 29 20 29 7b  dered(pWInfo) ){
2db10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2db20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
2db30 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 73 71 6c 69  OP_Goto, 0, sqli
2db40 74 65 33 57 68 65 72 65 42 72 65 61 6b 4c 61 62  te3WhereBreakLab
2db50 65 6c 28 70 57 49 6e 66 6f 29 29 3b 0a 20 20 20  el(pWInfo));.   
2db60 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2db70 6e 74 28 28 76 2c 20 22 25 73 28 29 20 62 79 20  nt((v, "%s() by 
2db80 69 6e 64 65 78 22 2c 0a 20 20 20 20 20 20 20 20  index",.        
2db90 20 20 20 20 20 20 20 20 28 66 6c 61 67 3d 3d 57          (flag==W
2dba0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e  HERE_ORDERBY_MIN
2dbb0 3f 22 6d 69 6e 22 3a 22 6d 61 78 22 29 29 29 3b  ?"min":"max")));
2dbc0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2dbd0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45     sqlite3WhereE
2dbe0 6e 64 28 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20  nd(pWInfo);.    
2dbf0 20 20 20 20 66 69 6e 61 6c 69 7a 65 41 67 67 46      finalizeAggF
2dc00 75 6e 63 74 69 6f 6e 73 28 70 50 61 72 73 65 2c  unctions(pParse,
2dc10 20 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20   &sAggInfo);.   
2dc20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 4f 72 64     }..      pOrd
2dc30 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  erBy = 0;.      
2dc40 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2dc50 73 65 28 70 50 61 72 73 65 2c 20 70 48 61 76 69  se(pParse, pHavi
2dc60 6e 67 2c 20 61 64 64 72 45 6e 64 2c 20 53 51 4c  ng, addrEnd, SQL
2dc70 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
2dc80 0a 20 20 20 20 20 20 73 65 6c 65 63 74 49 6e 6e  .      selectInn
2dc90 65 72 4c 6f 6f 70 28 70 50 61 72 73 65 2c 20 70  erLoop(pParse, p
2dca0 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 2d 31 2c  , p->pEList, -1,
2dcb0 20 30 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20   0, 0, .        
2dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
2dcd0 65 73 74 2c 20 61 64 64 72 45 6e 64 2c 20 61 64  est, addrEnd, ad
2dce0 64 72 45 6e 64 29 3b 0a 20 20 20 20 20 20 73 71  drEnd);.      sq
2dcf0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
2dd00 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a 20  ete(db, pDel);. 
2dd10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2dd20 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2dd30 28 76 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20  (v, addrEnd);.  
2dd40 20 20 0a 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20    .  } /* endif 
2dd50 61 67 67 72 65 67 61 74 65 20 71 75 65 72 79 20  aggregate query 
2dd60 2a 2f 0a 0a 20 20 69 66 28 20 73 44 69 73 74 69  */..  if( sDisti
2dd70 6e 63 74 2e 65 54 6e 63 74 54 79 70 65 3d 3d 57  nct.eTnctType==W
2dd80 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2dd90 4f 52 44 45 52 45 44 20 29 7b 0a 20 20 20 20 65  ORDERED ){.    e
2dda0 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
2ddb0 70 50 61 72 73 65 2c 20 22 44 49 53 54 49 4e 43  pParse, "DISTINC
2ddc0 54 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  T");.  }..  /* I
2ddd0 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
2dde0 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2ddf0 68 65 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 73  hen we need to s
2de00 6f 72 74 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ort the results.
2de10 20 20 2a 2a 20 61 6e 64 20 73 65 6e 64 20 74 68    ** and send th
2de20 65 6d 20 74 6f 20 74 68 65 20 63 61 6c 6c 62 61  em to the callba
2de30 63 6b 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 20  ck one by one.. 
2de40 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72   */.  if( pOrder
2de50 42 79 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69  By ){.    explai
2de60 6e 54 65 6d 70 54 61 62 6c 65 28 70 50 61 72 73  nTempTable(pPars
2de70 65 2c 20 22 4f 52 44 45 52 20 42 59 22 29 3b 0a  e, "ORDER BY");.
2de80 20 20 20 20 67 65 6e 65 72 61 74 65 53 6f 72 74      generateSort
2de90 54 61 69 6c 28 70 50 61 72 73 65 2c 20 70 2c 20  Tail(pParse, p, 
2dea0 76 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  v, pEList->nExpr
2deb0 2c 20 70 44 65 73 74 29 3b 0a 20 20 7d 0a 0a 20  , pDest);.  }.. 
2dec0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
2ded0 20 73 6b 69 70 20 74 68 69 73 20 71 75 65 72 79   skip this query
2dee0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
2def0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
2df00 76 2c 20 69 45 6e 64 29 3b 0a 0a 20 20 2f 2a 20  v, iEnd);..  /* 
2df10 54 68 65 20 53 45 4c 45 43 54 20 77 61 73 20 73  The SELECT was s
2df20 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 64 65  uccessfully code
2df30 64 2e 20 20 20 53 65 74 20 74 68 65 20 72 65 74  d.   Set the ret
2df40 75 72 6e 20 63 6f 64 65 20 74 6f 20 30 0a 20 20  urn code to 0.  
2df50 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e  ** to indicate n
2df60 6f 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20  o errors..  */. 
2df70 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43   rc = 0;..  /* C
2df80 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 20 74 6f 20  ontrol jumps to 
2df90 68 65 72 65 20 69 66 20 61 6e 20 65 72 72 6f 72  here if an error
2dfa0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
2dfb0 61 62 6f 76 65 2c 20 6f 72 20 75 70 6f 6e 0a 20  above, or upon. 
2dfc0 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 63   ** successful c
2dfd0 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 53 45 4c  oding of the SEL
2dfe0 45 43 54 2e 0a 20 20 2a 2f 0a 73 65 6c 65 63 74  ECT..  */.select
2dff0 5f 65 6e 64 3a 0a 20 20 65 78 70 6c 61 69 6e 53  _end:.  explainS
2e000 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
2e010 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
2e020 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
2e030 0a 20 20 2f 2a 20 49 64 65 6e 74 69 66 79 20 63  .  /* Identify c
2e040 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 66 20 72  olumn names if r
2e050 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 53 45  esults of the SE
2e060 4c 45 43 54 20 61 72 65 20 74 6f 20 62 65 20 6f  LECT are to be o
2e070 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  utput..  */.  if
2e080 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e090 26 26 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d  && pDest->eDest=
2e0a0 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20  =SRT_Output ){. 
2e0b0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
2e0c0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
2e0d0 54 61 62 4c 69 73 74 2c 20 70 45 4c 69 73 74 29  TabList, pEList)
2e0e0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2e0f0 44 62 46 72 65 65 28 64 62 2c 20 73 41 67 67 49  DbFree(db, sAggI
2e100 6e 66 6f 2e 61 43 6f 6c 29 3b 0a 20 20 73 71 6c  nfo.aCol);.  sql
2e110 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 73  ite3DbFree(db, s
2e120 41 67 67 49 6e 66 6f 2e 61 46 75 6e 63 29 3b 0a  AggInfo.aFunc);.
2e130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e140 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2e150 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
2e160 58 50 4c 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65  XPLAIN)./*.** Ge
2e170 6e 65 72 61 74 65 20 61 20 68 75 6d 61 6e 2d 72  nerate a human-r
2e180 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70 74  eadable descript
2e190 69 6f 6e 20 6f 66 20 61 20 74 68 65 20 53 65 6c  ion of a the Sel
2e1a0 65 63 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73  ect object..*/.s
2e1b0 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
2e1c0 69 6e 4f 6e 65 53 65 6c 65 63 74 28 56 64 62 65  inOneSelect(Vdbe
2e1d0 20 2a 70 56 64 62 65 2c 20 53 65 6c 65 63 74 20   *pVdbe, Select 
2e1e0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  *p){.  sqlite3Ex
2e1f0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
2e200 65 2c 20 22 53 45 4c 45 43 54 20 22 29 3b 0a 20  e, "SELECT ");. 
2e210 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
2e220 20 26 20 28 53 46 5f 44 69 73 74 69 6e 63 74 7c   & (SF_Distinct|
2e230 53 46 5f 41 67 67 72 65 67 61 74 65 29 20 29 7b  SF_Aggregate) ){
2e240 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  .    if( p->selF
2e250 6c 61 67 73 20 26 20 53 46 5f 44 69 73 74 69 6e  lags & SF_Distin
2e260 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
2e270 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
2e280 28 70 56 64 62 65 2c 20 22 44 49 53 54 49 4e 43  (pVdbe, "DISTINC
2e290 54 20 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  T ");.    }.    
2e2a0 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
2e2b0 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 20 29  & SF_Aggregate )
2e2c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2e2d0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2e2e0 62 65 2c 20 22 61 67 67 5f 66 6c 61 67 20 22 29  be, "agg_flag ")
2e2f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2e300 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64  te3ExplainNL(pVd
2e310 62 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  be);.    sqlite3
2e320 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2e330 64 62 65 2c 20 22 20 20 20 22 29 3b 0a 20 20 7d  dbe, "   ");.  }
2e340 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2e350 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c  nExprList(pVdbe,
2e360 20 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 73   p->pEList);.  s
2e370 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2e380 70 56 64 62 65 29 3b 0a 20 20 69 66 28 20 70 2d  pVdbe);.  if( p-
2e390 3e 70 53 72 63 20 26 26 20 70 2d 3e 70 53 72 63  >pSrc && p->pSrc
2e3a0 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 69 6e  ->nSrc ){.    in
2e3b0 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
2e3c0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56  ExplainPrintf(pV
2e3d0 64 62 65 2c 20 22 46 52 4f 4d 20 22 29 3b 0a 20  dbe, "FROM ");. 
2e3e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e3f0 6e 50 75 73 68 28 70 56 64 62 65 29 3b 0a 20 20  nPush(pVdbe);.  
2e400 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2e410 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
2e420 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
2e430 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
2e440 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61  em = &p->pSrc->a
2e450 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [i];.      sqlit
2e460 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2e470 70 56 64 62 65 2c 20 22 7b 25 64 2c 2a 7d 20 3d  pVdbe, "{%d,*} =
2e480 20 22 2c 20 70 49 74 65 6d 2d 3e 69 43 75 72 73   ", pItem->iCurs
2e490 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  or);.      if( p
2e4a0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
2e4b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2e4c0 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 56  ExplainSelect(pV
2e4d0 64 62 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  dbe, pItem->pSel
2e4e0 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ect);.        if
2e4f0 28 20 70 49 74 65 6d 2d 3e 70 54 61 62 20 29 7b  ( pItem->pTab ){
2e500 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2e510 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2e520 70 56 64 62 65 2c 20 22 20 28 74 61 62 6e 61 6d  pVdbe, " (tabnam
2e530 65 3d 25 73 29 22 2c 20 70 49 74 65 6d 2d 3e 70  e=%s)", pItem->p
2e540 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
2e550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
2e560 73 65 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e  se if( pItem->zN
2e570 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
2e580 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
2e590 6e 74 66 28 70 56 64 62 65 2c 20 22 25 73 22 2c  ntf(pVdbe, "%s",
2e5a0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
2e5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2e5c0 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
2e5d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2e5e0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2e5f0 70 56 64 62 65 2c 20 22 20 28 41 53 20 25 73 29  pVdbe, " (AS %s)
2e600 22 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  ", pItem->zAlias
2e610 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2e620 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e   if( pItem->join
2e630 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 20 29  type & JT_LEFT )
2e640 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2e650 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
2e660 56 64 62 65 2c 20 22 20 4c 45 46 54 2d 4a 4f 49  Vdbe, " LEFT-JOI
2e670 4e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  N");.      }.   
2e680 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e690 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20  nNL(pVdbe);.    
2e6a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
2e6b0 6c 61 69 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a  lainPop(pVdbe);.
2e6c0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 57 68    }.  if( p->pWh
2e6d0 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
2e6e0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2e6f0 70 56 64 62 65 2c 20 22 57 48 45 52 45 20 22 29  pVdbe, "WHERE ")
2e700 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
2e710 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20  lainExpr(pVdbe, 
2e720 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20  p->pWhere);.    
2e730 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2e740 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69  (pVdbe);.  }.  i
2e750 66 28 20 70 2d 3e 70 47 72 6f 75 70 42 79 20 29  f( p->pGroupBy )
2e760 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2e770 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2e780 2c 20 22 47 52 4f 55 50 42 59 20 22 29 3b 0a 20  , "GROUPBY ");. 
2e790 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e7a0 6e 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c  nExprList(pVdbe,
2e7b0 20 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20   p->pGroupBy);. 
2e7c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
2e7d0 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a  nNL(pVdbe);.  }.
2e7e0 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
2e7f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2e800 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
2e810 62 65 2c 20 22 48 41 56 49 4e 47 20 22 29 3b 0a  be, "HAVING ");.
2e820 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
2e830 69 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d  inExpr(pVdbe, p-
2e840 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20 73  >pHaving);.    s
2e850 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28  qlite3ExplainNL(
2e860 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pVdbe);.  }.  if
2e870 28 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b  ( p->pOrderBy ){
2e880 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
2e890 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c  ainPrintf(pVdbe,
2e8a0 20 22 4f 52 44 45 52 42 59 20 22 29 3b 0a 20 20   "ORDERBY ");.  
2e8b0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e8c0 45 78 70 72 4c 69 73 74 28 70 56 64 62 65 2c 20  ExprList(pVdbe, 
2e8d0 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  p->pOrderBy);.  
2e8e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
2e8f0 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
2e900 20 69 66 28 20 70 2d 3e 70 4c 69 6d 69 74 20 29   if( p->pLimit )
2e910 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
2e920 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
2e930 2c 20 22 4c 49 4d 49 54 20 22 29 3b 0a 20 20 20  , "LIMIT ");.   
2e940 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
2e950 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e 70 4c  xpr(pVdbe, p->pL
2e960 69 6d 69 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  imit);.    sqlit
2e970 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
2e980 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  e);.  }.  if( p-
2e990 3e 70 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  >pOffset ){.    
2e9a0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
2e9b0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 4f 46 46  intf(pVdbe, "OFF
2e9c0 53 45 54 20 22 29 3b 0a 20 20 20 20 73 71 6c 69  SET ");.    sqli
2e9d0 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
2e9e0 56 64 62 65 2c 20 70 2d 3e 70 4f 66 66 73 65 74  Vdbe, p->pOffset
2e9f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
2ea00 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
2ea10 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
2ea20 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63 74 28  e3ExplainSelect(
2ea30 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 65 6c  Vdbe *pVdbe, Sel
2ea40 65 63 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ect *p){.  if( p
2ea50 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2ea60 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
2ea70 70 56 64 62 65 2c 20 22 28 6e 75 6c 6c 2d 73 65  pVdbe, "(null-se
2ea80 6c 65 63 74 29 22 29 3b 0a 20 20 20 20 72 65 74  lect)");.    ret
2ea90 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
2eaa0 65 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56  e3ExplainPush(pV
2eab0 64 62 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  dbe);.  while( p
2eac0 20 29 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f   ){.    explainO
2ead0 6e 65 53 65 6c 65 63 74 28 70 56 64 62 65 2c 20  neSelect(pVdbe, 
2eae0 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70  p);.    p = p->p
2eaf0 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 3d  Next;.    if( p=
2eb00 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2eb10 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c  sqlite3ExplainNL
2eb20 28 70 56 64 62 65 29 3b 0a 20 20 20 20 73 71 6c  (pVdbe);.    sql
2eb30 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2eb40 66 28 70 56 64 62 65 2c 20 22 25 73 5c 6e 22 2c  f(pVdbe, "%s\n",
2eb50 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
2eb60 3e 6f 70 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >op));.  }.  sql
2eb70 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
2eb80 66 28 70 56 64 62 65 2c 20 22 45 4e 44 22 29 3b  f(pVdbe, "END");
2eb90 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69  .  sqlite3Explai
2eba0 6e 50 6f 70 28 70 56 64 62 65 29 3b 0a 7d 0a 0a  nPop(pVdbe);.}..
2ebb0 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 74  /* End of the st
2ebc0 72 75 63 74 75 72 65 20 64 65 62 75 67 20 70 72  ructure debug pr
2ebd0 69 6e 74 69 6e 67 20 63 6f 64 65 0a 2a 2a 2a 2a  inting code.****
2ebe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ebf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ec00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ec10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ec20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
2ec30 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
2ec40 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
2ec50 45 58 50 4c 41 49 4e 29 20 2a 2f 0a              EXPLAIN) */.