/ Hex Artifact Content
Login

Artifact def5381139465670bc06b3e1adfe39a7f7dd21c2:


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 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
0400: 49 6e 69 74 69 61 6c 69 7a 65 20 61 20 53 65 6c  Initialize a Sel
0410: 65 63 74 44 65 73 74 20 73 74 72 75 63 74 75 72  ectDest structur
0420: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
0430: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
0440: 28 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65  (SelectDest *pDe
0450: 73 74 2c 20 69 6e 74 20 65 44 65 73 74 2c 20 69  st, int eDest, i
0460: 6e 74 20 69 50 61 72 6d 29 7b 0a 20 20 70 44 65  nt iParm){.  pDe
0470: 73 74 2d 3e 65 44 65 73 74 20 3d 20 28 75 38 29  st->eDest = (u8)
0480: 65 44 65 73 74 3b 0a 20 20 70 44 65 73 74 2d 3e  eDest;.  pDest->
0490: 69 53 44 50 61 72 6d 20 3d 20 69 50 61 72 6d 3b  iSDParm = iParm;
04a0: 0a 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64 73  .  pDest->affSds
04b0: 74 20 3d 20 30 3b 0a 20 20 70 44 65 73 74 2d 3e  t = 0;.  pDest->
04c0: 69 53 64 73 74 20 3d 20 30 3b 0a 20 20 70 44 65  iSdst = 0;.  pDe
04d0: 73 74 2d 3e 6e 53 64 73 74 20 3d 20 30 3b 0a 7d  st->nSdst = 0;.}
04e0: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
04f0: 65 20 61 20 6e 65 77 20 53 65 6c 65 63 74 20 73  e a new Select s
0500: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
0510: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
0520: 20 74 68 61 74 0a 2a 2a 20 73 74 72 75 63 74 75   that.** structu
0530: 72 65 2e 0a 2a 2f 0a 53 65 6c 65 63 74 20 2a 73  re..*/.Select *s
0540: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
0550: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0560: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
0570: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
0580: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
0590: 74 2c 20 20 20 20 20 2f 2a 20 77 68 69 63 68 20  t,     /* which 
05a0: 63 6f 6c 75 6d 6e 73 20 74 6f 20 69 6e 63 6c 75  columns to inclu
05b0: 64 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  de in the result
05c0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
05d0: 53 72 63 2c 20 20 20 20 20 20 20 20 2f 2a 20 74  Src,        /* t
05e0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2d  he FROM clause -
05f0: 2d 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 74  - which tables t
0600: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72  o scan */.  Expr
0610: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
0620: 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63    /* the WHERE c
0630: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
0640: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 2c 20 20  ist *pGroupBy,  
0650: 20 2f 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59   /* the GROUP BY
0660: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
0670: 72 20 2a 70 48 61 76 69 6e 67 2c 20 20 20 20 20  r *pHaving,     
0680: 20 20 20 2f 2a 20 74 68 65 20 48 41 56 49 4e 47     /* the HAVING
0690: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
06a0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
06b0: 20 20 20 2f 2a 20 74 68 65 20 4f 52 44 45 52 20     /* the ORDER 
06c0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
06d0: 6e 74 20 69 73 44 69 73 74 69 6e 63 74 2c 20 20  nt isDistinct,  
06e0: 20 20 20 20 20 2f 2a 20 74 72 75 65 20 69 66 20       /* true if 
06f0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
0700: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
0710: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69  */.  Expr *pLimi
0720: 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 49  t,         /* LI
0730: 4d 49 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c 4c  MIT value.  NULL
0740: 20 6d 65 61 6e 73 20 6e 6f 74 20 75 73 65 64 20   means not used 
0750: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73  */.  Expr *pOffs
0760: 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 46  et         /* OF
0770: 46 53 45 54 20 76 61 6c 75 65 2e 20 20 4e 55 4c  FSET value.  NUL
0780: 4c 20 6d 65 61 6e 73 20 6e 6f 20 6f 66 66 73 65  L means no offse
0790: 74 20 2a 2f 0a 29 7b 0a 20 20 53 65 6c 65 63 74  t */.){.  Select
07a0: 20 2a 70 4e 65 77 3b 0a 20 20 53 65 6c 65 63 74   *pNew;.  Select
07b0: 20 73 74 61 6e 64 69 6e 3b 0a 20 20 73 71 6c 69   standin;.  sqli
07c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
07d0: 2d 3e 64 62 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ->db;.  pNew = s
07e0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
07f0: 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  ro(db, sizeof(*p
0800: 4e 65 77 29 20 29 3b 0a 20 20 61 73 73 65 72 74  New) );.  assert
0810: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0820: 65 64 20 7c 7c 20 21 70 4f 66 66 73 65 74 20 7c  ed || !pOffset |
0830: 7c 20 70 4c 69 6d 69 74 20 29 3b 20 2f 2a 20 4f  | pLimit ); /* O
0840: 46 46 53 45 54 20 69 6d 70 6c 69 65 73 20 4c 49  FFSET implies LI
0850: 4d 49 54 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  MIT */.  if( pNe
0860: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  w==0 ){.    asse
0870: 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
0880: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 4e 65 77  iled );.    pNew
0890: 20 3d 20 26 73 74 61 6e 64 69 6e 3b 0a 20 20 20   = &standin;.   
08a0: 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c   memset(pNew, 0,
08b0: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
08c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 4c 69 73  .  }.  if( pELis
08d0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 45 4c 69  t==0 ){.    pELi
08e0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
08f0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
0900: 65 2c 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70  e, 0, sqlite3Exp
0910: 72 28 64 62 2c 54 4b 5f 41 4c 4c 2c 30 29 29 3b  r(db,TK_ALL,0));
0920: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  .  }.  pNew->pEL
0930: 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20  ist = pEList;.  
0940: 69 66 28 20 70 53 72 63 3d 3d 30 20 29 20 70 53  if( pSrc==0 ) pS
0950: 72 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  rc = sqlite3DbMa
0960: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
0970: 65 6f 66 28 2a 70 53 72 63 29 29 3b 0a 20 20 70  eof(*pSrc));.  p
0980: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 70 53 72 63  New->pSrc = pSrc
0990: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
09a0: 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 4e 65   = pWhere;.  pNe
09b0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 70 47  w->pGroupBy = pG
09c0: 72 6f 75 70 42 79 3b 0a 20 20 70 4e 65 77 2d 3e  roupBy;.  pNew->
09d0: 70 48 61 76 69 6e 67 20 3d 20 70 48 61 76 69 6e  pHaving = pHavin
09e0: 67 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  g;.  pNew->pOrde
09f0: 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
0a00: 20 20 70 4e 65 77 2d 3e 73 65 6c 46 6c 61 67 73    pNew->selFlags
0a10: 20 3d 20 69 73 44 69 73 74 69 6e 63 74 20 3f 20   = isDistinct ? 
0a20: 53 46 5f 44 69 73 74 69 6e 63 74 20 3a 20 30 3b  SF_Distinct : 0;
0a30: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
0a40: 5f 53 45 4c 45 43 54 3b 0a 20 20 70 4e 65 77 2d  _SELECT;.  pNew-
0a50: 3e 70 4c 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74  >pLimit = pLimit
0a60: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65  ;.  pNew->pOffse
0a70: 74 20 3d 20 70 4f 66 66 73 65 74 3b 0a 20 20 61  t = pOffset;.  a
0a80: 73 73 65 72 74 28 20 70 4f 66 66 73 65 74 3d 3d  ssert( pOffset==
0a90: 30 20 7c 7c 20 70 4c 69 6d 69 74 21 3d 30 20 29  0 || pLimit!=0 )
0aa0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70  ;.  pNew->addrOp
0ab0: 65 6e 45 70 68 6d 5b 30 5d 20 3d 20 2d 31 3b 0a  enEphm[0] = -1;.
0ac0: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e    pNew->addrOpen
0ad0: 45 70 68 6d 5b 31 5d 20 3d 20 2d 31 3b 0a 20 20  Ephm[1] = -1;.  
0ae0: 70 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70  pNew->addrOpenEp
0af0: 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 69 66  hm[2] = -1;.  if
0b00: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0b10: 65 64 20 29 20 7b 0a 20 20 20 20 63 6c 65 61 72  ed ) {.    clear
0b20: 53 65 6c 65 63 74 28 64 62 2c 20 70 4e 65 77 29  Select(db, pNew)
0b30: 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d  ;.    if( pNew!=
0b40: 26 73 74 61 6e 64 69 6e 20 29 20 73 71 6c 69 74  &standin ) sqlit
0b50: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
0b60: 77 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  w);.    pNew = 0
0b70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
0b80: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 53 72  ssert( pNew->pSr
0b90: 63 21 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  c!=0 || pParse->
0ba0: 6e 45 72 72 3e 30 20 29 3b 0a 20 20 7d 0a 20 20  nErr>0 );.  }.  
0bb0: 61 73 73 65 72 74 28 20 70 4e 65 77 21 3d 26 73  assert( pNew!=&s
0bc0: 74 61 6e 64 69 6e 20 29 3b 0a 20 20 72 65 74 75  tandin );.  retu
0bd0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
0be0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 67 69 76  * Delete the giv
0bf0: 65 6e 20 53 65 6c 65 63 74 20 73 74 72 75 63 74  en Select struct
0c00: 75 72 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  ure and all of i
0c10: 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 73  ts substructures
0c20: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
0c30: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 73 71  3SelectDelete(sq
0c40: 6c 69 74 65 33 20 2a 64 62 2c 20 53 65 6c 65 63  lite3 *db, Selec
0c50: 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
0c60: 7b 0a 20 20 20 20 63 6c 65 61 72 53 65 6c 65 63  {.    clearSelec
0c70: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 73 71  t(db, p);.    sq
0c80: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0c90: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
0ca0: 20 47 69 76 65 6e 20 31 20 74 6f 20 33 20 69 64   Given 1 to 3 id
0cb0: 65 6e 74 69 66 69 65 72 73 20 70 72 65 63 65 65  entifiers precee
0cc0: 64 69 6e 67 20 74 68 65 20 4a 4f 49 4e 20 6b 65  ding the JOIN ke
0cd0: 79 77 6f 72 64 2c 20 64 65 74 65 72 6d 69 6e 65  yword, determine
0ce0: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 6f 66 20   the.** type of 
0cf0: 6a 6f 69 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e  join.  Return an
0d00: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
0d10: 74 20 74 68 61 74 20 65 78 70 72 65 73 73 65 73  t that expresses
0d20: 20 74 68 61 74 20 74 79 70 65 0a 2a 2a 20 69 6e   that type.** in
0d30: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
0d40: 6c 6c 6f 77 69 6e 67 20 62 69 74 20 76 61 6c 75  llowing bit valu
0d50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 4a 54  es:.**.**     JT
0d60: 5f 49 4e 4e 45 52 0a 2a 2a 20 20 20 20 20 4a 54  _INNER.**     JT
0d70: 5f 43 52 4f 53 53 0a 2a 2a 20 20 20 20 20 4a 54  _CROSS.**     JT
0d80: 5f 4f 55 54 45 52 0a 2a 2a 20 20 20 20 20 4a 54  _OUTER.**     JT
0d90: 5f 4e 41 54 55 52 41 4c 0a 2a 2a 20 20 20 20 20  _NATURAL.**     
0da0: 4a 54 5f 4c 45 46 54 0a 2a 2a 20 20 20 20 20 4a  JT_LEFT.**     J
0db0: 54 5f 52 49 47 48 54 0a 2a 2a 0a 2a 2a 20 41 20  T_RIGHT.**.** A 
0dc0: 66 75 6c 6c 20 6f 75 74 65 72 20 6a 6f 69 6e 20  full outer join 
0dd0: 69 73 20 74 68 65 20 63 6f 6d 62 69 6e 61 74 69  is the combinati
0de0: 6f 6e 20 6f 66 20 4a 54 5f 4c 45 46 54 20 61 6e  on of JT_LEFT an
0df0: 64 20 4a 54 5f 52 49 47 48 54 2e 0a 2a 2a 0a 2a  d JT_RIGHT..**.*
0e00: 2a 20 49 66 20 61 6e 20 69 6c 6c 65 67 61 6c 20  * If an illegal 
0e10: 6f 72 20 75 6e 73 75 70 70 6f 72 74 65 64 20 6a  or unsupported j
0e20: 6f 69 6e 20 74 79 70 65 20 69 73 20 73 65 65 6e  oin type is seen
0e30: 2c 20 74 68 65 6e 20 73 74 69 6c 6c 20 72 65 74  , then still ret
0e40: 75 72 6e 0a 2a 2a 20 61 20 6a 6f 69 6e 20 74 79  urn.** a join ty
0e50: 70 65 2c 20 62 75 74 20 70 75 74 20 61 6e 20 65  pe, but put an e
0e60: 72 72 6f 72 20 69 6e 20 74 68 65 20 70 50 61 72  rror in the pPar
0e70: 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
0e80: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4a 6f 69 6e  .int sqlite3Join
0e90: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
0ea0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 41 2c 20 54  se, Token *pA, T
0eb0: 6f 6b 65 6e 20 2a 70 42 2c 20 54 6f 6b 65 6e 20  oken *pB, Token 
0ec0: 2a 70 43 29 7b 0a 20 20 69 6e 74 20 6a 6f 69 6e  *pC){.  int join
0ed0: 74 79 70 65 20 3d 20 30 3b 0a 20 20 54 6f 6b 65  type = 0;.  Toke
0ee0: 6e 20 2a 61 70 41 6c 6c 5b 33 5d 3b 0a 20 20 54  n *apAll[3];.  T
0ef0: 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 20 20 20  oken *p;.       
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f10: 20 20 20 20 20 20 2f 2a 20 20 20 30 31 32 33 34        /*   01234
0f20: 35 36 37 38 39 20 31 32 33 34 35 36 37 38 39 20  56789 123456789 
0f30: 31 32 33 34 35 36 37 38 39 20 31 32 33 20 2a 2f  123456789 123 */
0f40: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
0f50: 63 68 61 72 20 7a 4b 65 79 54 65 78 74 5b 5d 20  char zKeyText[] 
0f60: 3d 20 22 6e 61 74 75 72 61 6c 65 66 74 6f 75 74  = "naturaleftout
0f70: 65 72 69 67 68 74 66 75 6c 6c 69 6e 6e 65 72 63  erightfullinnerc
0f80: 72 6f 73 73 22 3b 0a 20 20 73 74 61 74 69 63 20  ross";.  static 
0f90: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
0fa0: 20 20 20 75 38 20 69 3b 20 20 20 20 20 20 20 20     u8 i;        
0fb0: 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
0fc0: 6b 65 79 77 6f 72 64 20 74 65 78 74 20 69 6e 20  keyword text in 
0fd0: 7a 4b 65 79 54 65 78 74 5b 5d 20 2a 2f 0a 20 20  zKeyText[] */.  
0fe0: 20 20 75 38 20 6e 43 68 61 72 3b 20 20 20 20 2f    u8 nChar;    /
0ff0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
1000: 6b 65 79 77 6f 72 64 20 69 6e 20 63 68 61 72 61  keyword in chara
1010: 63 74 65 72 73 20 2a 2f 0a 20 20 20 20 75 38 20  cters */.    u8 
1020: 63 6f 64 65 3b 20 20 20 20 20 2f 2a 20 4a 6f 69  code;     /* Joi
1030: 6e 20 74 79 70 65 20 6d 61 73 6b 20 2a 2f 0a 20  n type mask */. 
1040: 20 7d 20 61 4b 65 79 77 6f 72 64 5b 5d 20 3d 20   } aKeyword[] = 
1050: 7b 0a 20 20 20 20 2f 2a 20 6e 61 74 75 72 61 6c  {.    /* natural
1060: 20 2a 2f 20 7b 20 30 2c 20 20 37 2c 20 4a 54 5f   */ { 0,  7, JT_
1070: 4e 41 54 55 52 41 4c 20 20 20 20 20 20 20 20 20  NATURAL         
1080: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1090: 20 6c 65 66 74 20 20 20 20 2a 2f 20 7b 20 36 2c   left    */ { 6,
10a0: 20 20 34 2c 20 4a 54 5f 4c 45 46 54 7c 4a 54 5f    4, JT_LEFT|JT_
10b0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20 7d  OUTER          }
10c0: 2c 0a 20 20 20 20 2f 2a 20 6f 75 74 65 72 20 20  ,.    /* outer  
10d0: 20 2a 2f 20 7b 20 31 30 2c 20 35 2c 20 4a 54 5f   */ { 10, 5, JT_
10e0: 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 20 20  OUTER           
10f0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
1100: 20 72 69 67 68 74 20 20 20 2a 2f 20 7b 20 31 34   right   */ { 14
1110: 2c 20 35 2c 20 4a 54 5f 52 49 47 48 54 7c 4a 54  , 5, JT_RIGHT|JT
1120: 5f 4f 55 54 45 52 20 20 20 20 20 20 20 20 20 7d  _OUTER         }
1130: 2c 0a 20 20 20 20 2f 2a 20 66 75 6c 6c 20 20 20  ,.    /* full   
1140: 20 2a 2f 20 7b 20 31 39 2c 20 34 2c 20 4a 54 5f   */ { 19, 4, JT_
1150: 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 7c 4a 54  LEFT|JT_RIGHT|JT
1160: 5f 4f 55 54 45 52 20 7d 2c 0a 20 20 20 20 2f 2a  _OUTER },.    /*
1170: 20 69 6e 6e 65 72 20 20 20 2a 2f 20 7b 20 32 33   inner   */ { 23
1180: 2c 20 35 2c 20 4a 54 5f 49 4e 4e 45 52 20 20 20  , 5, JT_INNER   
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
11a0: 2c 0a 20 20 20 20 2f 2a 20 63 72 6f 73 73 20 20  ,.    /* cross  
11b0: 20 2a 2f 20 7b 20 32 38 2c 20 35 2c 20 4a 54 5f   */ { 28, 5, JT_
11c0: 49 4e 4e 45 52 7c 4a 54 5f 43 52 4f 53 53 20 20  INNER|JT_CROSS  
11d0: 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
11e0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70 41   int i, j;.  apA
11f0: 6c 6c 5b 30 5d 20 3d 20 70 41 3b 0a 20 20 61 70  ll[0] = pA;.  ap
1200: 41 6c 6c 5b 31 5d 20 3d 20 70 42 3b 0a 20 20 61  All[1] = pB;.  a
1210: 70 41 6c 6c 5b 32 5d 20 3d 20 70 43 3b 0a 20 20  pAll[2] = pC;.  
1220: 66 6f 72 28 69 3d 30 3b 20 69 3c 33 20 26 26 20  for(i=0; i<3 && 
1230: 61 70 41 6c 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  apAll[i]; i++){.
1240: 20 20 20 20 70 20 3d 20 61 70 41 6c 6c 5b 69 5d      p = apAll[i]
1250: 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
1260: 3c 41 72 72 61 79 53 69 7a 65 28 61 4b 65 79 77  <ArraySize(aKeyw
1270: 6f 72 64 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ord); j++){.    
1280: 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 61 4b 65 79    if( p->n==aKey
1290: 77 6f 72 64 5b 6a 5d 2e 6e 43 68 61 72 20 0a 20  word[j].nChar . 
12a0: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
12b0: 74 65 33 53 74 72 4e 49 43 6d 70 28 28 63 68 61  te3StrNICmp((cha
12c0: 72 2a 29 70 2d 3e 7a 2c 20 26 7a 4b 65 79 54 65  r*)p->z, &zKeyTe
12d0: 78 74 5b 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 69  xt[aKeyword[j].i
12e0: 5d 2c 20 70 2d 3e 6e 29 3d 3d 30 20 29 7b 0a 20  ], p->n)==0 ){. 
12f0: 20 20 20 20 20 20 20 6a 6f 69 6e 74 79 70 65 20         jointype 
1300: 7c 3d 20 61 4b 65 79 77 6f 72 64 5b 6a 5d 2e 63  |= aKeyword[j].c
1310: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ode;.        bre
1320: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1330: 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
1340: 6a 3d 3d 30 20 7c 7c 20 6a 3d 3d 31 20 7c 7c 20  j==0 || j==1 || 
1350: 6a 3d 3d 32 20 7c 7c 20 6a 3d 3d 33 20 7c 7c 20  j==2 || j==3 || 
1360: 6a 3d 3d 34 20 7c 7c 20 6a 3d 3d 35 20 7c 7c 20  j==4 || j==5 || 
1370: 6a 3d 3d 36 20 29 3b 0a 20 20 20 20 69 66 28 20  j==6 );.    if( 
1380: 6a 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4b 65  j>=ArraySize(aKe
1390: 79 77 6f 72 64 29 20 29 7b 0a 20 20 20 20 20 20  yword) ){.      
13a0: 6a 6f 69 6e 74 79 70 65 20 7c 3d 20 4a 54 5f 45  jointype |= JT_E
13b0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61  RROR;.      brea
13c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
13d0: 66 28 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70  f(.     (jointyp
13e0: 65 20 26 20 28 4a 54 5f 49 4e 4e 45 52 7c 4a 54  e & (JT_INNER|JT
13f0: 5f 4f 55 54 45 52 29 29 3d 3d 28 4a 54 5f 49 4e  _OUTER))==(JT_IN
1400: 4e 45 52 7c 4a 54 5f 4f 55 54 45 52 29 20 7c 7c  NER|JT_OUTER) ||
1410: 0a 20 20 20 20 20 28 6a 6f 69 6e 74 79 70 65 20  .     (jointype 
1420: 26 20 4a 54 5f 45 52 52 4f 52 29 21 3d 30 0a 20  & JT_ERROR)!=0. 
1430: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
1440: 61 72 20 2a 7a 53 70 20 3d 20 22 20 22 3b 0a 20  ar *zSp = " ";. 
1450: 20 20 20 61 73 73 65 72 74 28 20 70 42 21 3d 30     assert( pB!=0
1460: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 3d 3d   );.    if( pC==
1470: 30 20 29 7b 20 7a 53 70 2b 2b 3b 20 7d 0a 20 20  0 ){ zSp++; }.  
1480: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1490: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
14a0: 77 6e 20 6f 72 20 75 6e 73 75 70 70 6f 72 74 65  wn or unsupporte
14b0: 64 20 6a 6f 69 6e 20 74 79 70 65 3a 20 22 0a 20  d join type: ". 
14c0: 20 20 20 20 20 20 22 25 54 20 25 54 25 73 25 54        "%T %T%s%T
14d0: 22 2c 20 70 41 2c 20 70 42 2c 20 7a 53 70 2c 20  ", pA, pB, zSp, 
14e0: 70 43 29 3b 0a 20 20 20 20 6a 6f 69 6e 74 79 70  pC);.    jointyp
14f0: 65 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 0a 20 20  e = JT_INNER;.  
1500: 7d 65 6c 73 65 20 69 66 28 20 28 6a 6f 69 6e 74  }else if( (joint
1510: 79 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21  ype & JT_OUTER)!
1520: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0 .         && 
1530: 28 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f  (jointype & (JT_
1540: 4c 45 46 54 7c 4a 54 5f 52 49 47 48 54 29 29 21  LEFT|JT_RIGHT))!
1550: 3d 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20  =JT_LEFT ){.    
1560: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1570: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
1580: 52 49 47 48 54 20 61 6e 64 20 46 55 4c 4c 20 4f  RIGHT and FULL O
1590: 55 54 45 52 20 4a 4f 49 4e 73 20 61 72 65 20 6e  UTER JOINs are n
15a0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 73 75 70  ot currently sup
15b0: 70 6f 72 74 65 64 22 29 3b 0a 20 20 20 20 6a 6f  ported");.    jo
15c0: 69 6e 74 79 70 65 20 3d 20 4a 54 5f 49 4e 4e 45  intype = JT_INNE
15d0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
15e0: 6a 6f 69 6e 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a  jointype;.}../*.
15f0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
1600: 64 65 78 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  dex of a column 
1610: 69 6e 20 61 20 74 61 62 6c 65 2e 20 20 52 65 74  in a table.  Ret
1620: 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20 63 6f  urn -1 if the co
1630: 6c 75 6d 6e 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  lumn.** is not c
1640: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
1650: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
1660: 20 69 6e 74 20 63 6f 6c 75 6d 6e 49 6e 64 65 78   int columnIndex
1670: 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f  (Table *pTab, co
1680: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b  nst char *zCol){
1690: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
16a0: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  i=0; i<pTab->nCo
16b0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
16c0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
16d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e  pTab->aCol[i].zN
16e0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
16f0: 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20  return i;.  }.  
1700: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a  return -1;.}../*
1710: 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66  .** Search the f
1720: 69 72 73 74 20 4e 20 74 61 62 6c 65 73 20 69 6e  irst N tables in
1730: 20 70 53 72 63 2c 20 66 72 6f 6d 20 6c 65 66 74   pSrc, from left
1740: 20 74 6f 20 72 69 67 68 74 2c 20 6c 6f 6f 6b 69   to right, looki
1750: 6e 67 20 66 6f 72 20 61 0a 2a 2a 20 74 61 62 6c  ng for a.** tabl
1760: 65 20 74 68 61 74 20 68 61 73 20 61 20 63 6f 6c  e that has a col
1770: 75 6d 6e 20 6e 61 6d 65 64 20 7a 43 6f 6c 2e 20  umn named zCol. 
1780: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 66 6f 75   .**.** When fou
1790: 6e 64 2c 20 73 65 74 20 2a 70 69 54 61 62 20 61  nd, set *piTab a
17a0: 6e 64 20 2a 70 69 43 6f 6c 20 74 6f 20 74 68 65  nd *piCol to the
17b0: 20 74 61 62 6c 65 20 69 6e 64 65 78 20 61 6e 64   table index and
17c0: 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 0a 2a 2a   column index.**
17d0: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
17e0: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 72 65 74 75   column and retu
17f0: 72 6e 20 54 52 55 45 2e 0a 2a 2a 0a 2a 2a 20 49  rn TRUE..**.** I
1800: 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 72 65 74  f not found, ret
1810: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
1820: 61 74 69 63 20 69 6e 74 20 74 61 62 6c 65 41 6e  atic int tableAn
1830: 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 0a 20 20  dColumnIndex(.  
1840: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1850: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1860: 20 74 61 62 6c 65 73 20 74 6f 20 73 65 61 72 63   tables to searc
1870: 68 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20  h */.  int N,   
1880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1890: 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
18a0: 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 74 6f 20  in pSrc->a[] to 
18b0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 63 6f 6e 73  search */.  cons
18c0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20  t char *zCol,   
18d0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18e0: 63 6f 6c 75 6d 6e 20 77 65 20 61 72 65 20 6c 6f  column we are lo
18f0: 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 69  oking for */.  i
1900: 6e 74 20 2a 70 69 54 61 62 2c 20 20 20 20 20 20  nt *piTab,      
1910: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 69 6e 64      /* Write ind
1920: 65 78 20 6f 66 20 70 53 72 63 2d 3e 61 5b 5d 20  ex of pSrc->a[] 
1930: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  here */.  int *p
1940: 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20 2f  iCol           /
1950: 2a 20 57 72 69 74 65 20 69 6e 64 65 78 20 6f 66  * Write index of
1960: 20 70 53 72 63 2d 3e 61 5b 2a 70 69 54 61 62 5d   pSrc->a[*piTab]
1970: 2e 70 54 61 62 2d 3e 61 43 6f 6c 5b 5d 20 68 65  .pTab->aCol[] he
1980: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
1990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19a0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
19b0: 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 53  ver tables in pS
19c0: 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rc */.  int iCol
19d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
19e0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
19f0: 6d 61 74 63 68 69 6e 67 20 7a 43 6f 6c 20 2a 2f  matching zCol */
1a00: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 69 54  ..  assert( (piT
1a10: 61 62 3d 3d 30 29 3d 3d 28 70 69 43 6f 6c 3d 3d  ab==0)==(piCol==
1a20: 30 29 20 29 3b 20 20 2f 2a 20 42 6f 74 68 20 6f  0) );  /* Both o
1a30: 72 20 6e 65 69 74 68 65 72 20 61 72 65 20 4e 55  r neither are NU
1a40: 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  LL */.  for(i=0;
1a50: 20 69 3c 4e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<N; i++){.    
1a60: 69 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64  iCol = columnInd
1a70: 65 78 28 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 54  ex(pSrc->a[i].pT
1a80: 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 69  ab, zCol);.    i
1a90: 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
1aa0: 20 20 20 20 69 66 28 20 70 69 54 61 62 20 29 7b      if( piTab ){
1ab0: 0a 20 20 20 20 20 20 20 20 2a 70 69 54 61 62 20  .        *piTab 
1ac0: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 2a 70 69  = i;.        *pi
1ad0: 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  Col = iCol;.    
1ae0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
1af0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1b00: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1b10: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b20: 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
1b30: 74 65 72 6d 73 20 69 6d 70 6c 69 65 64 20 62 79  terms implied by
1b40: 20 4a 4f 49 4e 20 73 79 6e 74 61 78 20 74 6f 20   JOIN syntax to 
1b50: 74 68 65 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61  the.** WHERE cla
1b60: 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  use expression o
1b70: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
1b80: 6d 65 6e 74 2e 20 54 68 65 20 6e 65 77 20 74 65  ment. The new te
1b90: 72 6d 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  rm, which.** is 
1ba0: 41 4e 44 65 64 20 77 69 74 68 20 74 68 65 20 65  ANDed with the e
1bb0: 78 69 73 74 69 6e 67 20 57 48 45 52 45 20 63 6c  xisting WHERE cl
1bc0: 61 75 73 65 2c 20 69 73 20 6f 66 20 74 68 65 20  ause, is of the 
1bd0: 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  form:.**.**    (
1be0: 74 61 62 31 2e 63 6f 6c 31 20 3d 20 74 61 62 32  tab1.col1 = tab2
1bf0: 2e 63 6f 6c 32 29 0a 2a 2a 0a 2a 2a 20 77 68 65  .col2).**.** whe
1c00: 72 65 20 74 61 62 31 20 69 73 20 74 68 65 20 69  re tab1 is the i
1c10: 53 72 63 27 74 68 20 74 61 62 6c 65 20 69 6e 20  Src'th table in 
1c20: 53 72 63 4c 69 73 74 20 70 53 72 63 20 61 6e 64  SrcList pSrc and
1c30: 20 74 61 62 32 20 69 73 20 74 68 65 20 0a 2a 2a   tab2 is the .**
1c40: 20 28 69 53 72 63 2b 31 29 27 74 68 2e 20 43 6f   (iSrc+1)'th. Co
1c50: 6c 75 6d 6e 20 63 6f 6c 31 20 69 73 20 63 6f 6c  lumn col1 is col
1c60: 75 6d 6e 20 69 43 6f 6c 4c 65 66 74 20 6f 66 20  umn iColLeft of 
1c70: 74 61 62 31 2c 20 61 6e 64 20 63 6f 6c 32 20 69  tab1, and col2 i
1c80: 73 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c  s.** column iCol
1c90: 52 69 67 68 74 20 6f 66 20 74 61 62 32 2e 0a 2a  Right of tab2..*
1ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 64  /.static void ad
1cb0: 64 57 68 65 72 65 54 65 72 6d 28 0a 20 20 50 61  dWhereTerm(.  Pa
1cc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1cf0: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1d00: 53 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  Src,            
1d10: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
1d20: 20 74 61 62 6c 65 73 20 69 6e 20 46 52 4f 4d 20   tables in FROM 
1d30: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  clause */.  int 
1d40: 69 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  iLeft,          
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1d60: 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 74 61  ndex of first ta
1d70: 62 6c 65 20 74 6f 20 6a 6f 69 6e 20 69 6e 20 70  ble to join in p
1d80: 53 72 63 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  Src */.  int iCo
1d90: 6c 4c 65 66 74 2c 20 20 20 20 20 20 20 20 20 20  lLeft,          
1da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1db0: 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 66  x of column in f
1dc0: 69 72 73 74 20 74 61 62 6c 65 20 2a 2f 0a 20 20  irst table */.  
1dd0: 69 6e 74 20 69 52 69 67 68 74 2c 20 20 20 20 20  int iRight,     
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 65 63 6f  /* Index of seco
1e00: 6e 64 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63  nd table in pSrc
1e10: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 52 69   */.  int iColRi
1e20: 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
1e30: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1e40: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 73 65 63 6f  f column in seco
1e50: 6e 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  nd table */.  in
1e60: 74 20 69 73 4f 75 74 65 72 4a 6f 69 6e 2c 20 20  t isOuterJoin,  
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e80: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
1e90: 20 61 6e 20 4f 55 54 45 52 20 6a 6f 69 6e 20 2a   an OUTER join *
1ea0: 2f 0a 20 20 45 78 70 72 20 2a 2a 70 70 57 68 65  /.  Expr **ppWhe
1eb0: 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  re              
1ec0: 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 54      /* IN/OUT: T
1ed0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ee0: 74 6f 20 61 64 64 20 74 6f 20 2a 2f 0a 29 7b 0a  to add to */.){.
1ef0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f00: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
1f10: 70 72 20 2a 70 45 31 3b 0a 20 20 45 78 70 72 20  pr *pE1;.  Expr 
1f20: 2a 70 45 32 3b 0a 20 20 45 78 70 72 20 2a 70 45  *pE2;.  Expr *pE
1f30: 71 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  q;..  assert( iL
1f40: 65 66 74 3c 69 52 69 67 68 74 20 29 3b 0a 20 20  eft<iRight );.  
1f50: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 6e 53  assert( pSrc->nS
1f60: 72 63 3e 69 52 69 67 68 74 20 29 3b 0a 20 20 61  rc>iRight );.  a
1f70: 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b 69  ssert( pSrc->a[i
1f80: 4c 65 66 74 5d 2e 70 54 61 62 20 29 3b 0a 20 20  Left].pTab );.  
1f90: 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 61 5b  assert( pSrc->a[
1fa0: 69 52 69 67 68 74 5d 2e 70 54 61 62 20 29 3b 0a  iRight].pTab );.
1fb0: 0a 20 20 70 45 31 20 3d 20 73 71 6c 69 74 65 33  .  pE1 = sqlite3
1fc0: 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72  CreateColumnExpr
1fd0: 28 64 62 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  (db, pSrc, iLeft
1fe0: 2c 20 69 43 6f 6c 4c 65 66 74 29 3b 0a 20 20 70  , iColLeft);.  p
1ff0: 45 32 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  E2 = sqlite3Crea
2000: 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 64 62 2c  teColumnExpr(db,
2010: 20 70 53 72 63 2c 20 69 52 69 67 68 74 2c 20 69   pSrc, iRight, i
2020: 43 6f 6c 52 69 67 68 74 29 3b 0a 0a 20 20 70 45  ColRight);..  pE
2030: 71 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  q = sqlite3PExpr
2040: 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 51 2c 20  (pParse, TK_EQ, 
2050: 70 45 31 2c 20 70 45 32 2c 20 30 29 3b 0a 20 20  pE1, pE2, 0);.  
2060: 69 66 28 20 70 45 71 20 26 26 20 69 73 4f 75 74  if( pEq && isOut
2070: 65 72 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 45 78  erJoin ){.    Ex
2080: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
2090: 71 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 3b  q, EP_FromJoin);
20a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78  .    assert( !Ex
20b0: 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79  prHasAnyProperty
20c0: 28 70 45 71 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  (pEq, EP_TokenOn
20d0: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
20e0: 3b 0a 20 20 20 20 45 78 70 72 53 65 74 49 72 72  ;.    ExprSetIrr
20f0: 65 64 75 63 69 62 6c 65 28 70 45 71 29 3b 0a 20  educible(pEq);. 
2100: 20 20 20 70 45 71 2d 3e 69 52 69 67 68 74 4a 6f     pEq->iRightJo
2110: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 70  inTable = (i16)p
2120: 45 32 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 7d 0a  E2->iTable;.  }.
2130: 20 20 2a 70 70 57 68 65 72 65 20 3d 20 73 71 6c    *ppWhere = sql
2140: 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c 20  ite3ExprAnd(db, 
2150: 2a 70 70 57 68 65 72 65 2c 20 70 45 71 29 3b 0a  *ppWhere, pEq);.
2160: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
2170: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 20 70 72 6f   EP_FromJoin pro
2180: 70 65 72 74 79 20 6f 6e 20 61 6c 6c 20 74 65 72  perty on all ter
2190: 6d 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ms of the given 
21a0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 41  expression..** A
21b0: 6e 64 20 73 65 74 20 74 68 65 20 45 78 70 72 2e  nd set the Expr.
21c0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20  iRightJoinTable 
21d0: 74 6f 20 69 54 61 62 6c 65 20 66 6f 72 20 65 76  to iTable for ev
21e0: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  ery term in the.
21f0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  ** expression..*
2200: 2a 0a 2a 2a 20 54 68 65 20 45 50 5f 46 72 6f 6d  *.** The EP_From
2210: 4a 6f 69 6e 20 70 72 6f 70 65 72 74 79 20 69 73  Join property is
2220: 20 75 73 65 64 20 6f 6e 20 74 65 72 6d 73 20 6f   used on terms o
2230: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
2240: 74 6f 20 74 65 6c 6c 0a 2a 2a 20 74 68 65 20 4c  to tell.** the L
2250: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 70  EFT OUTER JOIN p
2260: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
2270: 74 68 61 74 20 74 68 69 73 20 74 65 72 6d 20 69  that this term i
2280: 73 20 70 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a  s part of the.**
2290: 20 6a 6f 69 6e 20 72 65 73 74 72 69 63 74 69 6f   join restrictio
22a0: 6e 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  n specified in t
22b0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
22c0: 6c 61 75 73 65 20 61 6e 64 20 6e 6f 74 20 61 20  lause and not a 
22d0: 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6d  part.** of the m
22e0: 6f 72 65 20 67 65 6e 65 72 61 6c 20 57 48 45 52  ore general WHER
22f0: 45 20 63 6c 61 75 73 65 2e 20 20 54 68 65 73 65  E clause.  These
2300: 20 74 65 72 6d 73 20 61 72 65 20 6d 6f 76 65 64   terms are moved
2310: 20 6f 76 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20   over to the.** 
2320: 57 48 45 52 45 20 63 6c 61 75 73 65 20 64 75 72  WHERE clause dur
2330: 69 6e 67 20 6a 6f 69 6e 20 70 72 6f 63 65 73 73  ing join process
2340: 69 6e 67 20 62 75 74 20 77 65 20 6e 65 65 64 20  ing but we need 
2350: 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
2360: 20 74 68 65 79 0a 2a 2a 20 6f 72 69 67 69 6e 61   they.** origina
2370: 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72  ted in the ON or
2380: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a   USING clause..*
2390: 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 52  *.** The Expr.iR
23a0: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 74 65  ightJoinTable te
23b0: 6c 6c 73 20 74 68 65 20 57 48 45 52 45 20 63 6c  lls the WHERE cl
23c0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
23d0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 65 78 70 72  that the.** expr
23e0: 65 73 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f  ession depends o
23f0: 6e 20 74 61 62 6c 65 20 69 52 69 67 68 74 4a 6f  n table iRightJo
2400: 69 6e 54 61 62 6c 65 20 65 76 65 6e 20 69 66 20  inTable even if 
2410: 74 68 61 74 20 74 61 62 6c 65 20 69 73 20 6e 6f  that table is no
2420: 74 0a 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20  t.** explicitly 
2430: 6d 65 6e 74 69 6f 6e 65 64 20 69 6e 20 74 68 65  mentioned in the
2440: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
2450: 61 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  at information i
2460: 73 20 6e 65 65 64 65 64 0a 2a 2a 20 66 6f 72 20  s needed.** for 
2470: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 3a  cases like this:
2480: 0a 2a 2a 0a 2a 2a 20 20 20 20 53 45 4c 45 43 54  .**.**    SELECT
2490: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
24a0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
24b0: 74 32 2e 62 20 41 4e 44 20 74 31 2e 78 3d 35 0a  t2.b AND t1.x=5.
24c0: 2a 2a 0a 2a 2a 20 54 68 65 20 77 68 65 72 65 20  **.** The where 
24d0: 63 6c 61 75 73 65 20 6e 65 65 64 73 20 74 6f 20  clause needs to 
24e0: 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c 69  defer the handli
24f0: 6e 67 20 6f 66 20 74 68 65 20 74 31 2e 78 3d 35  ng of the t1.x=5
2500: 0a 2a 2a 20 74 65 72 6d 20 75 6e 74 69 6c 20 61  .** term until a
2510: 66 74 65 72 20 74 68 65 20 74 32 20 6c 6f 6f 70  fter the t2 loop
2520: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 49   of the join.  I
2530: 6e 20 74 68 61 74 20 77 61 79 2c 20 61 0a 2a 2a  n that way, a.**
2540: 20 4e 55 4c 4c 20 74 32 20 72 6f 77 20 77 69 6c   NULL t2 row wil
2550: 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 77 68  l be inserted wh
2560: 65 6e 65 76 65 72 20 74 31 2e 78 21 3d 35 2e 20  enever t1.x!=5. 
2570: 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a   If we do not.**
2580: 20 64 65 66 65 72 20 74 68 65 20 68 61 6e 64 6c   defer the handl
2590: 69 6e 67 20 6f 66 20 74 31 2e 78 3d 35 2c 20 69  ing of t1.x=5, i
25a0: 74 20 77 69 6c 6c 20 62 65 20 70 72 6f 63 65 73  t will be proces
25b0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  sed immediately.
25c0: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 74 31 20  ** after the t1 
25d0: 6c 6f 6f 70 20 61 6e 64 20 72 6f 77 73 20 77 69  loop and rows wi
25e0: 74 68 20 74 31 2e 78 21 3d 35 20 77 69 6c 6c 20  th t1.x!=5 will 
25f0: 6e 65 76 65 72 20 61 70 70 65 61 72 20 69 6e 0a  never appear in.
2600: 2a 2a 20 74 68 65 20 6f 75 74 70 75 74 2c 20 77  ** the output, w
2610: 68 69 63 68 20 69 73 20 69 6e 63 6f 72 72 65 63  hich is incorrec
2620: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2630: 64 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 45 78  d setJoinExpr(Ex
2640: 70 72 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  pr *p, int iTabl
2650: 65 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  e){.  while( p )
2660: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
2670: 70 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d  perty(p, EP_From
2680: 4a 6f 69 6e 29 3b 0a 20 20 20 20 61 73 73 65 72  Join);.    asser
2690: 74 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  t( !ExprHasAnyPr
26a0: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b  operty(p, EP_Tok
26b0: 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65  enOnly|EP_Reduce
26c0: 64 29 20 29 3b 0a 20 20 20 20 45 78 70 72 53 65  d) );.    ExprSe
26d0: 74 49 72 72 65 64 75 63 69 62 6c 65 28 70 29 3b  tIrreducible(p);
26e0: 0a 20 20 20 20 70 2d 3e 69 52 69 67 68 74 4a 6f  .    p->iRightJo
26f0: 69 6e 54 61 62 6c 65 20 3d 20 28 69 31 36 29 69  inTable = (i16)i
2700: 54 61 62 6c 65 3b 0a 20 20 20 20 73 65 74 4a 6f  Table;.    setJo
2710: 69 6e 45 78 70 72 28 70 2d 3e 70 4c 65 66 74 2c  inExpr(p->pLeft,
2720: 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 20   iTable);.    p 
2730: 3d 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 7d  = p->pRight;.  }
2740: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
2750: 72 6f 75 74 69 6e 65 20 70 72 6f 63 65 73 73 65  routine processe
2760: 73 20 74 68 65 20 6a 6f 69 6e 20 69 6e 66 6f 72  s the join infor
2770: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 53 45 4c  mation for a SEL
2780: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  ECT statement..*
2790: 2a 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  * ON and USING c
27a0: 6c 61 75 73 65 73 20 61 72 65 20 63 6f 6e 76 65  lauses are conve
27b0: 72 74 65 64 20 69 6e 74 6f 20 65 78 74 72 61 20  rted into extra 
27c0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
27d0: 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 4e 41  RE clause..** NA
27e0: 54 55 52 41 4c 20 6a 6f 69 6e 73 20 61 6c 73 6f  TURAL joins also
27f0: 20 63 72 65 61 74 65 20 65 78 74 72 61 20 57 48   create extra WH
2800: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
2810: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
2820: 73 20 6f 66 20 61 20 46 52 4f 4d 20 63 6c 61 75  s of a FROM clau
2830: 73 65 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  se are contained
2840: 20 69 6e 20 74 68 65 20 53 65 6c 65 63 74 2e 70   in the Select.p
2850: 53 72 63 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Src structure..*
2860: 2a 20 54 68 65 20 6c 65 66 74 20 6d 6f 73 74 20  * The left most 
2870: 74 61 62 6c 65 20 69 73 20 74 68 65 20 66 69 72  table is the fir
2880: 73 74 20 65 6e 74 72 79 20 69 6e 20 53 65 6c 65  st entry in Sele
2890: 63 74 2e 70 53 72 63 2e 20 20 54 68 65 20 72 69  ct.pSrc.  The ri
28a0: 67 68 74 2d 6d 6f 73 74 0a 2a 2a 20 74 61 62 6c  ght-most.** tabl
28b0: 65 20 69 73 20 74 68 65 20 6c 61 73 74 20 65 6e  e is the last en
28c0: 74 72 79 2e 20 20 54 68 65 20 6a 6f 69 6e 20 6f  try.  The join o
28d0: 70 65 72 61 74 6f 72 20 69 73 20 68 65 6c 64 20  perator is held 
28e0: 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 6f 0a  in the entry to.
28f0: 2a 2a 20 74 68 65 20 6c 65 66 74 2e 20 20 54 68  ** the left.  Th
2900: 75 73 20 65 6e 74 72 79 20 30 20 63 6f 6e 74 61  us entry 0 conta
2910: 69 6e 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  ins the join ope
2920: 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f  rator for the jo
2930: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 65 6e  in between.** en
2940: 74 72 69 65 73 20 30 20 61 6e 64 20 31 2e 20 20  tries 0 and 1.  
2950: 41 6e 79 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20  Any ON or USING 
2960: 63 6c 61 75 73 65 73 20 61 73 73 6f 63 69 61 74  clauses associat
2970: 65 64 20 77 69 74 68 20 74 68 65 20 6a 6f 69 6e  ed with the join
2980: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 61 74 74   are.** also att
2990: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
29a0: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
29b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
29c0: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
29d0: 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74  f errors encount
29e0: 65 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ered..*/.static 
29f0: 69 6e 74 20 73 71 6c 69 74 65 50 72 6f 63 65 73  int sqliteProces
2a00: 73 4a 6f 69 6e 28 50 61 72 73 65 20 2a 70 50 61  sJoin(Parse *pPa
2a10: 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  rse, Select *p){
2a20: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
2a30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a40: 20 20 20 2f 2a 20 41 6c 6c 20 74 61 62 6c 65 73     /* All tables
2a50: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2a60: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  use */.  int i, 
2a70: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2a90: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 73   counters */.  s
2aa0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2ab0: 65 6d 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 2f  em *pLeft;     /
2ac0: 2a 20 4c 65 66 74 20 74 61 62 6c 65 20 62 65 69  * Left table bei
2ad0: 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 20 20 73  ng joined */.  s
2ae0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2af0: 65 6d 20 2a 70 52 69 67 68 74 3b 20 20 20 20 2f  em *pRight;    /
2b00: 2a 20 52 69 67 68 74 20 74 61 62 6c 65 20 62 65  * Right table be
2b10: 69 6e 67 20 6a 6f 69 6e 65 64 20 2a 2f 0a 0a 20  ing joined */.. 
2b20: 20 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b   pSrc = p->pSrc;
2b30: 0a 20 20 70 4c 65 66 74 20 3d 20 26 70 53 72 63  .  pLeft = &pSrc
2b40: 2d 3e 61 5b 30 5d 3b 0a 20 20 70 52 69 67 68 74  ->a[0];.  pRight
2b50: 20 3d 20 26 70 4c 65 66 74 5b 31 5d 3b 0a 20 20   = &pLeft[1];.  
2b60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d  for(i=0; i<pSrc-
2b70: 3e 6e 53 72 63 2d 31 3b 20 69 2b 2b 2c 20 70 52  >nSrc-1; i++, pR
2b80: 69 67 68 74 2b 2b 2c 20 70 4c 65 66 74 2b 2b 29  ight++, pLeft++)
2b90: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4c 65  {.    Table *pLe
2ba0: 66 74 54 61 62 20 3d 20 70 4c 65 66 74 2d 3e 70  ftTab = pLeft->p
2bb0: 54 61 62 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  Tab;.    Table *
2bc0: 70 52 69 67 68 74 54 61 62 20 3d 20 70 52 69 67  pRightTab = pRig
2bd0: 68 74 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 6e  ht->pTab;.    in
2be0: 74 20 69 73 4f 75 74 65 72 3b 0a 0a 20 20 20 20  t isOuter;..    
2bf0: 69 66 28 20 4e 45 56 45 52 28 70 4c 65 66 74 54  if( NEVER(pLeftT
2c00: 61 62 3d 3d 30 20 7c 7c 20 70 52 69 67 68 74 54  ab==0 || pRightT
2c10: 61 62 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  ab==0) ) continu
2c20: 65 3b 0a 20 20 20 20 69 73 4f 75 74 65 72 20 3d  e;.    isOuter =
2c30: 20 28 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79   (pRight->jointy
2c40: 70 65 20 26 20 4a 54 5f 4f 55 54 45 52 29 21 3d  pe & JT_OUTER)!=
2c50: 30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  0;..    /* When 
2c60: 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65 79 77  the NATURAL keyw
2c70: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ord is present, 
2c80: 61 64 64 20 57 48 45 52 45 20 63 6c 61 75 73 65  add WHERE clause
2c90: 20 74 65 72 6d 73 20 66 6f 72 0a 20 20 20 20 2a   terms for.    *
2ca0: 2a 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 74  * every column t
2cb0: 68 61 74 20 74 68 65 20 74 77 6f 20 74 61 62 6c  hat the two tabl
2cc0: 65 73 20 68 61 76 65 20 69 6e 20 63 6f 6d 6d 6f  es have in commo
2cd0: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
2ce0: 28 20 70 52 69 67 68 74 2d 3e 6a 6f 69 6e 74 79  ( pRight->jointy
2cf0: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
2d00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  ){.      if( pRi
2d10: 67 68 74 2d 3e 70 4f 6e 20 7c 7c 20 70 52 69 67  ght->pOn || pRig
2d20: 68 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20  ht->pUsing ){.  
2d30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2d40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
2d50: 20 4e 41 54 55 52 41 4c 20 6a 6f 69 6e 20 6d 61   NATURAL join ma
2d60: 79 20 6e 6f 74 20 68 61 76 65 20 22 0a 20 20 20  y not have ".   
2d70: 20 20 20 20 20 20 20 20 22 61 6e 20 4f 4e 20 6f          "an ON o
2d80: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 22 2c  r USING clause",
2d90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74   0);.        ret
2da0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
2db0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
2dc0: 70 52 69 67 68 74 54 61 62 2d 3e 6e 43 6f 6c 3b  pRightTab->nCol;
2dd0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2de0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a  har *zName;   /*
2df0: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 75 6d 6e 20   Name of column 
2e00: 69 6e 20 74 68 65 20 72 69 67 68 74 20 74 61 62  in the right tab
2e10: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  le */.        in
2e20: 74 20 69 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20  t iLeft;     /* 
2e30: 4d 61 74 63 68 69 6e 67 20 6c 65 66 74 20 74 61  Matching left ta
2e40: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ble */.        i
2e50: 6e 74 20 69 4c 65 66 74 43 6f 6c 3b 20 20 2f 2a  nt iLeftCol;  /*
2e60: 20 4d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   Matching column
2e70: 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62   in the left tab
2e80: 6c 65 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 7a  le */..        z
2e90: 4e 61 6d 65 20 3d 20 70 52 69 67 68 74 54 61 62  Name = pRightTab
2ea0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ->aCol[j].zName;
2eb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 61 62  .        if( tab
2ec0: 6c 65 41 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78  leAndColumnIndex
2ed0: 28 70 53 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d  (pSrc, i+1, zNam
2ee0: 65 2c 20 26 69 4c 65 66 74 2c 20 26 69 4c 65 66  e, &iLeft, &iLef
2ef0: 74 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  tCol) ){.       
2f00: 20 20 20 61 64 64 57 68 65 72 65 54 65 72 6d 28     addWhereTerm(
2f10: 70 50 61 72 73 65 2c 20 70 53 72 63 2c 20 69 4c  pParse, pSrc, iL
2f20: 65 66 74 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69  eft, iLeftCol, i
2f30: 2b 31 2c 20 6a 2c 0a 20 20 20 20 20 20 20 20 20  +1, j,.         
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2f50: 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57 68 65 72  Outer, &p->pWher
2f60: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2f70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2f80: 20 2f 2a 20 44 69 73 61 6c 6c 6f 77 20 62 6f 74   /* Disallow bot
2f90: 68 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  h ON and USING c
2fa0: 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73 61  lauses in the sa
2fb0: 6d 65 20 6a 6f 69 6e 0a 20 20 20 20 2a 2f 0a 20  me join.    */. 
2fc0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 70     if( pRight->p
2fd0: 4f 6e 20 26 26 20 70 52 69 67 68 74 2d 3e 70 55  On && pRight->pU
2fe0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 73 71  sing ){.      sq
2ff0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3000: 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 68 61  arse, "cannot ha
3010: 76 65 20 62 6f 74 68 20 4f 4e 20 61 6e 64 20 55  ve both ON and U
3020: 53 49 4e 47 20 22 0a 20 20 20 20 20 20 20 20 22  SING ".        "
3030: 63 6c 61 75 73 65 73 20 69 6e 20 74 68 65 20 73  clauses in the s
3040: 61 6d 65 20 6a 6f 69 6e 22 29 3b 0a 20 20 20 20  ame join");.    
3050: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3060: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  }..    /* Add th
3070: 65 20 4f 4e 20 63 6c 61 75 73 65 20 74 6f 20 74  e ON clause to t
3080: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
3090: 45 52 45 20 63 6c 61 75 73 65 2c 20 63 6f 6e 6e  ERE clause, conn
30a0: 65 63 74 65 64 20 62 79 0a 20 20 20 20 2a 2a 20  ected by.    ** 
30b0: 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
30c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
30d0: 70 52 69 67 68 74 2d 3e 70 4f 6e 20 29 7b 0a 20  pRight->pOn ){. 
30e0: 20 20 20 20 20 69 66 28 20 69 73 4f 75 74 65 72       if( isOuter
30f0: 20 29 20 73 65 74 4a 6f 69 6e 45 78 70 72 28 70   ) setJoinExpr(p
3100: 52 69 67 68 74 2d 3e 70 4f 6e 2c 20 70 52 69 67  Right->pOn, pRig
3110: 68 74 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ht->iCursor);.  
3120: 20 20 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20      p->pWhere = 
3130: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70  sqlite3ExprAnd(p
3140: 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 57  Parse->db, p->pW
3150: 68 65 72 65 2c 20 70 52 69 67 68 74 2d 3e 70 4f  here, pRight->pO
3160: 6e 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  n);.      pRight
3170: 2d 3e 70 4f 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->pOn = 0;.    }
3180: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
3190: 65 78 74 72 61 20 74 65 72 6d 73 20 6f 6e 20 74  extra terms on t
31a0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
31b0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
31c0: 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20  named.    ** in 
31d0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
31e0: 2e 20 20 45 78 61 6d 70 6c 65 3a 20 49 66 20 74  .  Example: If t
31f0: 68 65 20 74 77 6f 20 74 61 62 6c 65 73 20 74 6f  he two tables to
3200: 20 62 65 20 6a 6f 69 6e 65 64 20 61 72 65 20 0a   be joined are .
3210: 20 20 20 20 2a 2a 20 41 20 61 6e 64 20 42 20 61      ** A and B a
3220: 6e 64 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  nd the USING cla
3230: 75 73 65 20 6e 61 6d 65 73 20 58 2c 20 59 2c 20  use names X, Y, 
3240: 61 6e 64 20 5a 2c 20 74 68 65 6e 20 61 64 64 20  and Z, then add 
3250: 74 68 69 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74  this.    ** to t
3260: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 3a  he WHERE clause:
3270: 20 20 20 20 41 2e 58 3d 42 2e 58 20 41 4e 44 20      A.X=B.X AND 
3280: 41 2e 59 3d 42 2e 59 20 41 4e 44 20 41 2e 5a 3d  A.Y=B.Y AND A.Z=
3290: 42 2e 5a 0a 20 20 20 20 2a 2a 20 52 65 70 6f 72  B.Z.    ** Repor
32a0: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e  t an error if an
32b0: 79 20 63 6f 6c 75 6d 6e 20 6d 65 6e 74 69 6f 6e  y column mention
32c0: 65 64 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  ed in the USING 
32d0: 63 6c 61 75 73 65 20 69 73 0a 20 20 20 20 2a 2a  clause is.    **
32e0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 65 64 20 69   not contained i
32f0: 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 20 74 6f  n both tables to
3300: 20 62 65 20 6a 6f 69 6e 65 64 2e 0a 20 20 20 20   be joined..    
3310: 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 69 67 68  */.    if( pRigh
3320: 74 2d 3e 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  t->pUsing ){.   
3330: 20 20 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74     IdList *pList
3340: 20 3d 20 70 52 69 67 68 74 2d 3e 70 55 73 69 6e   = pRight->pUsin
3350: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  g;.      for(j=0
3360: 3b 20 6a 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; j<pList->nId; 
3370: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
3380: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f  ar *zName;     /
3390: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 65  * Name of the te
33a0: 72 6d 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  rm in the USING 
33b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20  clause */.      
33c0: 20 20 69 6e 74 20 69 4c 65 66 74 3b 20 20 20 20    int iLeft;    
33d0: 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f 6e 20 74     /* Table on t
33e0: 68 65 20 6c 65 66 74 20 77 69 74 68 20 6d 61 74  he left with mat
33f0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
3400: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  e */.        int
3410: 20 69 4c 65 66 74 43 6f 6c 3b 20 20 20 20 2f 2a   iLeftCol;    /*
3420: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f   Column number o
3430: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
3440: 6e 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f  n on the left */
3450: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 69  .        int iRi
3460: 67 68 74 43 6f 6c 3b 20 20 20 2f 2a 20 43 6f 6c  ghtCol;   /* Col
3470: 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6d 61  umn number of ma
3480: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 6e  tching column on
3490: 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 0a 20   the right */.. 
34a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 70         zName = p
34b0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65  List->a[j].zName
34c0: 3b 0a 20 20 20 20 20 20 20 20 69 52 69 67 68 74  ;.        iRight
34d0: 43 6f 6c 20 3d 20 63 6f 6c 75 6d 6e 49 6e 64 65  Col = columnInde
34e0: 78 28 70 52 69 67 68 74 54 61 62 2c 20 7a 4e 61  x(pRightTab, zNa
34f0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
3500: 20 69 52 69 67 68 74 43 6f 6c 3c 30 0a 20 20 20   iRightCol<0.   
3510: 20 20 20 20 20 20 7c 7c 20 21 74 61 62 6c 65 41        || !tableA
3520: 6e 64 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 70 53  ndColumnIndex(pS
3530: 72 63 2c 20 69 2b 31 2c 20 7a 4e 61 6d 65 2c 20  rc, i+1, zName, 
3540: 26 69 4c 65 66 74 2c 20 26 69 4c 65 66 74 43 6f  &iLeft, &iLeftCo
3550: 6c 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  l).        ){.  
3560: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3570: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3580: 22 63 61 6e 6e 6f 74 20 6a 6f 69 6e 20 75 73 69  "cannot join usi
3590: 6e 67 20 63 6f 6c 75 6d 6e 20 25 73 20 2d 20 63  ng column %s - c
35a0: 6f 6c 75 6d 6e 20 22 0a 20 20 20 20 20 20 20 20  olumn ".        
35b0: 20 20 20 20 22 6e 6f 74 20 70 72 65 73 65 6e 74      "not present
35c0: 20 69 6e 20 62 6f 74 68 20 74 61 62 6c 65 73 22   in both tables"
35d0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
35e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
35f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3600: 61 64 64 57 68 65 72 65 54 65 72 6d 28 70 50 61  addWhereTerm(pPa
3610: 72 73 65 2c 20 70 53 72 63 2c 20 69 4c 65 66 74  rse, pSrc, iLeft
3620: 2c 20 69 4c 65 66 74 43 6f 6c 2c 20 69 2b 31 2c  , iLeftCol, i+1,
3630: 20 69 52 69 67 68 74 43 6f 6c 2c 0a 20 20 20 20   iRightCol,.    
3640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3650: 20 69 73 4f 75 74 65 72 2c 20 26 70 2d 3e 70 57   isOuter, &p->pW
3660: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  here);.      }. 
3670: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3680: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n 0;.}../*.** In
3690: 73 65 72 74 20 63 6f 64 65 20 69 6e 74 6f 20 22  sert code into "
36a0: 76 22 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73  v" that will pus
36b0: 68 20 74 68 65 20 72 65 63 6f 72 64 20 6f 6e 20  h the record on 
36c0: 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 2a  the top of the.*
36d0: 2a 20 73 74 61 63 6b 20 69 6e 74 6f 20 74 68 65  * stack into the
36e0: 20 73 6f 72 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   sorter..*/.stat
36f0: 69 63 20 76 6f 69 64 20 70 75 73 68 4f 6e 74 6f  ic void pushOnto
3700: 53 6f 72 74 65 72 28 0a 20 20 50 61 72 73 65 20  Sorter(.  Parse 
3710: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
3720: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
3730: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3740: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 2f   *pOrderBy,    /
3750: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
3760: 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63  lause */.  Selec
3770: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
3780: 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 53    /* The whole S
3790: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
37a0: 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 61 74 61  */.  int regData
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
37c0: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
37d0: 64 61 74 61 20 74 6f 20 62 65 20 73 6f 72 74 65  data to be sorte
37e0: 64 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a  d */.){.  Vdbe *
37f0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
3800: 65 3b 0a 20 20 69 6e 74 20 6e 45 78 70 72 20 3d  e;.  int nExpr =
3810: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
3820: 3b 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 20  ;.  int regBase 
3830: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
3840: 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 45  Range(pParse, nE
3850: 78 70 72 2b 32 29 3b 0a 20 20 69 6e 74 20 72 65  xpr+2);.  int re
3860: 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
3870: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
3880: 73 65 29 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20  se);.  int op;. 
3890: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
38a0: 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
38b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
38c0: 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
38d0: 2c 20 70 4f 72 64 65 72 42 79 2c 20 72 65 67 42  , pOrderBy, regB
38e0: 61 73 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ase, 0);.  sqlit
38f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
3900: 4f 50 5f 53 65 71 75 65 6e 63 65 2c 20 70 4f 72  OP_Sequence, pOr
3910: 64 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c  derBy->iECursor,
3920: 20 72 65 67 42 61 73 65 2b 6e 45 78 70 72 29 3b   regBase+nExpr);
3930: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
3940: 64 65 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72  deMove(pParse, r
3950: 65 67 44 61 74 61 2c 20 72 65 67 42 61 73 65 2b  egData, regBase+
3960: 6e 45 78 70 72 2b 31 2c 20 31 29 3b 0a 20 20 73  nExpr+1, 1);.  s
3970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
3980: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
3990: 64 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78 70  d, regBase, nExp
39a0: 72 20 2b 20 32 2c 20 72 65 67 52 65 63 6f 72 64  r + 2, regRecord
39b0: 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 65 63 74  );.  if( pSelect
39c0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
39d0: 55 73 65 53 6f 72 74 65 72 20 29 7b 0a 20 20 20  UseSorter ){.   
39e0: 20 6f 70 20 3d 20 4f 50 5f 53 6f 72 74 65 72 49   op = OP_SorterI
39f0: 6e 73 65 72 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nsert;.  }else{.
3a00: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 49 64 78 49      op = OP_IdxI
3a10: 6e 73 65 72 74 3b 0a 20 20 7d 0a 20 20 73 71 6c  nsert;.  }.  sql
3a20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
3a30: 2c 20 6f 70 2c 20 70 4f 72 64 65 72 42 79 2d 3e  , op, pOrderBy->
3a40: 69 45 43 75 72 73 6f 72 2c 20 72 65 67 52 65 63  iECursor, regRec
3a50: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ord);.  sqlite3R
3a60: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
3a70: 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
3a80: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
3a90: 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
3aa0: 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 78  se, regBase, nEx
3ab0: 70 72 2b 32 29 3b 0a 20 20 69 66 28 20 70 53 65  pr+2);.  if( pSe
3ac0: 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a  lect->iLimit ){.
3ad0: 20 20 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61      int addr1, a
3ae0: 64 64 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 4c  ddr2;.    int iL
3af0: 69 6d 69 74 3b 0a 20 20 20 20 69 66 28 20 70 53  imit;.    if( pS
3b00: 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65 74 20 29  elect->iOffset )
3b10: 7b 0a 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d  {.      iLimit =
3b20: 20 70 53 65 6c 65 63 74 2d 3e 69 4f 66 66 73 65   pSelect->iOffse
3b30: 74 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  t+1;.    }else{.
3b40: 20 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 70        iLimit = p
3b50: 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 3b 0a  Select->iLimit;.
3b60: 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 31 20      }.    addr1 
3b70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
3b80: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 5a 65 72 6f  Op1(v, OP_IfZero
3b90: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 73  , iLimit);.    s
3ba0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
3bb0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 69  (v, OP_AddImm, i
3bc0: 4c 69 6d 69 74 2c 20 2d 31 29 3b 0a 20 20 20 20  Limit, -1);.    
3bd0: 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
3be0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
3bf0: 47 6f 74 6f 29 3b 0a 20 20 20 20 73 71 6c 69 74  Goto);.    sqlit
3c00: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
3c10: 2c 20 61 64 64 72 31 29 3b 0a 20 20 20 20 73 71  , addr1);.    sq
3c20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
3c30: 76 2c 20 4f 50 5f 4c 61 73 74 2c 20 70 4f 72 64  v, OP_Last, pOrd
3c40: 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 29 3b  erBy->iECursor);
3c50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
3c60: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 44 65 6c  AddOp1(v, OP_Del
3c70: 65 74 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 69  ete, pOrderBy->i
3c80: 45 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 73 71  ECursor);.    sq
3c90: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
3ca0: 65 28 76 2c 20 61 64 64 72 32 29 3b 0a 20 20 7d  e(v, addr2);.  }
3cb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 63 6f  .}../*.** Add co
3cc0: 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  de to implement 
3cd0: 74 68 65 20 4f 46 46 53 45 54 0a 2a 2f 0a 73 74  the OFFSET.*/.st
3ce0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 4f 66  atic void codeOf
3cf0: 66 73 65 74 28 0a 20 20 56 64 62 65 20 2a 76 2c  fset(.  Vdbe *v,
3d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
3d10: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
3d20: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 53 65 6c  this VM */.  Sel
3d30: 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 2f  ect *p,        /
3d40: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
3d50: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64  tement being cod
3d60: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6e  ed */.  int iCon
3d70: 74 69 6e 75 65 20 20 20 20 20 2f 2a 20 4a 75 6d  tinue     /* Jum
3d80: 70 20 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74  p here to skip t
3d90: 68 65 20 63 75 72 72 65 6e 74 20 72 65 63 6f 72  he current recor
3da0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  d */.){.  if( p-
3db0: 3e 69 4f 66 66 73 65 74 20 26 26 20 69 43 6f 6e  >iOffset && iCon
3dc0: 74 69 6e 75 65 21 3d 30 20 29 7b 0a 20 20 20 20  tinue!=0 ){.    
3dd0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 73 71  int addr;.    sq
3de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
3df0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 70 2d  v, OP_AddImm, p-
3e00: 3e 69 4f 66 66 73 65 74 2c 20 2d 31 29 3b 0a 20  >iOffset, -1);. 
3e10: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
3e20: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
3e30: 50 5f 49 66 4e 65 67 2c 20 70 2d 3e 69 4f 66 66  P_IfNeg, p->iOff
3e40: 73 65 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  set);.    sqlite
3e50: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
3e60: 50 5f 47 6f 74 6f 2c 20 30 2c 20 69 43 6f 6e 74  P_Goto, 0, iCont
3e70: 69 6e 75 65 29 3b 0a 20 20 20 20 56 64 62 65 43  inue);.    VdbeC
3e80: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 73 6b 69 70  omment((v, "skip
3e90: 20 4f 46 46 53 45 54 20 72 65 63 6f 72 64 73 22   OFFSET records"
3ea0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
3eb0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
3ec0: 64 64 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ddr);.  }.}../*.
3ed0: 2a 2a 20 41 64 64 20 63 6f 64 65 20 74 68 61 74  ** Add code that
3ee0: 20 77 69 6c 6c 20 63 68 65 63 6b 20 74 6f 20 6d   will check to m
3ef0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 4e 20 72  ake sure the N r
3f00: 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
3f10: 67 20 61 74 20 69 4d 65 6d 0a 2a 2a 20 66 6f 72  g at iMem.** for
3f20: 6d 20 61 20 64 69 73 74 69 6e 63 74 20 65 6e 74  m a distinct ent
3f30: 72 79 2e 20 20 69 54 61 62 20 69 73 20 61 20 73  ry.  iTab is a s
3f40: 6f 72 74 69 6e 67 20 69 6e 64 65 78 20 74 68 61  orting index tha
3f50: 74 20 68 6f 6c 64 73 20 70 72 65 76 69 6f 75 73  t holds previous
3f60: 6c 79 0a 2a 2a 20 73 65 65 6e 20 63 6f 6d 62 69  ly.** seen combi
3f70: 6e 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4e  nations of the N
3f80: 20 76 61 6c 75 65 73 2e 20 20 41 20 6e 65 77 20   values.  A new 
3f90: 65 6e 74 72 79 20 69 73 20 6d 61 64 65 20 69 6e  entry is made in
3fa0: 20 69 54 61 62 0a 2a 2a 20 69 66 20 74 68 65 20   iTab.** if the 
3fb0: 63 75 72 72 65 6e 74 20 4e 20 76 61 6c 75 65 73  current N values
3fc0: 20 61 72 65 20 6e 65 77 2e 0a 2a 2a 0a 2a 2a 20   are new..**.** 
3fd0: 41 20 6a 75 6d 70 20 74 6f 20 61 64 64 72 52 65  A jump to addrRe
3fe0: 70 65 61 74 20 69 73 20 6d 61 64 65 20 61 6e 64  peat is made and
3ff0: 20 74 68 65 20 4e 2b 31 20 76 61 6c 75 65 73 20   the N+1 values 
4000: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
4010: 74 68 65 0a 2a 2a 20 73 74 61 63 6b 20 69 66 20  the.** stack if 
4020: 74 68 65 20 74 6f 70 20 4e 20 65 6c 65 6d 65 6e  the top N elemen
4030: 74 73 20 61 72 65 20 6e 6f 74 20 64 69 73 74 69  ts are not disti
4040: 6e 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nct..*/.static v
4050: 6f 69 64 20 63 6f 64 65 44 69 73 74 69 6e 63 74  oid codeDistinct
4060: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4070: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
4080: 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
4090: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
40a0: 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20  .  int iTab,    
40b0: 20 20 20 20 20 20 2f 2a 20 41 20 73 6f 72 74 69        /* A sorti
40c0: 6e 67 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f  ng index used to
40d0: 20 74 65 73 74 20 66 6f 72 20 64 69 73 74 69 6e   test for distin
40e0: 63 74 6e 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20  ctness */.  int 
40f0: 61 64 64 72 52 65 70 65 61 74 2c 20 20 20 20 2f  addrRepeat,    /
4100: 2a 20 4a 75 6d 70 20 74 6f 20 68 65 72 65 20 69  * Jump to here i
4110: 66 20 6e 6f 74 20 64 69 73 74 69 6e 63 74 20 2a  f not distinct *
4120: 2f 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20  /.  int N,      
4130: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4140: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   of elements */.
4150: 20 20 69 6e 74 20 69 4d 65 6d 20 20 20 20 20 20    int iMem      
4160: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 65 6c       /* First el
4170: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 56 64  ement */.){.  Vd
4180: 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 72 31 3b  be *v;.  int r1;
4190: 0a 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ..  v = pParse->
41a0: 70 56 64 62 65 3b 0a 20 20 72 31 20 3d 20 73 71  pVdbe;.  r1 = sq
41b0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
41c0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
41d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
41e0: 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 69 54 61  v, OP_Found, iTa
41f0: 62 2c 20 61 64 64 72 52 65 70 65 61 74 2c 20 69  b, addrRepeat, i
4200: 4d 65 6d 2c 20 4e 29 3b 0a 20 20 73 71 6c 69 74  Mem, N);.  sqlit
4210: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
4220: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 69  OP_MakeRecord, i
4230: 4d 65 6d 2c 20 4e 2c 20 72 31 29 3b 0a 20 20 73  Mem, N, r1);.  s
4240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
4250: 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74  (v, OP_IdxInsert
4260: 2c 20 69 54 61 62 2c 20 72 31 29 3b 0a 20 20 73  , iTab, r1);.  s
4270: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
4280: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
4290: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
42a0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
42b0: 59 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  Y./*.** Generate
42c0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
42d0: 65 20 77 68 65 6e 20 61 20 53 45 4c 45 43 54 20  e when a SELECT 
42e0: 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  is used within a
42f0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a   subexpression.*
4300: 2a 20 28 65 78 61 6d 70 6c 65 3a 20 20 22 61 20  * (example:  "a 
4310: 49 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN (SELECT * FRO
4320: 4d 20 74 61 62 6c 65 29 22 29 20 62 75 74 20 69  M table)") but i
4330: 74 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  t has more than 
4340: 31 20 72 65 73 75 6c 74 0a 2a 2a 20 63 6f 6c 75  1 result.** colu
4350: 6d 6e 2e 20 20 57 65 20 64 6f 20 74 68 69 73 20  mn.  We do this 
4360: 69 6e 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  in a subroutine 
4370: 62 65 63 61 75 73 65 20 74 68 65 20 65 72 72 6f  because the erro
4380: 72 20 75 73 65 64 20 74 6f 20 6f 63 63 75 72 0a  r used to occur.
4390: 2a 2a 20 69 6e 20 6d 75 6c 74 69 70 6c 65 20 70  ** in multiple p
43a0: 6c 61 63 65 73 2e 20 20 28 54 68 65 20 65 72 72  laces.  (The err
43b0: 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69  or only occurs i
43c0: 6e 20 6f 6e 65 20 70 6c 61 63 65 20 6e 6f 77 2c  n one place now,
43d0: 20 62 75 74 20 77 65 0a 2a 2a 20 72 65 74 61 69   but we.** retai
43e0: 6e 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65  n the subroutine
43f0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 63 6f 64   to minimize cod
4400: 65 20 64 69 73 72 75 70 74 69 6f 6e 2e 29 0a 2a  e disruption.).*
4410: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65  /.static int che
4420: 63 6b 46 6f 72 4d 75 6c 74 69 43 6f 6c 75 6d 6e  ckForMultiColumn
4430: 53 65 6c 65 63 74 45 72 72 6f 72 28 0a 20 20 50  SelectError(.  P
4440: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4450: 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e      /* Parse con
4460: 74 65 78 74 2e 20 2a 2f 0a 20 20 53 65 6c 65 63  text. */.  Selec
4470: 74 44 65 73 74 20 2a 70 44 65 73 74 2c 20 20 20  tDest *pDest,   
4480: 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 6f  /* Destination o
4490: 66 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  f SELECT results
44a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 70 72 20   */.  int nExpr 
44b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
44c0: 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63  mber of result c
44d0: 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
44e0: 62 79 20 53 45 4c 45 43 54 20 2a 2f 0a 29 7b 0a  by SELECT */.){.
44f0: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
4500: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 66  est->eDest;.  if
4510: 28 20 6e 45 78 70 72 3e 31 20 26 26 20 28 65 44  ( nExpr>1 && (eD
4520: 65 73 74 3d 3d 53 52 54 5f 4d 65 6d 20 7c 7c 20  est==SRT_Mem || 
4530: 65 44 65 73 74 3d 3d 53 52 54 5f 53 65 74 29 20  eDest==SRT_Set) 
4540: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4550: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
4560: 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 72 65  only a single re
4570: 73 75 6c 74 20 61 6c 6c 6f 77 65 64 20 66 6f 72  sult allowed for
4580: 20 22 0a 20 20 20 20 20 20 20 22 61 20 53 45 4c   ".       "a SEL
4590: 45 43 54 20 74 68 61 74 20 69 73 20 70 61 72 74  ECT that is part
45a0: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
45b0: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
45c0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
45d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
45e0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e  #endif../*.** An
45f0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4600: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 62 6a 65 63   following objec
4610: 74 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 63  t is used to rec
4620: 6f 72 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ord information 
4630: 61 62 6f 75 74 0a 2a 2a 20 68 6f 77 20 74 6f 20  about.** how to 
4640: 70 72 6f 63 65 73 73 20 74 68 65 20 44 49 53 54  process the DIST
4650: 49 4e 43 54 20 6b 65 79 77 6f 72 64 2c 20 74 6f  INCT keyword, to
4660: 20 73 69 6d 70 6c 69 66 79 20 70 61 73 73 69 6e   simplify passin
4670: 67 20 74 68 61 74 20 69 6e 66 6f 72 6d 61 74 69  g that informati
4680: 6f 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 73  on.** into the s
4690: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 29  electInnerLoop()
46a0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70   routine..*/.typ
46b0: 65 64 65 66 20 73 74 72 75 63 74 20 44 69 73 74  edef struct Dist
46c0: 69 6e 63 74 43 74 78 20 44 69 73 74 69 6e 63 74  inctCtx Distinct
46d0: 43 74 78 3b 0a 73 74 72 75 63 74 20 44 69 73 74  Ctx;.struct Dist
46e0: 69 6e 63 74 43 74 78 20 7b 0a 20 20 75 38 20 69  inctCtx {.  u8 i
46f0: 73 54 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20 54  sTnct;      /* T
4700: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
4710: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70  NCT keyword is p
4720: 72 65 73 65 6e 74 20 2a 2f 0a 20 20 75 38 20 65  resent */.  u8 e
4730: 54 6e 63 74 54 79 70 65 3b 20 20 20 2f 2a 20 4f  TnctType;   /* O
4740: 6e 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f  ne of the WHERE_
4750: 44 49 53 54 49 4e 43 54 5f 2a 20 6f 70 65 72 61  DISTINCT_* opera
4760: 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61  tors */.  int ta
4770: 62 54 6e 63 74 3b 20 20 20 20 2f 2a 20 45 70 68  bTnct;    /* Eph
4780: 65 6d 65 72 61 6c 20 74 61 62 6c 65 20 75 73 65  emeral table use
4790: 64 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70  d for DISTINCT p
47a0: 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69  rocessing */.  i
47b0: 6e 74 20 61 64 64 72 54 6e 63 74 3b 20 20 20 2f  nt addrTnct;   /
47c0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
47d0: 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 6f 70  OpenEphemeral op
47e0: 63 6f 64 65 20 66 6f 72 20 74 61 62 54 6e 63 74  code for tabTnct
47f0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
4800: 69 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72  is routine gener
4810: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 66 6f  ates the code fo
4820: 72 20 74 68 65 20 69 6e 73 69 64 65 20 6f 66 20  r the inside of 
4830: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
4840: 2a 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 0a 2a  * of a SELECT..*
4850: 2a 0a 2a 2a 20 49 66 20 73 72 63 54 61 62 20 61  *.** If srcTab a
4860: 6e 64 20 6e 43 6f 6c 75 6d 6e 20 61 72 65 20 62  nd nColumn are b
4870: 6f 74 68 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  oth zero, then t
4880: 68 65 20 70 45 4c 69 73 74 20 65 78 70 72 65 73  he pEList expres
4890: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 65 76 61  sions.** are eva
48a0: 6c 75 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  luated in order 
48b0: 74 6f 20 67 65 74 20 74 68 65 20 64 61 74 61 20  to get the data 
48c0: 66 6f 72 20 74 68 69 73 20 72 6f 77 2e 20 20 49  for this row.  I
48d0: 66 20 6e 43 6f 6c 75 6d 6e 3e 30 0a 2a 2a 20 74  f nColumn>0.** t
48e0: 68 65 6e 20 64 61 74 61 20 69 73 20 70 75 6c 6c  hen data is pull
48f0: 65 64 20 66 72 6f 6d 20 73 72 63 54 61 62 20 61  ed from srcTab a
4900: 6e 64 20 70 45 4c 69 73 74 20 69 73 20 75 73 65  nd pEList is use
4910: 64 20 6f 6e 6c 79 20 74 6f 20 67 65 74 20 74 68  d only to get th
4920: 65 0a 2a 2a 20 64 61 74 61 74 79 70 65 73 20 66  e.** datatypes f
4930: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 2e 0a  or each column..
4940: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
4950: 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 0a  electInnerLoop(.
4960: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4980: 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20   parser context 
4990: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20  */.  Select *p, 
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49b0: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 6c  The complete sel
49c0: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ect statement be
49d0: 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20 45  ing coded */.  E
49e0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
49f0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
4a00: 66 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 65  f values being e
4a10: 78 74 72 61 63 74 65 64 20 2a 2f 0a 20 20 69 6e  xtracted */.  in
4a20: 74 20 73 72 63 54 61 62 2c 20 20 20 20 20 20 20  t srcTab,       
4a30: 20 20 20 20 20 20 2f 2a 20 50 75 6c 6c 20 64 61        /* Pull da
4a40: 74 61 20 66 72 6f 6d 20 74 68 69 73 20 74 61 62  ta from this tab
4a50: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  le */.  int nCol
4a60: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
4a70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
4a80: 75 6d 6e 73 20 69 6e 20 74 68 65 20 73 6f 75 72  umns in the sour
4a90: 63 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  ce table */.  Ex
4aa0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
4ab0: 2c 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74 20  ,     /* If not 
4ac0: 4e 55 4c 4c 2c 20 73 6f 72 74 20 72 65 73 75 6c  NULL, sort resul
4ad0: 74 73 20 75 73 69 6e 67 20 74 68 69 73 20 6b 65  ts using this ke
4ae0: 79 20 2a 2f 0a 20 20 44 69 73 74 69 6e 63 74 43  y */.  DistinctC
4af0: 74 78 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 2f  tx *pDistinct, /
4b00: 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  * If not NULL, i
4b10: 6e 66 6f 20 6f 6e 20 68 6f 77 20 74 6f 20 70 72  nfo on how to pr
4b20: 6f 63 65 73 73 20 44 49 53 54 49 4e 43 54 20 2a  ocess DISTINCT *
4b30: 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a  /.  SelectDest *
4b40: 70 44 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 48  pDest,      /* H
4b50: 6f 77 20 74 6f 20 64 69 73 70 6f 73 65 20 6f 66  ow to dispose of
4b60: 20 74 68 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a   the results */.
4b70: 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65 2c    int iContinue,
4b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4b90: 70 20 68 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e  p here to contin
4ba0: 75 65 20 77 69 74 68 20 6e 65 78 74 20 72 6f 77  ue with next row
4bb0: 20 2a 2f 0a 20 20 69 6e 74 20 69 42 72 65 61 6b   */.  int iBreak
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4bd0: 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72   Jump here to br
4be0: 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 69  eak out of the i
4bf0: 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a  nner loop */.){.
4c00: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
4c10: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
4c20: 20 69 3b 0a 20 20 69 6e 74 20 68 61 73 44 69 73   i;.  int hasDis
4c30: 74 69 6e 63 74 3b 20 20 20 20 20 20 20 20 2f 2a  tinct;        /*
4c40: 20 54 72 75 65 20 69 66 20 74 68 65 20 44 49 53   True if the DIS
4c50: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
4c60: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e   present */.  in
4c70: 74 20 72 65 67 52 65 73 75 6c 74 3b 20 20 20 20  t regResult;    
4c80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
4c90: 72 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 6f 6c  rt of memory hol
4ca0: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 20  ding result set 
4cb0: 2a 2f 0a 20 20 69 6e 74 20 65 44 65 73 74 20 3d  */.  int eDest =
4cc0: 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3b 20 20   pDest->eDest;  
4cd0: 20 2f 2a 20 48 6f 77 20 74 6f 20 64 69 73 70 6f   /* How to dispo
4ce0: 73 65 20 6f 66 20 72 65 73 75 6c 74 73 20 2a 2f  se of results */
4cf0: 0a 20 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70  .  int iParm = p
4d00: 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 3b 20 2f  Dest->iSDParm; /
4d10: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
4d20: 20 74 6f 20 64 69 73 70 6f 73 61 6c 20 6d 65 74   to disposal met
4d30: 68 6f 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  hod */.  int nRe
4d40: 73 75 6c 74 43 6f 6c 3b 20 20 20 20 20 20 20 20  sultCol;        
4d50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4d60: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
4d70: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 76   */..  assert( v
4d80: 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
4d90: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  v==0) ) return;.
4da0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
4db0: 21 3d 30 20 29 3b 0a 20 20 68 61 73 44 69 73 74  !=0 );.  hasDist
4dc0: 69 6e 63 74 20 3d 20 70 44 69 73 74 69 6e 63 74  inct = pDistinct
4dd0: 20 3f 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54   ? pDistinct->eT
4de0: 6e 63 74 54 79 70 65 20 3a 20 57 48 45 52 45 5f  nctType : WHERE_
4df0: 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 3b 0a 20  DISTINCT_NOOP;. 
4e00: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
4e10: 20 26 26 20 21 68 61 73 44 69 73 74 69 6e 63 74   && !hasDistinct
4e20: 20 29 7b 0a 20 20 20 20 63 6f 64 65 4f 66 66 73   ){.    codeOffs
4e30: 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69 6e  et(v, p, iContin
4e40: 75 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  ue);.  }..  /* P
4e50: 75 6c 6c 20 74 68 65 20 72 65 71 75 65 73 74 65  ull the requeste
4e60: 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 2a 2f 0a  d columns..  */.
4e70: 20 20 69 66 28 20 6e 43 6f 6c 75 6d 6e 3e 30 20    if( nColumn>0 
4e80: 29 7b 0a 20 20 20 20 6e 52 65 73 75 6c 74 43 6f  ){.    nResultCo
4e90: 6c 20 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 7d  l = nColumn;.  }
4ea0: 65 6c 73 65 7b 0a 20 20 20 20 6e 52 65 73 75 6c  else{.    nResul
4eb0: 74 43 6f 6c 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  tCol = pEList->n
4ec0: 45 78 70 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Expr;.  }.  if( 
4ed0: 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d 30 20  pDest->iSdst==0 
4ee0: 29 7b 0a 20 20 20 20 70 44 65 73 74 2d 3e 69 53  ){.    pDest->iS
4ef0: 64 73 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  dst = pParse->nM
4f00: 65 6d 2b 31 3b 0a 20 20 20 20 70 44 65 73 74 2d  em+1;.    pDest-
4f10: 3e 6e 53 64 73 74 20 3d 20 6e 52 65 73 75 6c 74  >nSdst = nResult
4f20: 43 6f 6c 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  Col;.    pParse-
4f30: 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 73 75 6c 74  >nMem += nResult
4f40: 43 6f 6c 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  Col;.  }else{ . 
4f50: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74     assert( pDest
4f60: 2d 3e 6e 53 64 73 74 3d 3d 6e 52 65 73 75 6c 74  ->nSdst==nResult
4f70: 43 6f 6c 20 29 3b 0a 20 20 7d 0a 20 20 72 65 67  Col );.  }.  reg
4f80: 52 65 73 75 6c 74 20 3d 20 70 44 65 73 74 2d 3e  Result = pDest->
4f90: 69 53 64 73 74 3b 0a 20 20 69 66 28 20 6e 43 6f  iSdst;.  if( nCo
4fa0: 6c 75 6d 6e 3e 30 20 29 7b 0a 20 20 20 20 66 6f  lumn>0 ){.    fo
4fb0: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 75 6d 6e  r(i=0; i<nColumn
4fc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
4fd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
4fe0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 72  v, OP_Column, sr
4ff0: 63 54 61 62 2c 20 69 2c 20 72 65 67 52 65 73 75  cTab, i, regResu
5000: 6c 74 2b 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lt+i);.    }.  }
5010: 65 6c 73 65 20 69 66 28 20 65 44 65 73 74 21 3d  else if( eDest!=
5020: 53 52 54 5f 45 78 69 73 74 73 20 29 7b 0a 20 20  SRT_Exists ){.  
5030: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 65 73 74    /* If the dest
5040: 69 6e 61 74 69 6f 6e 20 69 73 20 61 6e 20 45 58  ination is an EX
5050: 49 53 54 53 28 2e 2e 2e 29 20 65 78 70 72 65 73  ISTS(...) expres
5060: 73 69 6f 6e 2c 20 74 68 65 20 61 63 74 75 61 6c  sion, the actual
5070: 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 72  .    ** values r
5080: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
5090: 45 4c 45 43 54 20 61 72 65 20 6e 6f 74 20 72 65  ELECT are not re
50a0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
50b0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
50c0: 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
50d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
50e0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
50f0: 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 72 65  arse, pEList, re
5100: 67 52 65 73 75 6c 74 2c 20 65 44 65 73 74 3d 3d  gResult, eDest==
5110: 53 52 54 5f 4f 75 74 70 75 74 29 3b 0a 20 20 7d  SRT_Output);.  }
5120: 0a 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 52 65  .  nColumn = nRe
5130: 73 75 6c 74 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 49  sultCol;..  /* I
5140: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
5150: 65 79 77 6f 72 64 20 77 61 73 20 70 72 65 73 65  eyword was prese
5160: 6e 74 20 6f 6e 20 74 68 65 20 53 45 4c 45 43 54  nt on the SELECT
5170: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
5180: 61 6e 64 20 74 68 69 73 20 72 6f 77 20 68 61 73  and this row has
5190: 20 62 65 65 6e 20 73 65 65 6e 20 62 65 66 6f 72   been seen befor
51a0: 65 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 6d  e, then do not m
51b0: 61 6b 65 20 74 68 69 73 20 72 6f 77 0a 20 20 2a  ake this row.  *
51c0: 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 72 65  * part of the re
51d0: 73 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sult..  */.  if(
51e0: 20 68 61 73 44 69 73 74 69 6e 63 74 20 29 7b 0a   hasDistinct ){.
51f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
5200: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  st!=0 );.    ass
5210: 65 72 74 28 20 70 45 4c 69 73 74 2d 3e 6e 45 78  ert( pEList->nEx
5220: 70 72 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  pr==nColumn );. 
5230: 20 20 20 73 77 69 74 63 68 28 20 70 44 69 73 74     switch( pDist
5240: 69 6e 63 74 2d 3e 65 54 6e 63 74 54 79 70 65 20  inct->eTnctType 
5250: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57 48  ){.      case WH
5260: 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
5270: 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
5280: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 20 20 20 20  VdbeOp *pOp;    
5290: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6c 6f          /* No lo
52a0: 6e 67 65 72 20 72 65 71 75 69 72 65 64 20 4f 70  nger required Op
52b0: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
52c0: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  r. */.        in
52d0: 74 20 69 4a 75 6d 70 3b 20 20 20 20 20 20 20 20  t iJump;        
52e0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 64 65        /* Jump de
52f0: 73 74 69 6e 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  stination */.   
5300: 20 20 20 20 20 69 6e 74 20 72 65 67 50 72 65 76       int regPrev
5310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
5320: 50 72 65 76 69 6f 75 73 20 72 6f 77 20 63 6f 6e  Previous row con
5330: 74 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 20  tent */..       
5340: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
5350: 63 65 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ce for the previ
5360: 6f 75 73 20 72 6f 77 20 2a 2f 0a 20 20 20 20 20  ous row */.     
5370: 20 20 20 72 65 67 50 72 65 76 20 3d 20 70 50 61     regPrev = pPa
5380: 72 73 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20  rse->nMem+1;.   
5390: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65       pParse->nMe
53a0: 6d 20 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20  m += nColumn;.. 
53b0: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
53c0: 20 74 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   the OP_OpenEphe
53d0: 6d 65 72 61 6c 20 63 6f 64 65 64 20 65 61 72 6c  meral coded earl
53e0: 69 65 72 20 74 6f 20 61 6e 20 4f 50 5f 4e 75 6c  ier to an OP_Nul
53f0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 74  l.        ** set
5400: 73 20 74 68 65 20 4d 45 4d 5f 43 6c 65 61 72 65  s the MEM_Cleare
5410: 64 20 62 69 74 20 6f 6e 20 74 68 65 20 66 69 72  d bit on the fir
5420: 73 74 20 72 65 67 69 73 74 65 72 20 6f 66 20 74  st register of t
5430: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  he.        ** pr
5440: 65 76 69 6f 75 73 20 76 61 6c 75 65 2e 20 20 54  evious value.  T
5450: 68 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74  his will cause t
5460: 68 65 20 4f 50 5f 4e 65 20 62 65 6c 6f 77 20 74  he OP_Ne below t
5470: 6f 20 61 6c 77 61 79 73 0a 20 20 20 20 20 20 20  o always.       
5480: 20 2a 2a 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   ** fail on the 
5490: 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
54a0: 6f 66 20 74 68 65 20 6c 6f 6f 70 20 65 76 65 6e  of the loop even
54b0: 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
54c0: 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 69 73 20        ** row is 
54d0: 61 6c 6c 20 4e 55 4c 4c 73 2e 0a 20 20 20 20 20  all NULLs..     
54e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71     */.        sq
54f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
5500: 6f 4e 6f 6f 70 28 76 2c 20 70 44 69 73 74 69 6e  oNoop(v, pDistin
5510: 63 74 2d 3e 61 64 64 72 54 6e 63 74 29 3b 0a 20  ct->addrTnct);. 
5520: 20 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c         pOp = sql
5530: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
5540: 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64 72   pDistinct->addr
5550: 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20 70  Tnct);.        p
5560: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
5570: 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 4f  Null;.        pO
5580: 70 2d 3e 70 31 20 3d 20 31 3b 0a 20 20 20 20 20  p->p1 = 1;.     
5590: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 72 65 67     pOp->p2 = reg
55a0: 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 20 20 69  Prev;..        i
55b0: 4a 75 6d 70 20 3d 20 73 71 6c 69 74 65 33 56 64  Jump = sqlite3Vd
55c0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
55d0: 20 2b 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20   + nColumn;.    
55e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
55f0: 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
5600: 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20          CollSeq 
5610: 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  *pColl = sqlite3
5620: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
5630: 73 65 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  se, pEList->a[i]
5640: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
5650: 20 20 20 69 66 28 20 69 3c 6e 43 6f 6c 75 6d 6e     if( i<nColumn
5660: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
5670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
5680: 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 72 65  Op3(v, OP_Ne, re
5690: 67 52 65 73 75 6c 74 2b 69 2c 20 69 4a 75 6d 70  gResult+i, iJump
56a0: 2c 20 72 65 67 50 72 65 76 2b 69 29 3b 0a 20 20  , regPrev+i);.  
56b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
56c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
56d0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
56e0: 4f 50 5f 45 71 2c 20 72 65 67 52 65 73 75 6c 74  OP_Eq, regResult
56f0: 2b 69 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 72  +i, iContinue, r
5700: 65 67 50 72 65 76 2b 69 29 3b 0a 20 20 20 20 20  egPrev+i);.     
5710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5720: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5730: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 6f 6e  geP4(v, -1, (con
5740: 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  st char *)pColl,
5750: 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P4_COLLSEQ);.  
5760: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5770: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
5780: 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20  QLITE_NULLEQ);. 
5790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
57a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
57b0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
57c0: 76 29 3d 3d 69 4a 75 6d 70 20 29 3b 0a 20 20 20  v)==iJump );.   
57d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
57e0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 70  AddOp3(v, OP_Cop
57f0: 79 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 72 65  y, regResult, re
5800: 67 50 72 65 76 2c 20 6e 43 6f 6c 75 6d 6e 2d 31  gPrev, nColumn-1
5810: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5820: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
5830: 20 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54   case WHERE_DIST
5840: 49 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20  INCT_UNIQUE: {. 
5850: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
5860: 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 76  beChangeToNoop(v
5870: 2c 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 64 64  , pDistinct->add
5880: 72 54 6e 63 74 29 3b 0a 20 20 20 20 20 20 20 20  rTnct);.        
5890: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
58a0: 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b        default: {
58b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
58c0: 20 70 44 69 73 74 69 6e 63 74 2d 3e 65 54 6e 63   pDistinct->eTnc
58d0: 74 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53  tType==WHERE_DIS
58e0: 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20  TINCT_UNORDERED 
58f0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 44  );.        codeD
5900: 69 73 74 69 6e 63 74 28 70 50 61 72 73 65 2c 20  istinct(pParse, 
5910: 70 44 69 73 74 69 6e 63 74 2d 3e 74 61 62 54 6e  pDistinct->tabTn
5920: 63 74 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6e  ct, iContinue, n
5930: 43 6f 6c 75 6d 6e 2c 20 72 65 67 52 65 73 75 6c  Column, regResul
5940: 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  t);.        brea
5950: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5960: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
5970: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f  y==0 ){.      co
5980: 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 69  deOffset(v, p, i
5990: 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20 7d  Continue);.    }
59a0: 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20  .  }..  switch( 
59b0: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20  eDest ){.    /* 
59c0: 49 6e 20 74 68 69 73 20 6d 6f 64 65 2c 20 77 72  In this mode, wr
59d0: 69 74 65 20 65 61 63 68 20 71 75 65 72 79 20 72  ite each query r
59e0: 65 73 75 6c 74 20 74 6f 20 74 68 65 20 6b 65 79  esult to the key
59f0: 20 6f 66 20 74 68 65 20 74 65 6d 70 6f 72 61 72   of the temporar
5a00: 79 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 69  y.    ** table i
5a10: 50 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  Parm..    */.#if
5a20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5a30: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
5a40: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 55 6e  .    case SRT_Un
5a50: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ion: {.      int
5a60: 20 72 31 3b 0a 20 20 20 20 20 20 72 31 20 3d 20   r1;.      r1 = 
5a70: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
5a80: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
5a90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5aa0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
5ab0: 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74 2c 20  ord, regResult, 
5ac0: 6e 43 6f 6c 75 6d 6e 2c 20 72 31 29 3b 0a 20 20  nColumn, r1);.  
5ad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
5ae0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
5af0: 6e 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31  nsert, iParm, r1
5b00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5b10: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5b20: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5b40: 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74      /* Construct
5b50: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
5b60: 68 65 20 71 75 65 72 79 20 72 65 73 75 6c 74 2c  he query result,
5b70: 20 62 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a   but instead of.
5b80: 20 20 20 20 2a 2a 20 73 61 76 69 6e 67 20 74 68      ** saving th
5b90: 61 74 20 72 65 63 6f 72 64 2c 20 75 73 65 20 69  at record, use i
5ba0: 74 20 61 73 20 61 20 6b 65 79 20 74 6f 20 64 65  t as a key to de
5bb0: 6c 65 74 65 20 65 6c 65 6d 65 6e 74 73 20 66 72  lete elements fr
5bc0: 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 65  om.    ** the te
5bd0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 50  mporary table iP
5be0: 61 72 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  arm..    */.    
5bf0: 63 61 73 65 20 53 52 54 5f 45 78 63 65 70 74 3a  case SRT_Except:
5c00: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
5c10: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
5c20: 5f 49 64 78 44 65 6c 65 74 65 2c 20 69 50 61 72  _IdxDelete, iPar
5c30: 6d 2c 20 72 65 67 52 65 73 75 6c 74 2c 20 6e 43  m, regResult, nC
5c40: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 62 72  olumn);.      br
5c50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5c60: 66 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  f..    /* Store 
5c70: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 64 61  the result as da
5c80: 74 61 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75  ta using a uniqu
5c90: 65 20 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  e key..    */.  
5ca0: 20 20 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65    case SRT_Table
5cb0: 3a 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 45  :.    case SRT_E
5cc0: 70 68 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20  phemTab: {.     
5cd0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
5ce0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
5cf0: 73 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  se);.      testc
5d00: 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f  ase( eDest==SRT_
5d10: 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74  Table );.      t
5d20: 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d 3d  estcase( eDest==
5d30: 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b 0a  SRT_EphemTab );.
5d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5d50: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 61  eAddOp3(v, OP_Ma
5d60: 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 52 65 73  keRecord, regRes
5d70: 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 72 31  ult, nColumn, r1
5d80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  );.      if( pOr
5d90: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20  derBy ){.       
5da0: 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28   pushOntoSorter(
5db0: 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
5dc0: 2c 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  , p, r1);.      
5dd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
5de0: 6e 74 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47  nt r2 = sqlite3G
5df0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
5e00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
5e10: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
5e20: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 69 50 61  OP_NewRowid, iPa
5e30: 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 20  rm, r2);.       
5e40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
5e50: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
5e60: 20 69 50 61 72 6d 2c 20 72 31 2c 20 72 32 29 3b   iParm, r1, r2);
5e70: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5e80: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
5e90: 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a  OPFLAG_APPEND);.
5ea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
5eb0: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
5ec0: 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20  arse, r2);.     
5ed0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5ee0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
5ef0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
5f00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
5f10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
5f20: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
5f30: 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 63 72   /* If we are cr
5f40: 65 61 74 69 6e 67 20 61 20 73 65 74 20 66 6f 72  eating a set for
5f50: 20 61 6e 20 22 65 78 70 72 20 49 4e 20 28 53 45   an "expr IN (SE
5f60: 4c 45 43 54 20 2e 2e 2e 29 22 20 63 6f 6e 73 74  LECT ...)" const
5f70: 72 75 63 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  ruct,.    ** the
5f80: 6e 20 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62  n there should b
5f90: 65 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  e a single item 
5fa0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 57  on the stack.  W
5fb0: 72 69 74 65 20 74 68 69 73 0a 20 20 20 20 2a 2a  rite this.    **
5fc0: 20 69 74 65 6d 20 69 6e 74 6f 20 74 68 65 20 73   item into the s
5fd0: 65 74 20 74 61 62 6c 65 20 77 69 74 68 20 62 6f  et table with bo
5fe0: 67 75 73 20 64 61 74 61 2e 0a 20 20 20 20 2a 2f  gus data..    */
5ff0: 0a 20 20 20 20 63 61 73 65 20 53 52 54 5f 53 65  .    case SRT_Se
6000: 74 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t: {.      asser
6010: 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  t( nColumn==1 );
6020: 0a 20 20 20 20 20 20 70 44 65 73 74 2d 3e 61 66  .      pDest->af
6030: 66 53 64 73 74 20 3d 0a 20 20 20 20 20 20 20 20  fSdst =.        
6040: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6050: 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
6060: 28 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  (pEList->a[0].pE
6070: 78 70 72 2c 20 70 44 65 73 74 2d 3e 61 66 66 53  xpr, pDest->affS
6080: 64 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  dst);.      if( 
6090: 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20  pOrderBy ){.    
60a0: 20 20 20 20 2f 2a 20 41 74 20 66 69 72 73 74 20      /* At first 
60b0: 67 6c 61 6e 63 65 20 79 6f 75 20 77 6f 75 6c 64  glance you would
60c0: 20 74 68 69 6e 6b 20 77 65 20 63 6f 75 6c 64 20   think we could 
60d0: 6f 70 74 69 6d 69 7a 65 20 6f 75 74 20 74 68 65  optimize out the
60e0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
60f0: 52 20 42 59 20 69 6e 20 74 68 69 73 20 63 61 73  R BY in this cas
6100: 65 20 73 69 6e 63 65 20 74 68 65 20 6f 72 64 65  e since the orde
6110: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
6120: 74 68 65 20 73 65 74 0a 20 20 20 20 20 20 20 20  the set.        
6130: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  ** does not matt
6140: 65 72 2e 20 20 42 75 74 20 74 68 65 72 65 20 6d  er.  But there m
6150: 69 67 68 74 20 62 65 20 61 20 4c 49 4d 49 54 20  ight be a LIMIT 
6160: 63 6c 61 75 73 65 2c 20 69 6e 20 77 68 69 63 68  clause, in which
6170: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65  .        ** case
6180: 20 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20   the order does 
6190: 6d 61 74 74 65 72 20 2a 2f 0a 20 20 20 20 20 20  matter */.      
61a0: 20 20 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72    pushOntoSorter
61b0: 28 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42  (pParse, pOrderB
61c0: 79 2c 20 70 2c 20 72 65 67 52 65 73 75 6c 74 29  y, p, regResult)
61d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
61e0: 20 20 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20         int r1 = 
61f0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6200: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
6210: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6220: 64 4f 70 34 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  dOp4(v, OP_MakeR
6230: 65 63 6f 72 64 2c 20 72 65 67 52 65 73 75 6c 74  ecord, regResult
6240: 2c 31 2c 72 31 2c 20 26 70 44 65 73 74 2d 3e 61  ,1,r1, &pDest->a
6250: 66 66 53 64 73 74 2c 20 31 29 3b 0a 20 20 20 20  ffSdst, 1);.    
6260: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
6270: 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
6280: 67 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  ge(pParse, regRe
6290: 73 75 6c 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  sult, 1);.      
62a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
62b0: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
62c0: 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 31 29 3b  ert, iParm, r1);
62d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
62e0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
62f0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
6300: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
6320: 66 20 61 6e 79 20 72 6f 77 20 65 78 69 73 74 20  f any row exist 
6330: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
6340: 74 2c 20 72 65 63 6f 72 64 20 74 68 61 74 20 66  t, record that f
6350: 61 63 74 20 61 6e 64 20 61 62 6f 72 74 2e 0a 20  act and abort.. 
6360: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
6370: 52 54 5f 45 78 69 73 74 73 3a 20 7b 0a 20 20 20  RT_Exists: {.   
6380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6390: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
63a0: 65 72 2c 20 31 2c 20 69 50 61 72 6d 29 3b 0a 20  er, 1, iParm);. 
63b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49       /* The LIMI
63c0: 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74 65  T clause will te
63d0: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
63e0: 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 20   for us */.     
63f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
6400: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
6410: 20 61 20 73 63 61 6c 61 72 20 73 65 6c 65 63 74   a scalar select
6420: 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f 66   that is part of
6430: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   an expression, 
6440: 74 68 65 6e 0a 20 20 20 20 2a 2a 20 73 74 6f 72  then.    ** stor
6450: 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e  e the results in
6460: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
6470: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
6480: 20 62 72 65 61 6b 20 6f 75 74 0a 20 20 20 20 2a   break out.    *
6490: 2a 20 6f 66 20 74 68 65 20 73 63 61 6e 20 6c 6f  * of the scan lo
64a0: 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  op..    */.    c
64b0: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
64c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
64d0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
64e0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
64f0: 0a 20 20 20 20 20 20 20 20 70 75 73 68 4f 6e 74  .        pushOnt
6500: 6f 53 6f 72 74 65 72 28 70 50 61 72 73 65 2c 20  oSorter(pParse, 
6510: 70 4f 72 64 65 72 42 79 2c 20 70 2c 20 72 65 67  pOrderBy, p, reg
6520: 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 7d  Result);.      }
6530: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
6540: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f 76  lite3ExprCodeMov
6550: 65 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 73  e(pParse, regRes
6560: 75 6c 74 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  ult, iParm, 1);.
6570: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c          /* The L
6580: 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c  IMIT clause will
6590: 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74 68 65   jump out of the
65a0: 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a 2f 0a   loop for us */.
65b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
65c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
65d0: 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
65e0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
65f0: 59 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 6e  Y */..    /* Sen
6600: 64 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68  d the data to th
6610: 65 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  e callback funct
6620: 69 6f 6e 20 6f 72 20 74 6f 20 61 20 73 75 62 72  ion or to a subr
6630: 6f 75 74 69 6e 65 2e 20 20 49 6e 20 74 68 65 0a  outine.  In the.
6640: 20 20 20 20 2a 2a 20 63 61 73 65 20 6f 66 20 61      ** case of a
6650: 20 73 75 62 72 6f 75 74 69 6e 65 2c 20 74 68 65   subroutine, the
6660: 20 73 75 62 72 6f 75 74 69 6e 65 20 69 74 73 65   subroutine itse
6670: 6c 66 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  lf is responsibl
6680: 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 6f 70  e for.    ** pop
6690: 70 69 6e 67 20 74 68 65 20 64 61 74 61 20 66 72  ping the data fr
66a0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  om the stack..  
66b0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 52    */.    case SR
66c0: 54 5f 43 6f 72 6f 75 74 69 6e 65 3a 0a 20 20 20  T_Coroutine:.   
66d0: 20 63 61 73 65 20 53 52 54 5f 4f 75 74 70 75 74   case SRT_Output
66e0: 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
66f0: 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  se( eDest==SRT_C
6700: 6f 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20  oroutine );.    
6710: 20 20 74 65 73 74 63 61 73 65 28 20 65 44 65 73    testcase( eDes
6720: 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29 3b  t==SRT_Output );
6730: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 64 65  .      if( pOrde
6740: 72 42 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  rBy ){.        i
6750: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
6760: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
6770: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6780: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6790: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72  OP_MakeRecord, r
67a0: 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d  egResult, nColum
67b0: 6e 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  n, r1);.        
67c0: 70 75 73 68 4f 6e 74 6f 53 6f 72 74 65 72 28 70  pushOntoSorter(p
67d0: 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 2c  Parse, pOrderBy,
67e0: 20 70 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20   p, r1);.       
67f0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
6800: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
6810: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  1);.      }else 
6820: 69 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43  if( eDest==SRT_C
6830: 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20  oroutine ){.    
6840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6850: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
6860: 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  d, pDest->iSDPar
6870: 6d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  m);.      }else{
6880: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6890: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
68a0: 5f 52 65 73 75 6c 74 52 6f 77 2c 20 72 65 67 52  _ResultRow, regR
68b0: 65 73 75 6c 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b  esult, nColumn);
68c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
68d0: 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74  ExprCacheAffinit
68e0: 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20  yChange(pParse, 
68f0: 72 65 67 52 65 73 75 6c 74 2c 20 6e 43 6f 6c 75  regResult, nColu
6900: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  mn);.      }.   
6910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6920: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6930: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
6940: 52 29 0a 20 20 20 20 2f 2a 20 44 69 73 63 61 72  R).    /* Discar
6950: 64 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 20  d the results.  
6960: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
6970: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6980: 74 73 20 69 6e 73 69 64 65 0a 20 20 20 20 2a 2a  ts inside.    **
6990: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 54   the body of a T
69a0: 52 49 47 47 45 52 2e 20 20 54 68 65 20 70 75 72  RIGGER.  The pur
69b0: 70 6f 73 65 20 6f 66 20 73 75 63 68 20 73 65 6c  pose of such sel
69c0: 65 63 74 73 20 69 73 20 74 6f 20 63 61 6c 6c 0a  ects is to call.
69d0: 20 20 20 20 2a 2a 20 75 73 65 72 2d 64 65 66 69      ** user-defi
69e0: 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ned functions th
69f0: 61 74 20 68 61 76 65 20 73 69 64 65 20 65 66 66  at have side eff
6a00: 65 63 74 73 2e 20 20 57 65 20 64 6f 20 6e 6f 74  ects.  We do not
6a10: 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 61 62 6f   care.    ** abo
6a20: 75 74 20 74 68 65 20 61 63 74 75 61 6c 20 72 65  ut the actual re
6a30: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c  sults of the sel
6a40: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
6a50: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
6a60: 20 61 73 73 65 72 74 28 20 65 44 65 73 74 3d 3d   assert( eDest==
6a70: 53 52 54 5f 44 69 73 63 61 72 64 20 29 3b 0a 20  SRT_Discard );. 
6a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6a90: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
6aa0: 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 65 20 65  /* Jump to the e
6ab0: 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  nd of the loop i
6ac0: 66 20 74 68 65 20 4c 49 4d 49 54 20 69 73 20 72  f the LIMIT is r
6ad0: 65 61 63 68 65 64 2e 20 20 45 78 63 65 70 74 2c  eached.  Except,
6ae0: 20 69 66 0a 20 20 2a 2a 20 74 68 65 72 65 20 69   if.  ** there i
6af0: 73 20 61 20 73 6f 72 74 65 72 2c 20 69 6e 20 77  s a sorter, in w
6b00: 68 69 63 68 20 63 61 73 65 20 74 68 65 20 73 6f  hich case the so
6b10: 72 74 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  rter has already
6b20: 20 6c 69 6d 69 74 65 64 0a 20 20 2a 2a 20 74 68   limited.  ** th
6b30: 65 20 6f 75 74 70 75 74 20 66 6f 72 20 75 73 2e  e output for us.
6b40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64  .  */.  if( pOrd
6b50: 65 72 42 79 3d 3d 30 20 26 26 20 70 2d 3e 69 4c  erBy==0 && p->iL
6b60: 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
6b70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6b80: 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
6b90: 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d  Limit, iBreak, -
6ba0: 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
6bb0: 20 47 69 76 65 6e 20 61 6e 20 65 78 70 72 65 73   Given an expres
6bc0: 73 69 6f 6e 20 6c 69 73 74 2c 20 67 65 6e 65 72  sion list, gener
6bd0: 61 74 65 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ate a KeyInfo st
6be0: 72 75 63 74 75 72 65 20 74 68 61 74 20 72 65 63  ructure that rec
6bf0: 6f 72 64 73 0a 2a 2a 20 74 68 65 20 63 6f 6c 6c  ords.** the coll
6c00: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 66  ating sequence f
6c10: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
6c20: 6f 6e 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  on in that expre
6c30: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
6c40: 2a 20 49 66 20 74 68 65 20 45 78 70 72 4c 69 73  * If the ExprLis
6c50: 74 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  t is an ORDER BY
6c60: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
6c70: 75 73 65 20 74 68 65 6e 20 74 68 65 20 72 65 73  use then the res
6c80: 75 6c 74 69 6e 67 0a 2a 2a 20 4b 65 79 49 6e 66  ulting.** KeyInf
6c90: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
6ca0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69  ppropriate for i
6cb0: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 61 20 76 69  nitializing a vi
6cc0: 72 74 75 61 6c 20 69 6e 64 65 78 20 74 6f 0a 2a  rtual index to.*
6cd0: 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 61 74  * implement that
6ce0: 20 63 6c 61 75 73 65 2e 20 20 49 66 20 74 68 65   clause.  If the
6cf0: 20 45 78 70 72 4c 69 73 74 20 69 73 20 74 68 65   ExprList is the
6d00: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 61   result set of a
6d10: 20 53 45 4c 45 43 54 0a 2a 2a 20 74 68 65 6e 20   SELECT.** then 
6d20: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
6d30: 63 74 75 72 65 20 69 73 20 61 70 70 72 6f 70 72  cture is appropr
6d40: 69 61 74 65 20 66 6f 72 20 69 6e 69 74 69 61 6c  iate for initial
6d50: 69 7a 69 6e 67 20 61 20 76 69 72 74 75 61 6c 0a  izing a virtual.
6d60: 2a 2a 20 69 6e 64 65 78 20 74 6f 20 69 6d 70 6c  ** index to impl
6d70: 65 6d 65 6e 74 20 61 20 44 49 53 54 49 4e 43 54  ement a DISTINCT
6d80: 20 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   test..**.** Spa
6d90: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 4b  ce to hold the K
6da0: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
6db0: 20 69 73 20 6f 62 74 61 69 6e 20 66 72 6f 6d 20   is obtain from 
6dc0: 6d 61 6c 6c 6f 63 2e 20 20 54 68 65 20 63 61 6c  malloc.  The cal
6dd0: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
6de0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
6df0: 66 6f 72 20 73 65 65 69 6e 67 20 74 68 61 74 20  for seeing that 
6e00: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
6e10: 73 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  s eventually.** 
6e20: 66 72 65 65 64 2e 20 20 41 64 64 20 74 68 65 20  freed.  Add the 
6e30: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
6e40: 65 20 74 6f 20 74 68 65 20 50 34 20 66 69 65 6c  e to the P4 fiel
6e50: 64 20 6f 66 20 61 6e 20 6f 70 63 6f 64 65 20 75  d of an opcode u
6e60: 73 69 6e 67 0a 2a 2a 20 50 34 5f 4b 45 59 49 4e  sing.** P4_KEYIN
6e70: 46 4f 5f 48 41 4e 44 4f 46 46 20 69 73 20 74 68  FO_HANDOFF is th
6e80: 65 20 75 73 75 61 6c 20 77 61 79 20 6f 66 20 64  e usual way of d
6e90: 65 61 6c 69 6e 67 20 77 69 74 68 20 74 68 69 73  ealing with this
6ea0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4b 65 79 49  ..*/.static KeyI
6eb0: 6e 66 6f 20 2a 6b 65 79 49 6e 66 6f 46 72 6f 6d  nfo *keyInfoFrom
6ec0: 45 78 70 72 4c 69 73 74 28 50 61 72 73 65 20 2a  ExprList(Parse *
6ed0: 70 50 61 72 73 65 2c 20 45 78 70 72 4c 69 73 74  pParse, ExprList
6ee0: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pList){.  sqli
6ef0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
6f00: 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e 45 78 70  ->db;.  int nExp
6f10: 72 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 49  r;.  KeyInfo *pI
6f20: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 45 78  nfo;.  struct Ex
6f30: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
6f40: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  em;.  int i;..  
6f50: 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e  nExpr = pList->n
6f60: 45 78 70 72 3b 0a 20 20 70 49 6e 66 6f 20 3d 20  Expr;.  pInfo = 
6f70: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
6f80: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
6f90: 70 49 6e 66 6f 29 20 2b 20 6e 45 78 70 72 2a 28  pInfo) + nExpr*(
6fa0: 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29  sizeof(CollSeq*)
6fb0: 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 49 6e  +1) );.  if( pIn
6fc0: 66 6f 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  fo ){.    pInfo-
6fd0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
6fe0: 38 2a 29 26 70 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  8*)&pInfo->aColl
6ff0: 5b 6e 45 78 70 72 5d 3b 0a 20 20 20 20 70 49 6e  [nExpr];.    pIn
7000: 66 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31  fo->nField = (u1
7010: 36 29 6e 45 78 70 72 3b 0a 20 20 20 20 70 49 6e  6)nExpr;.    pIn
7020: 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64 62  fo->enc = ENC(db
7030: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 64 62  );.    pInfo->db
7040: 20 3d 20 64 62 3b 0a 20 20 20 20 66 6f 72 28 69   = db;.    for(i
7050: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
7060: 3e 61 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b  >a; i<nExpr; i++
7070: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
7080: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
7090: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20  ;.      pColl = 
70a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
70b0: 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  eq(pParse, pItem
70c0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->pExpr);.      
70d0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
70e0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
70f0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
7100: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 66 6f     }.      pInfo
7110: 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 70 43 6f  ->aColl[i] = pCo
7120: 6c 6c 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  ll;.      pInfo-
7130: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
7140: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
7150: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  r;.    }.  }.  r
7160: 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d 0a 0a  eturn pInfo;.}..
7170: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7180: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
7190: 45 43 54 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 6f  ECT./*.** Name o
71a0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
71b0: 20 6f 70 65 72 61 74 6f 72 2c 20 75 73 65 64 20   operator, used 
71c0: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
71d0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  es..*/.static co
71e0: 6e 73 74 20 63 68 61 72 20 2a 73 65 6c 65 63 74  nst char *select
71f0: 4f 70 4e 61 6d 65 28 69 6e 74 20 69 64 29 7b 0a  OpName(int id){.
7200: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69    char *z;.  swi
7210: 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20 20 63  tch( id ){.    c
7220: 61 73 65 20 54 4b 5f 41 4c 4c 3a 20 20 20 20 20  ase TK_ALL:     
7230: 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 20 41 4c 4c    z = "UNION ALL
7240: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
7250: 63 61 73 65 20 54 4b 5f 49 4e 54 45 52 53 45 43  case TK_INTERSEC
7260: 54 3a 20 7a 20 3d 20 22 49 4e 54 45 52 53 45 43  T: z = "INTERSEC
7270: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
7280: 20 63 61 73 65 20 54 4b 5f 45 58 43 45 50 54 3a   case TK_EXCEPT:
7290: 20 20 20 20 7a 20 3d 20 22 45 58 43 45 50 54 22      z = "EXCEPT"
72a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
72b0: 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20    default:      
72c0: 20 20 20 20 20 7a 20 3d 20 22 55 4e 49 4f 4e 22       z = "UNION"
72d0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
72e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d   }.  return z;.}
72f0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7300: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
7310: 53 45 4c 45 43 54 20 2a 2f 0a 0a 23 69 66 6e 64  SELECT */..#ifnd
7320: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
7330: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 55 6e 6c  XPLAIN./*.** Unl
7340: 65 73 73 20 61 6e 20 22 45 58 50 4c 41 49 4e 20  ess an "EXPLAIN 
7350: 51 55 45 52 59 20 50 4c 41 4e 22 20 63 6f 6d 6d  QUERY PLAN" comm
7360: 61 6e 64 20 69 73 20 62 65 69 6e 67 20 70 72 6f  and is being pro
7370: 63 65 73 73 65 64 2c 20 74 68 69 73 20 66 75 6e  cessed, this fun
7380: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 20 6e 6f  ction.** is a no
7390: 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  -op. Otherwise, 
73a0: 69 74 20 61 64 64 73 20 61 20 73 69 6e 67 6c 65  it adds a single
73b0: 20 72 6f 77 20 6f 66 20 6f 75 74 70 75 74 20 74   row of output t
73c0: 6f 20 74 68 65 20 45 51 50 20 72 65 73 75 6c 74  o the EQP result
73d0: 2c 0a 2a 2a 20 77 68 65 72 65 20 74 68 65 20 63  ,.** where the c
73e0: 61 70 74 69 6f 6e 20 69 73 20 6f 66 20 74 68 65  aption is of the
73f0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 22   form:.**.**   "
7400: 55 53 45 20 54 45 4d 50 20 42 2d 54 52 45 45 20  USE TEMP B-TREE 
7410: 46 4f 52 20 78 78 78 22 0a 2a 2a 0a 2a 2a 20 77  FOR xxx".**.** w
7420: 68 65 72 65 20 78 78 78 20 69 73 20 6f 6e 65 20  here xxx is one 
7430: 6f 66 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22  of "DISTINCT", "
7440: 4f 52 44 45 52 20 42 59 22 20 6f 72 20 22 47 52  ORDER BY" or "GR
7450: 4f 55 50 20 42 59 22 2e 20 45 78 61 63 74 6c 79  OUP BY". Exactly
7460: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 65 74   which.** is det
7470: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 7a  ermined by the z
7480: 55 73 61 67 65 20 61 72 67 75 6d 65 6e 74 2e 0a  Usage argument..
7490: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
74a0: 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28  xplainTempTable(
74b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
74c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73 61 67  onst char *zUsag
74d0: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  e){.  if( pParse
74e0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
74f0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
7500: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
7510: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 73 71   char *zMsg = sq
7520: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
7530: 72 73 65 2d 3e 64 62 2c 20 22 55 53 45 20 54 45  rse->db, "USE TE
7540: 4d 50 20 42 2d 54 52 45 45 20 46 4f 52 20 25 73  MP B-TREE FOR %s
7550: 22 2c 20 7a 55 73 61 67 65 29 3b 0a 20 20 20 20  ", zUsage);.    
7560: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7570: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  4(v, OP_Explain,
7580: 20 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74   pParse->iSelect
7590: 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73 67 2c 20  Id, 0, 0, zMsg, 
75a0: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
75b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
75c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 62 20 74 6f   expression b to
75d0: 20 6c 76 61 6c 75 65 20 61 2e 20 41 20 73 65 63   lvalue a. A sec
75e0: 6f 6e 64 2c 20 6e 6f 2d 6f 70 2c 20 76 65 72 73  ond, no-op, vers
75f0: 69 6f 6e 20 6f 66 20 74 68 69 73 20 6d 61 63 72  ion of this macr
7600: 6f 0a 2a 2a 20 69 73 20 70 72 6f 76 69 64 65 64  o.** is provided
7610: 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4d 49   when SQLITE_OMI
7620: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 64 65 66  T_EXPLAIN is def
7630: 69 6e 65 64 2e 20 54 68 69 73 20 61 6c 6c 6f 77  ined. This allow
7640: 73 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 69 6e  s the code.** in
7650: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
7660: 20 74 6f 20 61 73 73 69 67 6e 20 76 61 6c 75 65   to assign value
7670: 73 20 74 6f 20 73 74 72 75 63 74 75 72 65 20 6d  s to structure m
7680: 65 6d 62 65 72 20 76 61 72 69 61 62 6c 65 73 20  ember variables 
7690: 74 68 61 74 0a 2a 2a 20 6f 6e 6c 79 20 65 78 69  that.** only exi
76a0: 73 74 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  st if SQLITE_OMI
76b0: 54 5f 45 58 50 4c 41 49 4e 20 69 73 20 6e 6f 74  T_EXPLAIN is not
76c0: 20 64 65 66 69 6e 65 64 20 77 69 74 68 6f 75 74   defined without
76d0: 20 70 6f 6c 6c 75 74 69 6e 67 20 74 68 65 0a 2a   polluting the.*
76e0: 2a 20 63 6f 64 65 20 77 69 74 68 20 23 69 66 6e  * code with #ifn
76f0: 64 65 66 20 64 69 72 65 63 74 69 76 65 73 2e 0a  def directives..
7700: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 65 78 70 6c  */.# define expl
7710: 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28 61 2c  ainSetInteger(a,
7720: 20 62 29 20 61 20 3d 20 62 0a 0a 23 65 6c 73 65   b) a = b..#else
7730: 0a 2f 2a 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f  ./* No-op versio
7740: 6e 73 20 6f 66 20 74 68 65 20 65 78 70 6c 61 69  ns of the explai
7750: 6e 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  nXXX() functions
7760: 20 61 6e 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a   and macros. */.
7770: 23 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e  # define explain
7780: 54 65 6d 70 54 61 62 6c 65 28 79 2c 7a 29 0a 23  TempTable(y,z).#
7790: 20 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 53   define explainS
77a0: 65 74 49 6e 74 65 67 65 72 28 79 2c 7a 29 0a 23  etInteger(y,z).#
77b0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
77c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
77d0: 45 58 50 4c 41 49 4e 29 20 26 26 20 21 64 65 66  EXPLAIN) && !def
77e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
77f0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
7800: 29 0a 2f 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 61  )./*.** Unless a
7810: 6e 20 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59  n "EXPLAIN QUERY
7820: 20 50 4c 41 4e 22 20 63 6f 6d 6d 61 6e 64 20 69   PLAN" command i
7830: 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  s being processe
7840: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
7850: 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  .** is a no-op. 
7860: 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 61 64  Otherwise, it ad
7870: 64 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20  ds a single row 
7880: 6f 66 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  of output to the
7890: 20 45 51 50 20 72 65 73 75 6c 74 2c 0a 2a 2a 20   EQP result,.** 
78a0: 77 68 65 72 65 20 74 68 65 20 63 61 70 74 69 6f  where the captio
78b0: 6e 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  n is of one of t
78c0: 68 65 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  he two forms:.**
78d0: 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54 45  .**   "COMPOSITE
78e0: 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75 62   SUBQUERIES iSub
78f0: 31 20 61 6e 64 20 69 53 75 62 32 20 28 6f 70 29  1 and iSub2 (op)
7900: 22 0a 2a 2a 20 20 20 22 43 4f 4d 50 4f 53 49 54  ".**   "COMPOSIT
7910: 45 20 53 55 42 51 55 45 52 49 45 53 20 69 53 75  E SUBQUERIES iSu
7920: 62 31 20 61 6e 64 20 69 53 75 62 32 20 55 53 49  b1 and iSub2 USI
7930: 4e 47 20 54 45 4d 50 20 42 2d 54 52 45 45 20 28  NG TEMP B-TREE (
7940: 6f 70 29 22 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  op)".**.** where
7950: 20 69 53 75 62 31 20 61 6e 64 20 69 53 75 62 32   iSub1 and iSub2
7960: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
7970: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
7980: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
7990: 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
79a0: 74 65 72 73 2c 20 61 6e 64 20 6f 70 20 69 73 20  ters, and op is 
79b0: 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65  the text represe
79c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
79d0: 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 66 20 74  arameter.** of t
79e0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 54 68  he same name. Th
79f0: 65 20 70 61 72 61 6d 65 74 65 72 20 22 6f 70 22  e parameter "op"
7a00: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
7a10: 54 4b 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43  TK_UNION, TK_EXC
7a20: 45 50 54 2c 0a 2a 2a 20 54 4b 5f 49 4e 54 45 52  EPT,.** TK_INTER
7a30: 53 45 43 54 20 6f 72 20 54 4b 5f 41 4c 4c 2e 20  SECT or TK_ALL. 
7a40: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
7a50: 73 20 75 73 65 64 20 69 66 20 61 72 67 75 6d 65  s used if argume
7a60: 6e 74 20 62 55 73 65 54 6d 70 20 69 73 20 0a 2a  nt bUseTmp is .*
7a70: 2a 20 66 61 6c 73 65 2c 20 6f 72 20 74 68 65 20  * false, or the 
7a80: 73 65 63 6f 6e 64 20 66 6f 72 6d 20 69 66 20 69  second form if i
7a90: 74 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  t is true..*/.st
7aa0: 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
7ab0: 6e 43 6f 6d 70 6f 73 69 74 65 28 0a 20 20 50 61  nComposite(.  Pa
7ac0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ae0: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
7af0: 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20  /.  int op,     
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 54 4b      /* One of TK
7b20: 5f 55 4e 49 4f 4e 2c 20 54 4b 5f 45 58 43 45 50  _UNION, TK_EXCEP
7b30: 54 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e 74 20  T etc. */.  int 
7b40: 69 53 75 62 31 2c 20 20 20 20 20 20 20 20 20 20  iSub1,          
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7b60: 75 62 71 75 65 72 79 20 69 64 20 31 20 2a 2f 0a  ubquery id 1 */.
7b70: 20 20 69 6e 74 20 69 53 75 62 32 2c 20 20 20 20    int iSub2,    
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b90: 20 20 2f 2a 20 53 75 62 71 75 65 72 79 20 69 64    /* Subquery id
7ba0: 20 32 20 2a 2f 0a 20 20 69 6e 74 20 62 55 73 65   2 */.  int bUse
7bb0: 54 6d 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Tmp             
7bc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7bd0: 69 66 20 61 20 74 65 6d 70 20 74 61 62 6c 65 20  if a temp table 
7be0: 77 61 73 20 75 73 65 64 20 2a 2f 0a 29 7b 0a 20  was used */.){. 
7bf0: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
7c00: 55 4e 49 4f 4e 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  UNION || op==TK_
7c10: 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
7c20: 5f 49 4e 54 45 52 53 45 43 54 20 7c 7c 20 6f 70  _INTERSECT || op
7c30: 3d 3d 54 4b 5f 41 4c 4c 20 29 3b 0a 20 20 69 66  ==TK_ALL );.  if
7c40: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
7c50: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 56 64 62 65  n==2 ){.    Vdbe
7c60: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
7c70: 64 62 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  dbe;.    char *z
7c80: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
7c90: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
7ca0: 61 72 73 65 2d 3e 64 62 2c 20 22 43 4f 4d 50 4f  arse->db, "COMPO
7cb0: 55 4e 44 20 53 55 42 51 55 45 52 49 45 53 20 25  UND SUBQUERIES %
7cc0: 64 20 41 4e 44 20 25 64 20 25 73 28 25 73 29 22  d AND %d %s(%s)"
7cd0: 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 0a  , iSub1, iSub2,.
7ce0: 20 20 20 20 20 20 20 20 62 55 73 65 54 6d 70 3f          bUseTmp?
7cf0: 22 55 53 49 4e 47 20 54 45 4d 50 20 42 2d 54 52  "USING TEMP B-TR
7d00: 45 45 20 22 3a 22 22 2c 20 73 65 6c 65 63 74 4f  EE ":"", selectO
7d10: 70 4e 61 6d 65 28 6f 70 29 0a 20 20 20 20 29 3b  pName(op).    );
7d20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7d30: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70  AddOp4(v, OP_Exp
7d40: 6c 61 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53  lain, pParse->iS
7d50: 65 6c 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a  electId, 0, 0, z
7d60: 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
7d70: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 2f 2a  ;.  }.}.#else./*
7d80: 20 4e 6f 2d 6f 70 20 76 65 72 73 69 6f 6e 73 20   No-op versions 
7d90: 6f 66 20 74 68 65 20 65 78 70 6c 61 69 6e 58 58  of the explainXX
7da0: 58 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  X() functions an
7db0: 64 20 6d 61 63 72 6f 73 2e 20 2a 2f 0a 23 20 64  d macros. */.# d
7dc0: 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 43 6f 6d  efine explainCom
7dd0: 70 6f 73 69 74 65 28 76 2c 77 2c 78 2c 79 2c 7a  posite(v,w,x,y,z
7de0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
7df0: 49 66 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  If the inner loo
7e00: 70 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 20  p was generated 
7e10: 75 73 69 6e 67 20 61 20 6e 6f 6e 2d 6e 75 6c 6c  using a non-null
7e20: 20 70 4f 72 64 65 72 42 79 20 61 72 67 75 6d 65   pOrderBy argume
7e30: 6e 74 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  nt,.** then the 
7e40: 72 65 73 75 6c 74 73 20 77 65 72 65 20 70 6c 61  results were pla
7e50: 63 65 64 20 69 6e 20 61 20 73 6f 72 74 65 72 2e  ced in a sorter.
7e60: 20 20 41 66 74 65 72 20 74 68 65 20 6c 6f 6f 70    After the loop
7e70: 20 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a   is terminated.*
7e80: 2a 20 77 65 20 6e 65 65 64 20 74 6f 20 72 75 6e  * we need to run
7e90: 20 74 68 65 20 73 6f 72 74 65 72 20 61 6e 64 20   the sorter and 
7ea0: 6f 75 74 70 75 74 20 74 68 65 20 72 65 73 75 6c  output the resul
7eb0: 74 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ts.  The followi
7ec0: 6e 67 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 67 65  ng.** routine ge
7ed0: 6e 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65  nerates the code
7ee0: 20 6e 65 65 64 65 64 20 74 6f 20 64 6f 20 74 68   needed to do th
7ef0: 61 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  at..*/.static vo
7f00: 69 64 20 67 65 6e 65 72 61 74 65 53 6f 72 74 54  id generateSortT
7f10: 61 69 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ail(.  Parse *pP
7f20: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
7f30: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
7f40: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
7f50: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
7f60: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
7f70: 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 20  Vdbe *v,        
7f80: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
7f90: 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56 44 42  de into this VDB
7fa0: 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  E */.  int nColu
7fb0: 6d 6e 2c 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  mn,      /* Numb
7fc0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f 66  er of columns of
7fd0: 20 64 61 74 61 20 2a 2f 0a 20 20 53 65 6c 65 63   data */.  Selec
7fe0: 74 44 65 73 74 20 2a 70 44 65 73 74 20 2f 2a 20  tDest *pDest /* 
7ff0: 57 72 69 74 65 20 74 68 65 20 73 6f 72 74 65 64  Write the sorted
8000: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
8010: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 42 72  .){.  int addrBr
8020: 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
8030: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
8040: 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20     /* Jump here 
8050: 74 6f 20 65 78 69 74 20 6c 6f 6f 70 20 2a 2f 0a  to exit loop */.
8060: 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 69 6e    int addrContin
8070: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
8080: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f  MakeLabel(v);  /
8090: 2a 20 4a 75 6d 70 20 68 65 72 65 20 66 6f 72 20  * Jump here for 
80a0: 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
80b0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 69 6e 74 20  int addr;.  int 
80c0: 69 54 61 62 3b 0a 20 20 69 6e 74 20 70 73 65 75  iTab;.  int pseu
80d0: 64 6f 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70  doTab = 0;.  Exp
80e0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 20  rList *pOrderBy 
80f0: 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 0a  = p->pOrderBy;..
8100: 20 20 69 6e 74 20 65 44 65 73 74 20 3d 20 70 44    int eDest = pD
8110: 65 73 74 2d 3e 65 44 65 73 74 3b 0a 20 20 69 6e  est->eDest;.  in
8120: 74 20 69 50 61 72 6d 20 3d 20 70 44 65 73 74 2d  t iParm = pDest-
8130: 3e 69 53 44 50 61 72 6d 3b 0a 0a 20 20 69 6e 74  >iSDParm;..  int
8140: 20 72 65 67 52 6f 77 3b 0a 20 20 69 6e 74 20 72   regRow;.  int r
8150: 65 67 52 6f 77 69 64 3b 0a 0a 20 20 69 54 61 62  egRowid;..  iTab
8160: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 69 45 43   = pOrderBy->iEC
8170: 75 72 73 6f 72 3b 0a 20 20 72 65 67 52 6f 77 20  ursor;.  regRow 
8180: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
8190: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 69  Reg(pParse);.  i
81a0: 66 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75  f( eDest==SRT_Ou
81b0: 74 70 75 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53  tput || eDest==S
81c0: 52 54 5f 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  RT_Coroutine ){.
81d0: 20 20 20 20 70 73 65 75 64 6f 54 61 62 20 3d 20      pseudoTab = 
81e0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
81f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8200: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
8210: 50 73 65 75 64 6f 2c 20 70 73 65 75 64 6f 54 61  Pseudo, pseudoTa
8220: 62 2c 20 72 65 67 52 6f 77 2c 20 6e 43 6f 6c 75  b, regRow, nColu
8230: 6d 6e 29 3b 0a 20 20 20 20 72 65 67 52 6f 77 69  mn);.    regRowi
8240: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 0;.  }else{.
8250: 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20 73      regRowid = s
8260: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
8270: 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20  (pParse);.  }.  
8280: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
8290: 26 20 53 46 5f 55 73 65 53 6f 72 74 65 72 20 29  & SF_UseSorter )
82a0: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 53 6f 72  {.    int regSor
82b0: 74 4f 75 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  tOut = ++pParse-
82c0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 74 20 70  >nMem;.    int p
82d0: 74 61 62 32 20 3d 20 70 50 61 72 73 65 2d 3e 6e  tab2 = pParse->n
82e0: 54 61 62 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  Tab++;.    sqlit
82f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
8300: 4f 50 5f 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70  OP_OpenPseudo, p
8310: 74 61 62 32 2c 20 72 65 67 53 6f 72 74 4f 75 74  tab2, regSortOut
8320: 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  , pOrderBy->nExp
8330: 72 2b 32 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  r+2);.    addr =
8340: 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
8350: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
8360: 74 65 72 53 6f 72 74 2c 20 69 54 61 62 2c 20 61  terSort, iTab, a
8370: 64 64 72 42 72 65 61 6b 29 3b 0a 20 20 20 20 63  ddrBreak);.    c
8380: 6f 64 65 4f 66 66 73 65 74 28 76 2c 20 70 2c 20  odeOffset(v, p, 
8390: 61 64 64 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  addrContinue);. 
83a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
83b0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
83c0: 72 44 61 74 61 2c 20 69 54 61 62 2c 20 72 65 67  rData, iTab, reg
83d0: 53 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 73 71  SortOut);.    sq
83e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
83f0: 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 74  v, OP_Column, pt
8400: 61 62 32 2c 20 70 4f 72 64 65 72 42 79 2d 3e 6e  ab2, pOrderBy->n
8410: 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29 3b  Expr+1, regRow);
8420: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8430: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8440: 41 47 5f 43 4c 45 41 52 43 41 43 48 45 29 3b 0a  AG_CLEARCACHE);.
8450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
8460: 72 20 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56  r = 1 + sqlite3V
8470: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8480: 53 6f 72 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Sort, iTab, addr
8490: 42 72 65 61 6b 29 3b 0a 20 20 20 20 63 6f 64 65  Break);.    code
84a0: 4f 66 66 73 65 74 28 76 2c 20 70 2c 20 61 64 64  Offset(v, p, add
84b0: 72 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 20 20  rContinue);.    
84c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
84d0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
84e0: 69 54 61 62 2c 20 70 4f 72 64 65 72 42 79 2d 3e  iTab, pOrderBy->
84f0: 6e 45 78 70 72 2b 31 2c 20 72 65 67 52 6f 77 29  nExpr+1, regRow)
8500: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
8510: 65 44 65 73 74 20 29 7b 0a 20 20 20 20 63 61 73  eDest ){.    cas
8520: 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a 20 20 20  e SRT_Table:.   
8530: 20 63 61 73 65 20 53 52 54 5f 45 70 68 65 6d 54   case SRT_EphemT
8540: 61 62 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  ab: {.      test
8550: 63 61 73 65 28 20 65 44 65 73 74 3d 3d 53 52 54  case( eDest==SRT
8560: 5f 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20  _Table );.      
8570: 74 65 73 74 63 61 73 65 28 20 65 44 65 73 74 3d  testcase( eDest=
8580: 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29 3b  =SRT_EphemTab );
8590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
85a0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
85b0: 65 77 52 6f 77 69 64 2c 20 69 50 61 72 6d 2c 20  ewRowid, iParm, 
85c0: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
85d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
85e0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
85f0: 20 69 50 61 72 6d 2c 20 72 65 67 52 6f 77 2c 20   iParm, regRow, 
8600: 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  regRowid);.     
8610: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
8620: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41  geP5(v, OPFLAG_A
8630: 50 50 45 4e 44 29 3b 0a 20 20 20 20 20 20 62 72  PPEND);.      br
8640: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
8650: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
8660: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
8670: 20 53 52 54 5f 53 65 74 3a 20 7b 0a 20 20 20 20   SRT_Set: {.    
8680: 20 20 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d    assert( nColum
8690: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 73 71  n==1 );.      sq
86a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
86b0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
86c0: 2c 20 72 65 67 52 6f 77 2c 20 31 2c 20 72 65 67  , regRow, 1, reg
86d0: 52 6f 77 69 64 2c 0a 20 20 20 20 20 20 20 20 20  Rowid,.         
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
86f0: 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74 2c 20  pDest->affSdst, 
8700: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8710: 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
8720: 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
8730: 20 72 65 67 52 6f 77 2c 20 31 29 3b 0a 20 20 20   regRow, 1);.   
8740: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8750: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
8760: 73 65 72 74 2c 20 69 50 61 72 6d 2c 20 72 65 67  sert, iParm, reg
8770: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 62 72  Rowid);.      br
8780: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8790: 61 73 65 20 53 52 54 5f 4d 65 6d 3a 20 7b 0a 20  ase SRT_Mem: {. 
87a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 6f       assert( nCo
87b0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
87c0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
87d0: 4d 6f 76 65 28 70 50 61 72 73 65 2c 20 72 65 67  Move(pParse, reg
87e0: 52 6f 77 2c 20 69 50 61 72 6d 2c 20 31 29 3b 0a  Row, iParm, 1);.
87f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d        /* The LIM
8800: 49 54 20 63 6c 61 75 73 65 20 77 69 6c 6c 20 74  IT clause will t
8810: 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
8820: 70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  p for us */.    
8830: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
8840: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
8850: 74 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t: {.      int i
8860: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8870: 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75  eDest==SRT_Outpu
8880: 74 20 7c 7c 20 65 44 65 73 74 3d 3d 53 52 54 5f  t || eDest==SRT_
8890: 43 6f 72 6f 75 74 69 6e 65 20 29 3b 20 0a 20 20  Coroutine ); .  
88a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65 44      testcase( eD
88b0: 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20  est==SRT_Output 
88c0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
88d0: 65 28 20 65 44 65 73 74 3d 3d 53 52 54 5f 43 6f  e( eDest==SRT_Co
88e0: 72 6f 75 74 69 6e 65 20 29 3b 0a 20 20 20 20 20  routine );.     
88f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
8900: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  umn; i++){.     
8910: 20 20 20 61 73 73 65 72 74 28 20 72 65 67 52 6f     assert( regRo
8920: 77 21 3d 70 44 65 73 74 2d 3e 69 53 64 73 74 2b  w!=pDest->iSdst+
8930: 69 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  i );.        sql
8940: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8950: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 73 65  , OP_Column, pse
8960: 75 64 6f 54 61 62 2c 20 69 2c 20 70 44 65 73 74  udoTab, i, pDest
8970: 2d 3e 69 53 64 73 74 2b 69 29 3b 0a 20 20 20 20  ->iSdst+i);.    
8980: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
8990: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
89a0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
89b0: 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
89c0: 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  HE);.        }. 
89d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
89e0: 20 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70   eDest==SRT_Outp
89f0: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ut ){.        sq
8a00: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8a10: 76 2c 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c  v, OP_ResultRow,
8a20: 20 70 44 65 73 74 2d 3e 69 53 64 73 74 2c 20 6e   pDest->iSdst, n
8a30: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
8a40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
8a50: 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  eAffinityChange(
8a60: 70 50 61 72 73 65 2c 20 70 44 65 73 74 2d 3e 69  pParse, pDest->i
8a70: 53 64 73 74 2c 20 6e 43 6f 6c 75 6d 6e 29 3b 0a  Sdst, nColumn);.
8a80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8a90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8aa0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
8ab0: 6c 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ld, pDest->iSDPa
8ac0: 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rm);.      }.   
8ad0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8ae0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
8af0: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
8b00: 73 65 2c 20 72 65 67 52 6f 77 29 3b 0a 20 20 73  se, regRow);.  s
8b10: 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
8b20: 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
8b30: 52 6f 77 69 64 29 3b 0a 0a 20 20 2f 2a 20 54 68  Rowid);..  /* Th
8b40: 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65 20  e bottom of the 
8b50: 6c 6f 6f 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  loop.  */.  sqli
8b60: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
8b70: 62 65 6c 28 76 2c 20 61 64 64 72 43 6f 6e 74 69  bel(v, addrConti
8b80: 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  nue);.  if( p->s
8b90: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 55 73 65  elFlags & SF_Use
8ba0: 53 6f 72 74 65 72 20 29 7b 0a 20 20 20 20 73 71  Sorter ){.    sq
8bb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
8bc0: 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
8bd0: 2c 20 69 54 61 62 2c 20 61 64 64 72 29 3b 0a 20  , iTab, addr);. 
8be0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8bf0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8c00: 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20   OP_Next, iTab, 
8c10: 61 64 64 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  addr);.  }.  sql
8c20: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
8c30: 61 62 65 6c 28 76 2c 20 61 64 64 72 42 72 65 61  abel(v, addrBrea
8c40: 6b 29 3b 0a 20 20 69 66 28 20 65 44 65 73 74 3d  k);.  if( eDest=
8c50: 3d 53 52 54 5f 4f 75 74 70 75 74 20 7c 7c 20 65  =SRT_Output || e
8c60: 44 65 73 74 3d 3d 53 52 54 5f 43 6f 72 6f 75 74  Dest==SRT_Corout
8c70: 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ine ){.    sqlit
8c80: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
8c90: 4f 50 5f 43 6c 6f 73 65 2c 20 70 73 65 75 64 6f  OP_Close, pseudo
8ca0: 54 61 62 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  Tab, 0);.  }.}..
8cb0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
8cc0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69  ointer to a stri
8cd0: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
8ce0: 65 20 27 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  e 'declaration t
8cf0: 79 70 65 27 20 6f 66 20 74 68 65 0a 2a 2a 20 65  ype' of the.** e
8d00: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 2e  xpression pExpr.
8d10: 20 54 68 65 20 73 74 72 69 6e 67 20 6d 61 79 20   The string may 
8d20: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74  be treated as st
8d30: 61 74 69 63 20 62 79 20 74 68 65 20 63 61 6c 6c  atic by the call
8d40: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  er..**.** The de
8d50: 63 6c 61 72 61 74 69 6f 6e 20 74 79 70 65 20 69  claration type i
8d60: 73 20 74 68 65 20 65 78 61 63 74 20 64 61 74 61  s the exact data
8d70: 74 79 70 65 20 64 65 66 69 6e 69 74 69 6f 6e 20  type definition 
8d80: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
8d90: 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 43  he.** original C
8da0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8db0: 65 6d 65 6e 74 20 69 66 20 74 68 65 20 65 78 70  ement if the exp
8dc0: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
8dd0: 75 6d 6e 2e 20 54 68 65 0a 2a 2a 20 64 65 63 6c  umn. The.** decl
8de0: 61 72 61 74 69 6f 6e 20 74 79 70 65 20 66 6f 72  aration type for
8df0: 20 61 20 52 4f 57 49 44 20 66 69 65 6c 64 20 69   a ROWID field i
8e00: 73 20 49 4e 54 45 47 45 52 2e 20 45 78 61 63 74  s INTEGER. Exact
8e10: 6c 79 20 77 68 65 6e 20 61 6e 20 65 78 70 72 65  ly when an expre
8e20: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
8e30: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
8e40: 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 78 20 69  can be complex i
8e50: 6e 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  n the presence o
8e60: 66 20 73 75 62 71 75 65 72 69 65 73 2e 20 54 68  f subqueries. Th
8e70: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
8e80: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6c  expression in al
8e90: 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
8ea0: 6e 67 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ng SELECT statem
8eb0: 65 6e 74 73 20 69 73 20 0a 2a 2a 20 63 6f 6e 73  ents is .** cons
8ec0: 69 64 65 72 65 64 20 61 20 63 6f 6c 75 6d 6e 20  idered a column 
8ed0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
8ee0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54  ..**.**   SELECT
8ef0: 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b 0a 2a   col FROM tbl;.*
8f00: 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45 4c 45  *   SELECT (SELE
8f10: 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62 6c 3b  CT col FROM tbl;
8f20: 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45  .**   SELECT (SE
8f30: 4c 45 43 54 20 63 6f 6c 20 46 52 4f 4d 20 74 62  LECT col FROM tb
8f40: 6c 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  l);.**   SELECT 
8f50: 61 62 63 20 46 52 4f 4d 20 28 53 45 4c 45 43 54  abc FROM (SELECT
8f60: 20 63 6f 6c 20 41 53 20 61 62 63 20 46 52 4f 4d   col AS abc FROM
8f70: 20 74 62 6c 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68   tbl);.** .** Th
8f80: 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74 79  e declaration ty
8f90: 70 65 20 66 6f 72 20 61 6e 79 20 65 78 70 72 65  pe for any expre
8fa0: 73 73 69 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  ssion other than
8fb0: 20 61 20 63 6f 6c 75 6d 6e 20 69 73 20 4e 55 4c   a column is NUL
8fc0: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
8fd0: 73 74 20 63 68 61 72 20 2a 63 6f 6c 75 6d 6e 54  st char *columnT
8fe0: 79 70 65 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  ype(.  NameConte
8ff0: 78 74 20 2a 70 4e 43 2c 20 0a 20 20 45 78 70 72  xt *pNC, .  Expr
9000: 20 2a 70 45 78 70 72 2c 0a 20 20 63 6f 6e 73 74   *pExpr,.  const
9010: 20 63 68 61 72 20 2a 2a 70 7a 4f 72 69 67 69 6e   char **pzOrigin
9020: 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Db,.  const char
9030: 20 2a 2a 70 7a 4f 72 69 67 69 6e 54 61 62 2c 0a   **pzOriginTab,.
9040: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
9050: 7a 4f 72 69 67 69 6e 43 6f 6c 0a 29 7b 0a 20 20  zOriginCol.){.  
9060: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 79 70  char const *zTyp
9070: 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f  e = 0;.  char co
9080: 6e 73 74 20 2a 7a 4f 72 69 67 69 6e 44 62 20 3d  nst *zOriginDb =
9090: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
90a0: 20 2a 7a 4f 72 69 67 69 6e 54 61 62 20 3d 20 30   *zOriginTab = 0
90b0: 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
90c0: 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 30 3b 0a  zOriginCol = 0;.
90d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 66 28 20 4e    int j;.  if( N
90e0: 45 56 45 52 28 70 45 78 70 72 3d 3d 30 29 20 7c  EVER(pExpr==0) |
90f0: 7c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3d  | pNC->pSrcList=
9100: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  =0 ) return 0;..
9110: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9120: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
9130: 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20  TK_AGG_COLUMN:. 
9140: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
9150: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
9160: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9170: 61 20 63 6f 6c 75 6d 6e 2e 20 4c 6f 63 61 74 65  a column. Locate
9180: 20 74 68 65 20 74 61 62 6c 65 20 74 68 65 20 63   the table the c
9190: 6f 6c 75 6d 6e 20 69 73 20 62 65 69 6e 67 0a 20  olumn is being. 
91a0: 20 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65       ** extracte
91b0: 64 20 66 72 6f 6d 20 69 6e 20 4e 61 6d 65 43 6f  d from in NameCo
91c0: 6e 74 65 78 74 2e 70 53 72 63 4c 69 73 74 2e 20  ntext.pSrcList. 
91d0: 54 68 69 73 20 74 61 62 6c 65 20 6d 61 79 20 62  This table may b
91e0: 65 20 72 65 61 6c 0a 20 20 20 20 20 20 2a 2a 20  e real.      ** 
91f0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 6f  database table o
9200: 72 20 61 20 73 75 62 71 75 65 72 79 2e 0a 20 20  r a subquery..  
9210: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 61 62      */.      Tab
9220: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
9230: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
9240: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6c 75  e structure colu
9250: 6d 6e 20 69 73 20 65 78 74 72 61 63 74 65 64 20  mn is extracted 
9260: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 20 20 53 65  from */.      Se
9270: 6c 65 63 74 20 2a 70 53 20 3d 20 30 3b 20 20 20  lect *pS = 0;   
9280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c            /* Sel
9290: 65 63 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  ect the column i
92a0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
92b0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43   */.      int iC
92c0: 6f 6c 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ol = pExpr->iCol
92d0: 75 6d 6e 3b 20 20 2f 2a 20 49 6e 64 65 78 20 6f  umn;  /* Index o
92e0: 66 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 54 61 62  f column in pTab
92f0: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
9300: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
9310: 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29 3b 0a  K_AGG_COLUMN );.
9320: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9330: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
9340: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 77 68  LUMN );.      wh
9350: 69 6c 65 28 20 70 4e 43 20 26 26 20 21 70 54 61  ile( pNC && !pTa
9360: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 53 72 63  b ){.        Src
9370: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d  List *pTabList =
9380: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
9390: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
93a0: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
93b0: 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b   && pTabList->a[
93c0: 6a 5d 2e 69 43 75 72 73 6f 72 21 3d 70 45 78 70  j].iCursor!=pExp
93d0: 72 2d 3e 69 54 61 62 6c 65 3b 6a 2b 2b 29 3b 0a  r->iTable;j++);.
93e0: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 54          if( j<pT
93f0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 7b 0a  abList->nSrc ){.
9400: 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20 3d            pTab =
9410: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
9420: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
9430: 70 53 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  pS = pTabList->a
9440: 5b 6a 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [j].pSelect;.   
9450: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9460: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
9470: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
9480: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
9490: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
94a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 6f 6e          /* At on
94b0: 65 20 74 69 6d 65 2c 20 63 6f 64 65 20 73 75 63  e time, code suc
94c0: 68 20 61 73 20 22 53 45 4c 45 43 54 20 6e 65 77  h as "SELECT new
94d0: 2e 78 22 20 77 69 74 68 69 6e 20 61 20 74 72 69  .x" within a tri
94e0: 67 67 65 72 20 77 6f 75 6c 64 0a 20 20 20 20 20  gger would.     
94f0: 20 20 20 2a 2a 20 63 61 75 73 65 20 74 68 69 73     ** cause this
9500: 20 63 6f 6e 64 69 74 69 6f 6e 20 74 6f 20 72 75   condition to ru
9510: 6e 2e 20 20 53 69 6e 63 65 20 74 68 65 6e 2c 20  n.  Since then, 
9520: 77 65 20 68 61 76 65 20 72 65 73 74 72 75 63 74  we have restruct
9530: 75 72 65 64 20 68 6f 77 0a 20 20 20 20 20 20 20  ured how.       
9540: 20 2a 2a 20 74 72 69 67 67 65 72 20 63 6f 64 65   ** trigger code
9550: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 6e   is generated an
9560: 64 20 73 6f 20 74 68 69 73 20 63 6f 6e 64 69 74  d so this condit
9570: 69 6f 6e 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  ion is no longer
9580: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73   .        ** pos
9590: 73 69 62 6c 65 2e 20 48 6f 77 65 76 65 72 2c 20  sible. However, 
95a0: 69 74 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  it can still be 
95b0: 74 72 75 65 20 66 6f 72 20 73 74 61 74 65 6d 65  true for stateme
95c0: 6e 74 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20  nts like.       
95d0: 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
95e0: 67 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g:.        **.  
95f0: 20 20 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54        **   CREAT
9600: 45 20 54 41 42 4c 45 20 74 31 28 63 6f 6c 20 49  E TABLE t1(col I
9610: 4e 54 45 47 45 52 29 3b 0a 20 20 20 20 20 20 20  NTEGER);.       
9620: 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 28 53 45   **   SELECT (SE
9630: 4c 45 43 54 20 74 31 2e 63 6f 6c 29 20 46 52 4f  LECT t1.col) FRO
9640: 4d 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  M FROM t1;.     
9650: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
9660: 20 77 68 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65   when columnType
9670: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20  () is called on 
9680: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  the expression "
9690: 74 31 2e 63 6f 6c 22 20 69 6e 20 74 68 65 20 0a  t1.col" in the .
96a0: 20 20 20 20 20 20 20 20 2a 2a 20 73 75 62 2d 73          ** sub-s
96b0: 65 6c 65 63 74 2e 20 49 6e 20 74 68 69 73 20 63  elect. In this c
96c0: 61 73 65 2c 20 73 65 74 20 74 68 65 20 63 6f 6c  ase, set the col
96d0: 75 6d 6e 20 74 79 70 65 20 74 6f 20 4e 55 4c 4c  umn type to NULL
96e0: 2c 20 65 76 65 6e 0a 20 20 20 20 20 20 20 20 2a  , even.        *
96f0: 2a 20 74 68 6f 75 67 68 20 69 74 20 73 68 6f 75  * though it shou
9700: 6c 64 20 72 65 61 6c 6c 79 20 62 65 20 22 49 4e  ld really be "IN
9710: 54 45 47 45 52 22 2e 0a 20 20 20 20 20 20 20 20  TEGER"..        
9720: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
9730: 69 73 20 69 73 20 6e 6f 74 20 61 20 70 72 6f 62  is is not a prob
9740: 6c 65 6d 2c 20 61 73 20 74 68 65 20 63 6f 6c 75  lem, as the colu
9750: 6d 6e 20 74 79 70 65 20 6f 66 20 22 74 31 2e 63  mn type of "t1.c
9760: 6f 6c 22 20 69 73 20 6e 65 76 65 72 0a 20 20 20  ol" is never.   
9770: 20 20 20 20 20 2a 2a 20 75 73 65 64 2e 20 57 68       ** used. Wh
9780: 65 6e 20 63 6f 6c 75 6d 6e 54 79 70 65 28 29 20  en columnType() 
9790: 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  is called on the
97a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 0a 20 20 20   expression .   
97b0: 20 20 20 20 20 2a 2a 20 22 28 53 45 4c 45 43 54       ** "(SELECT
97c0: 20 74 31 2e 63 6f 6c 29 22 2c 20 74 68 65 20 63   t1.col)", the c
97d0: 6f 72 72 65 63 74 20 74 79 70 65 20 69 73 20 72  orrect type is r
97e0: 65 74 75 72 6e 65 64 20 28 73 65 65 20 74 68 65  eturned (see the
97f0: 20 54 4b 5f 53 45 4c 45 43 54 0a 20 20 20 20 20   TK_SELECT.     
9800: 20 20 20 2a 2a 20 62 72 61 6e 63 68 20 62 65 6c     ** branch bel
9810: 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ow.  */.        
9820: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
9830: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
9840: 61 62 20 26 26 20 70 45 78 70 72 2d 3e 70 54 61  ab && pExpr->pTa
9850: 62 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 20  b==pTab );.     
9860: 20 69 66 28 20 70 53 20 29 7b 0a 20 20 20 20 20   if( pS ){.     
9870: 20 20 20 2f 2a 20 54 68 65 20 22 74 61 62 6c 65     /* The "table
9880: 22 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  " is actually a 
9890: 73 75 62 2d 73 65 6c 65 63 74 20 6f 72 20 61 20  sub-select or a 
98a0: 76 69 65 77 20 69 6e 20 74 68 65 20 46 52 4f 4d  view in the FROM
98b0: 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
98c0: 2a 2a 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ** of the SELECT
98d0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 52 65 74 75   statement. Retu
98e0: 72 6e 20 74 68 65 20 64 65 63 6c 61 72 61 74 69  rn the declarati
98f0: 6f 6e 20 74 79 70 65 20 61 6e 64 20 6f 72 69 67  on type and orig
9900: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  in.        ** da
9910: 74 61 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ta for the resul
9920: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  t-set column of 
9930: 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 2e 0a  the sub-select..
9940: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
9950: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26     if( iCol>=0 &
9960: 26 20 41 4c 57 41 59 53 28 69 43 6f 6c 3c 70 53  & ALWAYS(iCol<pS
9970: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  ->pEList->nExpr)
9980: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9990: 20 49 66 20 69 43 6f 6c 20 69 73 20 6c 65 73 73   If iCol is less
99a0: 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
99b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
99c0: 72 65 71 75 65 73 74 73 20 74 68 65 0a 20 20 20  requests the.   
99d0: 20 20 20 20 20 20 20 2a 2a 20 72 6f 77 69 64 20         ** rowid 
99e0: 6f 66 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63  of the sub-selec
99f0: 74 20 6f 72 20 76 69 65 77 2e 20 54 68 69 73 20  t or view. This 
9a00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6c 65  expression is le
9a10: 67 61 6c 20 28 73 65 65 20 0a 20 20 20 20 20 20  gal (see .      
9a20: 20 20 20 20 2a 2a 20 74 65 73 74 20 63 61 73 65      ** test case
9a30: 20 6d 69 73 63 32 2e 32 2e 32 29 20 2d 20 69 74   misc2.2.2) - it
9a40: 20 61 6c 77 61 79 73 20 65 76 61 6c 75 61 74 65   always evaluate
9a50: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  s to NULL..     
9a60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9a70: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e    NameContext sN
9a80: 43 3b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  C;.          Exp
9a90: 72 20 2a 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73  r *p = pS->pELis
9aa0: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72  t->a[iCol].pExpr
9ab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e  ;.          sNC.
9ac0: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 2d 3e 70  pSrcList = pS->p
9ad0: 53 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  Src;.          s
9ae0: 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4e 43 3b 0a  NC.pNext = pNC;.
9af0: 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70 50            sNC.pP
9b00: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
9b10: 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54  se;.          zT
9b20: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
9b30: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
9b40: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
9b50: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
9b60: 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20   .        }.    
9b70: 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
9b80: 59 53 28 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  YS(pTab->pSchema
9b90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
9ba0: 41 20 72 65 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  A real table */.
9bb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9bc0: 21 70 53 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !pS );.        i
9bd0: 66 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c  f( iCol<0 ) iCol
9be0: 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
9bf0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
9c00: 69 43 6f 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f  iCol==-1 || (iCo
9c10: 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61  l>=0 && iCol<pTa
9c20: 62 2d 3e 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20  b->nCol) );.    
9c30: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
9c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70  {.          zTyp
9c50: 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20  e = "INTEGER";. 
9c60: 20 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e           zOrigin
9c70: 43 6f 6c 20 3d 20 22 72 6f 77 69 64 22 3b 0a 20  Col = "rowid";. 
9c80: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9c90: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
9ca0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9cb0: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
9cc0: 20 20 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20 70    zOriginCol = p
9cd0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9ce0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d  zName;.        }
9cf0: 0a 20 20 20 20 20 20 20 20 7a 4f 72 69 67 69 6e  .        zOrigin
9d00: 54 61 62 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  Tab = pTab->zNam
9d10: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
9d20: 4e 43 2d 3e 70 50 61 72 73 65 20 29 7b 0a 20 20  NC->pParse ){.  
9d30: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 20          int iDb 
9d40: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
9d50: 6f 49 6e 64 65 78 28 70 4e 43 2d 3e 70 50 61 72  oIndex(pNC->pPar
9d60: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
9d70: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
9d80: 20 20 7a 4f 72 69 67 69 6e 44 62 20 3d 20 70 4e    zOriginDb = pN
9d90: 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  C->pParse->db->a
9da0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
9db0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9dc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9dd0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
9de0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
9df0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
9e00: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
9e10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
9e20: 73 20 61 20 73 75 62 2d 73 65 6c 65 63 74 2e 20  s a sub-select. 
9e30: 52 65 74 75 72 6e 20 74 68 65 20 64 65 63 6c 61  Return the decla
9e40: 72 61 74 69 6f 6e 20 74 79 70 65 20 61 6e 64 0a  ration type and.
9e50: 20 20 20 20 20 20 2a 2a 20 6f 72 69 67 69 6e 20        ** origin 
9e60: 69 6e 66 6f 20 66 6f 72 20 74 68 65 20 73 69 6e  info for the sin
9e70: 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  gle column in th
9e80: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
9e90: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 20  the SELECT.     
9ea0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20   ** statement.. 
9eb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4e 61       */.      Na
9ec0: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20  meContext sNC;. 
9ed0: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 20       Select *pS 
9ee0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  = pExpr->x.pSele
9ef0: 63 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ct;.      Expr *
9f00: 70 20 3d 20 70 53 2d 3e 70 45 4c 69 73 74 2d 3e  p = pS->pEList->
9f10: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
9f20: 20 20 61 73 73 65 72 74 28 20 45 78 70 72 48 61    assert( ExprHa
9f30: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
9f40: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
9f50: 3b 0a 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63  ;.      sNC.pSrc
9f60: 4c 69 73 74 20 3d 20 70 53 2d 3e 70 53 72 63 3b  List = pS->pSrc;
9f70: 0a 20 20 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  .      sNC.pNext
9f80: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 73 4e   = pNC;.      sN
9f90: 43 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  C.pParse = pNC->
9fa0: 70 50 61 72 73 65 3b 0a 20 20 20 20 20 20 7a 54  pParse;.      zT
9fb0: 79 70 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65  ype = columnType
9fc0: 28 26 73 4e 43 2c 20 70 2c 20 26 7a 4f 72 69 67  (&sNC, p, &zOrig
9fd0: 69 6e 44 62 2c 20 26 7a 4f 72 69 67 69 6e 54 61  inDb, &zOriginTa
9fe0: 62 2c 20 26 7a 4f 72 69 67 69 6e 43 6f 6c 29 3b  b, &zOriginCol);
9ff0: 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
a000: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a010: 20 20 0a 20 20 69 66 28 20 70 7a 4f 72 69 67 69    .  if( pzOrigi
a020: 6e 44 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nDb ){.    asser
a030: 74 28 20 70 7a 4f 72 69 67 69 6e 54 61 62 20 26  t( pzOriginTab &
a040: 26 20 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 29 3b  & pzOriginCol );
a050: 0a 20 20 20 20 2a 70 7a 4f 72 69 67 69 6e 44 62  .    *pzOriginDb
a060: 20 3d 20 7a 4f 72 69 67 69 6e 44 62 3b 0a 20 20   = zOriginDb;.  
a070: 20 20 2a 70 7a 4f 72 69 67 69 6e 54 61 62 20 3d    *pzOriginTab =
a080: 20 7a 4f 72 69 67 69 6e 54 61 62 3b 0a 20 20 20   zOriginTab;.   
a090: 20 2a 70 7a 4f 72 69 67 69 6e 43 6f 6c 20 3d 20   *pzOriginCol = 
a0a0: 7a 4f 72 69 67 69 6e 43 6f 6c 3b 0a 20 20 7d 0a  zOriginCol;.  }.
a0b0: 20 20 72 65 74 75 72 6e 20 7a 54 79 70 65 3b 0a    return zType;.
a0c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
a0d0: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
a0e0: 20 74 65 6c 6c 20 74 68 65 20 56 44 42 45 20 74   tell the VDBE t
a0f0: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 74  he declaration t
a100: 79 70 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a  ypes of columns.
a110: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
a120: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
a130: 76 6f 69 64 20 67 65 6e 65 72 61 74 65 43 6f 6c  void generateCol
a140: 75 6d 6e 54 79 70 65 73 28 0a 20 20 50 61 72 73  umnTypes(.  Pars
a150: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a160: 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78  /* Parser contex
a170: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
a180: 70 54 61 62 4c 69 73 74 2c 20 20 2f 2a 20 4c 69  pTabList,  /* Li
a190: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 2a 2f 0a  st of tables */.
a1a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a1b0: 73 74 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  st    /* Express
a1c0: 69 6f 6e 73 20 64 65 66 69 6e 69 6e 67 20 74 68  ions defining th
a1d0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
a1e0: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a1f0: 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
a200: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a210: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
a220: 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
a230: 74 20 73 4e 43 3b 0a 20 20 73 4e 43 2e 70 53 72  t sNC;.  sNC.pSr
a240: 63 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  cList = pTabList
a250: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
a260: 20 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69   pParse;.  for(i
a270: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
a280: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
a290: 78 70 72 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d  xpr *p = pEList-
a2a0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
a2b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
a2c0: 70 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  pe;.#ifdef SQLIT
a2d0: 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
a2e0: 4d 45 54 41 44 41 54 41 0a 20 20 20 20 63 6f 6e  METADATA.    con
a2f0: 73 74 20 63 68 61 72 20 2a 7a 4f 72 69 67 44 62  st char *zOrigDb
a300: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
a310: 63 68 61 72 20 2a 7a 4f 72 69 67 54 61 62 20 3d  char *zOrigTab =
a320: 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
a330: 61 72 20 2a 7a 4f 72 69 67 43 6f 6c 20 3d 20 30  ar *zOrigCol = 0
a340: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 63 6f  ;.    zType = co
a350: 6c 75 6d 6e 54 79 70 65 28 26 73 4e 43 2c 20 70  lumnType(&sNC, p
a360: 2c 20 26 7a 4f 72 69 67 44 62 2c 20 26 7a 4f 72  , &zOrigDb, &zOr
a370: 69 67 54 61 62 2c 20 26 7a 4f 72 69 67 43 6f 6c  igTab, &zOrigCol
a380: 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 76  );..    /* The v
a390: 64 62 65 20 6d 75 73 74 20 6d 61 6b 65 20 69 74  dbe must make it
a3a0: 73 20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 74 68  s own copy of th
a3b0: 65 20 63 6f 6c 75 6d 6e 2d 74 79 70 65 20 61 6e  e column-type an
a3c0: 64 20 6f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20  d other .    ** 
a3d0: 63 6f 6c 75 6d 6e 20 73 70 65 63 69 66 69 63 20  column specific 
a3e0: 73 74 72 69 6e 67 73 2c 20 69 6e 20 63 61 73 65  strings, in case
a3f0: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20 72   the schema is r
a400: 65 73 65 74 20 62 65 66 6f 72 65 20 74 68 69 73  eset before this
a410: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
a420: 6d 61 63 68 69 6e 65 20 69 73 20 64 65 6c 65 74  machine is delet
a430: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
a440: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
a450: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
a460: 4d 45 5f 44 41 54 41 42 41 53 45 2c 20 7a 4f 72  ME_DATABASE, zOr
a470: 69 67 44 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  igDb, SQLITE_TRA
a480: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
a490: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a4a0: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a4b0: 5f 54 41 42 4c 45 2c 20 7a 4f 72 69 67 54 61 62  _TABLE, zOrigTab
a4c0: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a4d0: 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
a4e0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76  VdbeSetColName(v
a4f0: 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 43 4f 4c  , i, COLNAME_COL
a500: 55 4d 4e 2c 20 7a 4f 72 69 67 43 6f 6c 2c 20 53  UMN, zOrigCol, S
a510: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
a520: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7a 54 79 70  ;.#else.    zTyp
a530: 65 20 3d 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26  e = columnType(&
a540: 73 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29  sNC, p, 0, 0, 0)
a550: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
a560: 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61  ite3VdbeSetColNa
a570: 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41 4d 45  me(v, i, COLNAME
a580: 5f 44 45 43 4c 54 59 50 45 2c 20 7a 54 79 70 65  _DECLTYPE, zType
a590: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
a5a0: 4e 54 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  NT);.  }.#endif 
a5b0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
a5c0: 45 43 4c 54 59 50 45 20 2a 2f 0a 7d 0a 0a 2f 2a  ECLTYPE */.}../*
a5d0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
a5e0: 65 20 74 68 61 74 20 77 69 6c 6c 20 74 65 6c 6c  e that will tell
a5f0: 20 74 68 65 20 56 44 42 45 20 74 68 65 20 6e 61   the VDBE the na
a600: 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 0a 2a  mes of columns.*
a610: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
a620: 73 65 74 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  set.  This infor
a630: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
a640: 6f 20 70 72 6f 76 69 64 65 20 74 68 65 0a 2a 2a  o provide the.**
a650: 20 61 7a 43 6f 6c 5b 5d 20 76 61 6c 75 65 73 20   azCol[] values 
a660: 69 6e 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 2e  in the callback.
a670: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a680: 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61  generateColumnNa
a690: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
a6a0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
a6b0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
a6c0: 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
a6d0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
a6e0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 45 78 70   tables */.  Exp
a6f0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 20 20  rList *pEList   
a700: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 20   /* Expressions 
a710: 64 65 66 69 6e 69 6e 67 20 74 68 65 20 72 65 73  defining the res
a720: 75 6c 74 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20  ult set */.){.  
a730: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a740: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69  ->pVdbe;.  int i
a750: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
a760: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a770: 0a 20 20 69 6e 74 20 66 75 6c 6c 4e 61 6d 65 73  .  int fullNames
a780: 2c 20 73 68 6f 72 74 4e 61 6d 65 73 3b 0a 0a 23  , shortNames;..#
a790: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a7a0: 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 2f 2a 20  IT_EXPLAIN.  /* 
a7b0: 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 45 58  If this is an EX
a7c0: 50 4c 41 49 4e 2c 20 73 6b 69 70 20 74 68 69 73  PLAIN, skip this
a7d0: 20 73 74 65 70 20 2a 2f 0a 20 20 69 66 28 20 70   step */.  if( p
a7e0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29  Parse->explain )
a7f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
a800: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
a810: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
a820: 53 65 74 20 7c 7c 20 4e 45 56 45 52 28 76 3d 3d  Set || NEVER(v==
a830: 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  0) || db->malloc
a840: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
a850: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61  .  pParse->colNa
a860: 6d 65 73 53 65 74 20 3d 20 31 3b 0a 20 20 66 75  mesSet = 1;.  fu
a870: 6c 6c 4e 61 6d 65 73 20 3d 20 28 64 62 2d 3e 66  llNames = (db->f
a880: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 75  lags & SQLITE_Fu
a890: 6c 6c 43 6f 6c 4e 61 6d 65 73 29 21 3d 30 3b 0a  llColNames)!=0;.
a8a0: 20 20 73 68 6f 72 74 4e 61 6d 65 73 20 3d 20 28    shortNames = (
a8b0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
a8c0: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
a8d0: 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 56  )!=0;.  sqlite3V
a8e0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 76 2c  dbeSetNumCols(v,
a8f0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
a900: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
a910: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
a920: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 3b 0a  ){.    Expr *p;.
a930: 20 20 20 20 70 20 3d 20 70 45 4c 69 73 74 2d 3e      p = pEList->
a940: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
a950: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
a960: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a970: 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  if( pEList->a[i]
a980: 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
a990: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
a9a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
a9b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a9c0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c  dbeSetColName(v,
a9d0: 20 69 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45   i, COLNAME_NAME
a9e0: 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  , zName, SQLITE_
a9f0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
aa00: 7d 65 6c 73 65 20 69 66 28 20 28 70 2d 3e 6f 70  }else if( (p->op
aa10: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  ==TK_COLUMN || p
aa20: 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c  ->op==TK_AGG_COL
aa30: 55 4d 4e 29 20 26 26 20 70 54 61 62 4c 69 73 74  UMN) && pTabList
aa40: 20 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65 20   ){.      Table 
aa50: 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 63 68 61  *pTab;.      cha
aa60: 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 69  r *zCol;.      i
aa70: 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 69 43 6f  nt iCol = p->iCo
aa80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28  lumn;.      for(
aa90: 6a 3d 30 3b 20 41 4c 57 41 59 53 28 6a 3c 70 54  j=0; ALWAYS(j<pT
aaa0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 20 6a  abList->nSrc); j
aab0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
aac0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   pTabList->a[j].
aad0: 69 43 75 72 73 6f 72 3d 3d 70 2d 3e 69 54 61 62  iCursor==p->iTab
aae0: 6c 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  le ) break;.    
aaf0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
ab00: 28 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ( j<pTabList->nS
ab10: 72 63 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  rc );.      pTab
ab20: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a   = pTabList->a[j
ab30: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 69 66  ].pTab;.      if
ab40: 28 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20  ( iCol<0 ) iCol 
ab50: 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
ab60: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f       assert( iCo
ab70: 6c 3d 3d 2d 31 20 7c 7c 20 28 69 43 6f 6c 3e 3d  l==-1 || (iCol>=
ab80: 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e  0 && iCol<pTab->
ab90: 6e 43 6f 6c 29 20 29 3b 0a 20 20 20 20 20 20 69  nCol) );.      i
aba0: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
abb0: 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 72 6f 77       zCol = "row
abc0: 69 64 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  id";.      }else
abd0: 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d  {.        zCol =
abe0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
abf0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ].zName;.      }
ac00: 0a 20 20 20 20 20 20 69 66 28 20 21 73 68 6f 72  .      if( !shor
ac10: 74 4e 61 6d 65 73 20 26 26 20 21 66 75 6c 6c 4e  tNames && !fullN
ac20: 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20  ames ){.        
ac30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f  sqlite3VdbeSetCo
ac40: 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e  lName(v, i, COLN
ac50: 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20 20 20  AME_NAME, .     
ac60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
ac70: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
ac80: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
ac90: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
aca0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
acb0: 20 66 75 6c 6c 4e 61 6d 65 73 20 29 7b 0a 20 20   fullNames ){.  
acc0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
acd0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
ace0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
acf0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2e 25 73  rintf(db, "%s.%s
ad00: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  ", pTab->zName, 
ad10: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  zCol);.        s
ad20: 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c  qlite3VdbeSetCol
ad30: 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f 4c 4e 41  Name(v, i, COLNA
ad40: 4d 45 5f 4e 41 4d 45 2c 20 7a 4e 61 6d 65 2c 20  ME_NAME, zName, 
ad50: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
ad60: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
ad70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ad80: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 76 2c 20 69  eSetColName(v, i
ad90: 2c 20 43 4f 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20  , COLNAME_NAME, 
ada0: 7a 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 54 52 41  zCol, SQLITE_TRA
adb0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 7d  NSIENT);.      }
adc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
add0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
ade0: 43 6f 6c 4e 61 6d 65 28 76 2c 20 69 2c 20 43 4f  ColName(v, i, CO
adf0: 4c 4e 41 4d 45 5f 4e 41 4d 45 2c 20 0a 20 20 20  LNAME_NAME, .   
ae00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
ae10: 53 74 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73  StrDup(db, pELis
ae20: 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e 29 2c 20  t->a[i].zSpan), 
ae30: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 29 3b  SQLITE_DYNAMIC);
ae40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 67 65 6e  .    }.  }.  gen
ae50: 65 72 61 74 65 43 6f 6c 75 6d 6e 54 79 70 65 73  erateColumnTypes
ae60: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
ae70: 74 2c 20 70 45 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  t, pEList);.}../
ae80: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 61 6e 20  *.** Given a an 
ae90: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
aea0: 28 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79  (which is really
aeb0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 65 78 70   the list of exp
aec0: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 74 68 61 74  ressions.** that
aed0: 20 66 6f 72 6d 20 74 68 65 20 72 65 73 75 6c 74   form the result
aee0: 20 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54   set of a SELECT
aef0: 20 73 74 61 74 65 6d 65 6e 74 29 20 63 6f 6d 70   statement) comp
af00: 75 74 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  ute appropriate.
af10: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ** column names 
af20: 66 6f 72 20 61 20 74 61 62 6c 65 20 74 68 61 74  for a table that
af30: 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
af40: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
af50: 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 6c 75 6d  .**.** All colum
af60: 6e 20 6e 61 6d 65 73 20 77 69 6c 6c 20 62 65 20  n names will be 
af70: 75 6e 69 71 75 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  unique..**.** On
af80: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
af90: 6d 65 73 20 61 72 65 20 63 6f 6d 70 75 74 65 64  mes are computed
afa0: 2e 20 20 43 6f 6c 75 6d 6e 2e 7a 54 79 70 65 2c  .  Column.zType,
afb0: 20 43 6f 6c 75 6d 6e 2e 7a 43 6f 6c 6c 2c 0a 2a   Column.zColl,.*
afc0: 2a 20 61 6e 64 20 6f 74 68 65 72 20 66 69 65 6c  * and other fiel
afd0: 64 73 20 6f 66 20 43 6f 6c 75 6d 6e 20 61 72 65  ds of Column are
afe0: 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   zeroed..**.** R
aff0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
b000: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
b010: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
b020: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
b030: 2c 0a 2a 2a 20 73 74 6f 72 65 20 4e 55 4c 4c 20  ,.** store NULL 
b040: 69 6e 20 2a 70 61 43 6f 6c 20 61 6e 64 20 30 20  in *paCol and 0 
b050: 69 6e 20 2a 70 6e 43 6f 6c 20 61 6e 64 20 72 65  in *pnCol and re
b060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b070: 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
b080: 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
b090: 6f 6d 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  omExprList(.  Pa
b0a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
b0b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
b0c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b0d0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
b0e0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 20 6c 69        /* Expr li
b0f0: 73 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f  st from which to
b100: 20 64 65 72 69 76 65 20 63 6f 6c 75 6d 6e 20 6e   derive column n
b110: 61 6d 65 73 20 2a 2f 0a 20 20 69 31 36 20 2a 70  ames */.  i16 *p
b120: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
b130: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
b140: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
b150: 20 68 65 72 65 20 2a 2f 0a 20 20 43 6f 6c 75 6d   here */.  Colum
b160: 6e 20 2a 2a 70 61 43 6f 6c 20 20 20 20 20 20 20  n **paCol       
b170: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
b180: 6e 65 77 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  new column list 
b190: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
b1a0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
b1b0: 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 44 61 74 61  e->db;   /* Data
b1c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
b1d0: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b200: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20  s */.  int cnt; 
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 20 2f 2a 20 49 6e 64 65 78 20 61 64 64 65     /* Index adde
b230: 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6e 61  d to make the na
b240: 6d 65 20 75 6e 69 71 75 65 20 2a 2f 0a 20 20 43  me unique */.  C
b250: 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 2a 70 43  olumn *aCol, *pC
b260: 6f 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ol;        /* Fo
b270: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 72  r looping over r
b280: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
b290: 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20  .  int nCol;    
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b2b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
b2c0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
b2d0: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
b2e0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
b2f0: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
b300: 73 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c  sion for a singl
b310: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  e result column 
b320: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
b330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b340: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20   /* Column name 
b350: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 61 6d 65   /* Size of name
b380: 20 69 6e 20 7a 4e 61 6d 65 5b 5d 20 2a 2f 0a 0a   in zName[] */..
b390: 20 20 69 66 28 20 70 45 4c 69 73 74 20 29 7b 0a    if( pEList ){.
b3a0: 20 20 20 20 6e 43 6f 6c 20 3d 20 70 45 4c 69 73      nCol = pELis
b3b0: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 61 43  t->nExpr;.    aC
b3c0: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ol = sqlite3DbMa
b3d0: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
b3e0: 65 6f 66 28 61 43 6f 6c 5b 30 5d 29 2a 6e 43 6f  eof(aCol[0])*nCo
b3f0: 6c 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  l);.    testcase
b400: 28 20 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 7d  ( aCol==0 );.  }
b410: 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
b420: 20 30 3b 0a 20 20 20 20 61 43 6f 6c 20 3d 20 30   0;.    aCol = 0
b430: 3b 0a 20 20 7d 0a 20 20 2a 70 6e 43 6f 6c 20 3d  ;.  }.  *pnCol =
b440: 20 6e 43 6f 6c 3b 0a 20 20 2a 70 61 43 6f 6c 20   nCol;.  *paCol 
b450: 3d 20 61 43 6f 6c 3b 0a 0a 20 20 66 6f 72 28 69  = aCol;..  for(i
b460: 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f 6c 3b 20 69  =0, pCol=aCol; i
b470: 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  <nCol; i++, pCol
b480: 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 47 65 74 20  ++){.    /* Get 
b490: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6e  an appropriate n
b4a0: 61 6d 65 20 66 6f 72 20 74 68 65 20 63 6f 6c 75  ame for the colu
b4b0: 6d 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  mn.    */.    p 
b4c0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
b4d0: 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
b4e0: 28 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 7c  ( p->pRight==0 |
b4f0: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
b500: 79 28 70 2d 3e 70 52 69 67 68 74 2c 20 45 50 5f  y(p->pRight, EP_
b510: 49 6e 74 56 61 6c 75 65 29 0a 20 20 20 20 20 20  IntValue).      
b520: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 70           || p->p
b530: 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3d  Right->u.zToken=
b540: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 2d  =0 || p->pRight-
b550: 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
b560: 29 3b 0a 20 20 20 20 69 66 28 20 28 7a 4e 61 6d  );.    if( (zNam
b570: 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  e = pEList->a[i]
b580: 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  .zName)!=0 ){.  
b590: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f      /* If the co
b5a0: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 61 6e  lumn contains an
b5b0: 20 22 41 53 20 3c 6e 61 6d 65 3e 22 20 70 68 72   "AS <name>" phr
b5c0: 61 73 65 2c 20 75 73 65 20 3c 6e 61 6d 65 3e 20  ase, use <name> 
b5d0: 61 73 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  as the name */. 
b5e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
b5f0: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
b600: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c   zName);.    }el
b610: 73 65 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  se{.      Expr *
b620: 70 43 6f 6c 45 78 70 72 20 3d 20 70 3b 20 20 2f  pColExpr = p;  /
b630: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b640: 20 74 68 61 74 20 69 73 20 74 68 65 20 72 65 73   that is the res
b650: 75 6c 74 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ult column name 
b660: 2a 2f 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  */.      Table *
b670: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  pTab;         /*
b680: 20 54 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   Table associate
b690: 64 20 77 69 74 68 20 74 68 69 73 20 65 78 70 72  d with this expr
b6a0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
b6b0: 77 68 69 6c 65 28 20 70 43 6f 6c 45 78 70 72 2d  while( pColExpr-
b6c0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20  >op==TK_DOT ){. 
b6d0: 20 20 20 20 20 20 20 70 43 6f 6c 45 78 70 72 20         pColExpr 
b6e0: 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70 52 69 67  = pColExpr->pRig
b6f0: 68 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ht;.        asse
b700: 72 74 28 20 70 43 6f 6c 45 78 70 72 21 3d 30 20  rt( pColExpr!=0 
b710: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b720: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
b730: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
b740: 41 4c 57 41 59 53 28 70 43 6f 6c 45 78 70 72 2d  ALWAYS(pColExpr-
b750: 3e 70 54 61 62 21 3d 30 29 20 29 7b 0a 20 20 20  >pTab!=0) ){.   
b760: 20 20 20 20 20 2f 2a 20 46 6f 72 20 63 6f 6c 75       /* For colu
b770: 6d 6e 73 20 75 73 65 20 74 68 65 20 63 6f 6c 75  mns use the colu
b780: 6d 6e 20 6e 61 6d 65 20 6e 61 6d 65 20 2a 2f 0a  mn name name */.
b790: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
b7a0: 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 69 43 6f   = pColExpr->iCo
b7b0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  lumn;.        pT
b7c0: 61 62 20 3d 20 70 43 6f 6c 45 78 70 72 2d 3e 70  ab = pColExpr->p
b7d0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
b7e0: 20 69 43 6f 6c 3c 30 20 29 20 69 43 6f 6c 20 3d   iCol<0 ) iCol =
b7f0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
b800: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
b810: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
b820: 20 22 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20   "%s",.         
b830: 20 20 20 20 20 20 20 20 69 43 6f 6c 3e 3d 30 20          iCol>=0 
b840: 3f 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  ? pTab->aCol[iCo
b850: 6c 5d 2e 7a 4e 61 6d 65 20 3a 20 22 72 6f 77 69  l].zName : "rowi
b860: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
b870: 20 69 66 28 20 70 43 6f 6c 45 78 70 72 2d 3e 6f   if( pColExpr->o
b880: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
b890: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
b8a0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 43 6f  rHasProperty(pCo
b8b0: 6c 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  lExpr, EP_IntVal
b8c0: 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  ue) );.        z
b8d0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
b8e0: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22 2c 20  rintf(db, "%s", 
b8f0: 70 43 6f 6c 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  pColExpr->u.zTok
b900: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  en);.      }else
b910: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  {.        /* Use
b920: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65   the original te
b930: 78 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  xt of the column
b940: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 69   expression as i
b950: 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20  ts name */.     
b960: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
b970: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
b980: 73 22 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  s", pEList->a[i]
b990: 2e 7a 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d  .zSpan);.      }
b9a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
b9b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b9c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b9d0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
b9e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b9f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
ba00: 6b 65 20 73 75 72 65 20 74 68 65 20 63 6f 6c 75  ke sure the colu
ba10: 6d 6e 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  mn name is uniqu
ba20: 65 2e 20 20 49 66 20 74 68 65 20 6e 61 6d 65 20  e.  If the name 
ba30: 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 2c 0a 20  is not unique,. 
ba40: 20 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 20 69     ** append a i
ba50: 6e 74 65 67 65 72 20 74 6f 20 74 68 65 20 6e 61  nteger to the na
ba60: 6d 65 20 73 6f 20 74 68 61 74 20 69 74 20 62 65  me so that it be
ba70: 63 6f 6d 65 73 20 75 6e 69 71 75 65 2e 0a 20 20  comes unique..  
ba80: 20 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 20 3d    */.    nName =
ba90: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
baa0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
bab0: 28 6a 3d 63 6e 74 3d 30 3b 20 6a 3c 69 3b 20 6a  (j=cnt=0; j<i; j
bac0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
bad0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 61 43  qlite3StrICmp(aC
bae0: 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61  ol[j].zName, zNa
baf0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
bb00: 20 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d 65    char *zNewName
bb10: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 5b  ;.        zName[
bb20: 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20  nName] = 0;.    
bb30: 20 20 20 20 7a 4e 65 77 4e 61 6d 65 20 3d 20 73      zNewName = s
bb40: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
bb50: 2c 20 22 25 73 3a 25 64 22 2c 20 7a 4e 61 6d 65  , "%s:%d", zName
bb60: 2c 20 2b 2b 63 6e 74 29 3b 0a 20 20 20 20 20 20  , ++cnt);.      
bb70: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
bb80: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
bb90: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 4e 65 77      zName = zNew
bba0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 6a 20  Name;.        j 
bbb0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66  = -1;.        if
bbc0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 62 72 65  ( zName==0 ) bre
bbd0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
bbe0: 7d 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  }.    pCol->zNam
bbf0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  e = zName;.  }. 
bc00: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
bc10: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 6f 72  ailed ){.    for
bc20: 28 6a 3d 30 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 7b  (j=0; j<i; j++){
bc30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
bc40: 46 72 65 65 28 64 62 2c 20 61 43 6f 6c 5b 6a 5d  Free(db, aCol[j]
bc50: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  .zName);.    }. 
bc60: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
bc70: 28 64 62 2c 20 61 43 6f 6c 29 3b 0a 20 20 20 20  (db, aCol);.    
bc80: 2a 70 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *paCol = 0;.    
bc90: 2a 70 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  *pnCol = 0;.    
bca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
bcb0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
bcc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
bcd0: 2f 2a 0a 2a 2a 20 41 64 64 20 74 79 70 65 20 61  /*.** Add type a
bce0: 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 69 6e 66  nd collation inf
bcf0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61 20 63 6f  ormation to a co
bd00: 6c 75 6d 6e 20 6c 69 73 74 20 62 61 73 65 64 20  lumn list based 
bd10: 6f 6e 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73  on.** a SELECT s
bd20: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 0a 2a 2a  tatement..** .**
bd30: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6c 69 73 74   The column list
bd40: 20 70 72 65 73 75 6d 61 62 6c 79 20 63 61 6d 65   presumably came
bd50: 20 66 72 6f 6d 20 73 65 6c 65 63 74 43 6f 6c 75   from selectColu
bd60: 6d 6e 4e 61 6d 65 73 46 72 6f 6d 45 78 70 72 4c  mnNamesFromExprL
bd70: 69 73 74 28 29 2e 0a 2a 2a 20 54 68 65 20 63 6f  ist()..** The co
bd80: 6c 75 6d 6e 20 6c 69 73 74 20 68 61 73 20 6f 6e  lumn list has on
bd90: 6c 79 20 6e 61 6d 65 73 2c 20 6e 6f 74 20 74 79  ly names, not ty
bda0: 70 65 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e  pes or collation
bdb0: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74  s.  This.** rout
bdc0: 69 6e 65 20 67 6f 65 73 20 74 68 72 6f 75 67 68  ine goes through
bdd0: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 74 79   and adds the ty
bde0: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
bdf0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ns..**.** This r
be00: 6f 75 74 69 6e 65 20 72 65 71 75 69 72 65 73 20  outine requires 
be10: 74 68 61 74 20 61 6c 6c 20 69 64 65 6e 74 69 66  that all identif
be20: 69 65 72 73 20 69 6e 20 74 68 65 20 53 45 4c 45  iers in the SELE
be30: 43 54 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  CT.** statement 
be40: 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2f 0a  be resolved..*/.
be50: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 6c 65  static void sele
be60: 63 74 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 41  ctAddColumnTypeA
be70: 6e 64 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 50  ndCollation(.  P
be80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
be90: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
bea0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 69 6e  contexts */.  in
beb0: 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t nCol,         
bec0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bed0: 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 43 6f   columns */.  Co
bee0: 6c 75 6d 6e 20 2a 61 43 6f 6c 2c 20 20 20 20 20  lumn *aCol,     
bef0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63      /* List of c
bf00: 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 53 65 6c 65  olumns */.  Sele
bf10: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
bf20: 20 20 2f 2a 20 53 45 4c 45 43 54 20 75 73 65 64    /* SELECT used
bf30: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 79   to determine ty
bf40: 70 65 73 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f  pes and collatio
bf50: 6e 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ns */.){.  sqlit
bf60: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
bf70: 3e 64 62 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  >db;.  NameConte
bf80: 78 74 20 73 4e 43 3b 0a 20 20 43 6f 6c 75 6d 6e  xt sNC;.  Column
bf90: 20 2a 70 43 6f 6c 3b 0a 20 20 43 6f 6c 6c 53 65   *pCol;.  CollSe
bfa0: 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
bfb0: 69 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20 20  i;.  Expr *p;.  
bfc0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
bfd0: 69 74 65 6d 20 2a 61 3b 0a 0a 20 20 61 73 73 65  item *a;..  asse
bfe0: 72 74 28 20 70 53 65 6c 65 63 74 21 3d 30 20 29  rt( pSelect!=0 )
bff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 53 65  ;.  assert( (pSe
c000: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
c010: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 21 3d 30   SF_Resolved)!=0
c020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
c030: 6f 6c 3d 3d 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ol==pSelect->pEL
c040: 69 73 74 2d 3e 6e 45 78 70 72 20 7c 7c 20 64 62  ist->nExpr || db
c050: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c060: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
c070: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
c080: 6e 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  n;.  memset(&sNC
c090: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
c0a0: 29 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  );.  sNC.pSrcLis
c0b0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
c0c0: 63 3b 0a 20 20 61 20 3d 20 70 53 65 6c 65 63 74  c;.  a = pSelect
c0d0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  ->pEList->a;.  f
c0e0: 6f 72 28 69 3d 30 2c 20 70 43 6f 6c 3d 61 43 6f  or(i=0, pCol=aCo
c0f0: 6c 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  l; i<nCol; i++, 
c100: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  pCol++){.    p =
c110: 20 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20   a[i].pExpr;.   
c120: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
c130: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
c140: 62 2c 20 63 6f 6c 75 6d 6e 54 79 70 65 28 26 73  b, columnType(&s
c150: 4e 43 2c 20 70 2c 20 30 2c 20 30 2c 20 30 29 29  NC, p, 0, 0, 0))
c160: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69  ;.    pCol->affi
c170: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78  nity = sqlite3Ex
c180: 70 72 41 66 66 69 6e 69 74 79 28 70 29 3b 0a 20  prAffinity(p);. 
c190: 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66     if( pCol->aff
c1a0: 69 6e 69 74 79 3d 3d 30 20 29 20 70 43 6f 6c 2d  inity==0 ) pCol-
c1b0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
c1c0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
c1d0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
c1e0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
c1f0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  se, p);.    if( 
c200: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
c210: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 20 3d 20 73 71 6c  Col->zColl = sql
c220: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
c230: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
c240: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c250: 2a 2a 20 47 69 76 65 6e 20 61 20 53 45 4c 45 43  ** Given a SELEC
c260: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 67 65 6e  T statement, gen
c270: 65 72 61 74 65 20 61 20 54 61 62 6c 65 20 73 74  erate a Table st
c280: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
c290: 63 72 69 62 65 73 0a 2a 2a 20 74 68 65 20 72 65  cribes.** the re
c2a0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 61 74  sult set of that
c2b0: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 54 61 62 6c   SELECT..*/.Tabl
c2c0: 65 20 2a 73 71 6c 69 74 65 33 52 65 73 75 6c 74  e *sqlite3Result
c2d0: 53 65 74 4f 66 53 65 6c 65 63 74 28 50 61 72 73  SetOfSelect(Pars
c2e0: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
c2f0: 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 54  t *pSelect){.  T
c300: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 73 71  able *pTab;.  sq
c310: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
c320: 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 73 61  se->db;.  int sa
c330: 76 65 64 46 6c 61 67 73 3b 0a 0a 20 20 73 61 76  vedFlags;..  sav
c340: 65 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  edFlags = db->fl
c350: 61 67 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ags;.  db->flags
c360: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 46 75 6c 6c   &= ~SQLITE_Full
c370: 43 6f 6c 4e 61 6d 65 73 3b 0a 20 20 64 62 2d 3e  ColNames;.  db->
c380: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
c390: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 3b 0a 20  ShortColNames;. 
c3a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
c3b0: 65 70 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ep(pParse, pSele
c3c0: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 50  ct, 0);.  if( pP
c3d0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
c3e0: 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  urn 0;.  while( 
c3f0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20  pSelect->pPrior 
c400: 29 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c  ) pSelect = pSel
c410: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 64  ect->pPrior;.  d
c420: 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64  b->flags = saved
c430: 46 6c 61 67 73 3b 0a 20 20 70 54 61 62 20 3d 20  Flags;.  pTab = 
c440: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
c450: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54  ero(db, sizeof(T
c460: 61 62 6c 65 29 20 29 3b 0a 20 20 69 66 28 20 70  able) );.  if( p
c470: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Tab==0 ){.    re
c480: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2f 2a  turn 0;.  }.  /*
c490: 20 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 75   The sqlite3Resu
c4a0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
c4b0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 6e 20 63  is only used n c
c4c0: 6f 6e 74 65 78 74 73 20 77 68 65 72 65 20 6c 6f  ontexts where lo
c4d0: 6f 6b 61 73 69 64 65 0a 20 20 2a 2a 20 69 73 20  okaside.  ** is 
c4e0: 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 73  disabled */.  as
c4f0: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
c500: 69 64 65 2e 62 45 6e 61 62 6c 65 64 3d 3d 30 20  ide.bEnabled==0 
c510: 29 3b 0a 20 20 70 54 61 62 2d 3e 6e 52 65 66 20  );.  pTab->nRef 
c520: 3d 20 31 3b 0a 20 20 70 54 61 62 2d 3e 7a 4e 61  = 1;.  pTab->zNa
c530: 6d 65 20 3d 20 30 3b 0a 20 20 70 54 61 62 2d 3e  me = 0;.  pTab->
c540: 6e 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30  nRowEst = 100000
c550: 30 3b 0a 20 20 73 65 6c 65 63 74 43 6f 6c 75 6d  0;.  selectColum
c560: 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  nsFromExprList(p
c570: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
c580: 70 45 4c 69 73 74 2c 20 26 70 54 61 62 2d 3e 6e  pEList, &pTab->n
c590: 43 6f 6c 2c 20 26 70 54 61 62 2d 3e 61 43 6f 6c  Col, &pTab->aCol
c5a0: 29 3b 0a 20 20 73 65 6c 65 63 74 41 64 64 43 6f  );.  selectAddCo
c5b0: 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61  lumnTypeAndColla
c5c0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61  tion(pParse, pTa
c5d0: 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e 61  b->nCol, pTab->a
c5e0: 43 6f 6c 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  Col, pSelect);. 
c5f0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
c600: 31 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  1;.  if( db->mal
c610: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c620: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
c630: 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a 20  ble(db, pTab);. 
c640: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c650: 0a 20 20 72 65 74 75 72 6e 20 70 54 61 62 3b 0a  .  return pTab;.
c660: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 56  }../*.** Get a V
c670: 44 42 45 20 66 6f 72 20 74 68 65 20 67 69 76 65  DBE for the give
c680: 6e 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  n parser context
c690: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
c6a0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
c6b0: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  ..** If an error
c6c0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
c6d0: 4e 55 4c 4c 20 61 6e 64 20 6c 65 61 76 65 20 61  NULL and leave a
c6e0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
c6f0: 73 65 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c  se..*/.Vdbe *sql
c700: 69 74 65 33 47 65 74 56 64 62 65 28 50 61 72 73  ite3GetVdbe(Pars
c710: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
c720: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
c730: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 3d 3d  pVdbe;.  if( v==
c740: 30 20 29 7b 0a 20 20 20 20 76 20 3d 20 70 50 61  0 ){.    v = pPa
c750: 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 73 71 6c  rse->pVdbe = sql
c760: 69 74 65 33 56 64 62 65 43 72 65 61 74 65 28 70  ite3VdbeCreate(p
c770: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 23 69 66 6e  Parse->db);.#ifn
c780: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c790: 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 76 20  TRACE.    if( v 
c7a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c7b0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
c7c0: 5f 54 72 61 63 65 29 3b 0a 20 20 20 20 7d 0a 23  _Trace);.    }.#
c7d0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
c7e0: 72 6e 20 76 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn v;.}.../*.** 
c7f0: 43 6f 6d 70 75 74 65 20 74 68 65 20 69 4c 69 6d  Compute the iLim
c800: 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74 20 66  it and iOffset f
c810: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 53 45 4c  ields of the SEL
c820: 45 43 54 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ECT based on the
c830: 0a 2a 2a 20 70 4c 69 6d 69 74 20 61 6e 64 20 70  .** pLimit and p
c840: 4f 66 66 73 65 74 20 65 78 70 72 65 73 73 69 6f  Offset expressio
c850: 6e 73 2e 20 20 70 4c 69 6d 69 74 20 61 6e 64 20  ns.  pLimit and 
c860: 70 4f 66 66 73 65 74 20 68 6f 6c 64 20 74 68 65  pOffset hold the
c870: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
c880: 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 74  that appear in t
c890: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
c8a0: 73 74 61 74 65 6d 65 6e 74 20 61 66 74 65 72 20  statement after 
c8b0: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
c8c0: 46 53 45 54 0a 2a 2a 20 6b 65 79 77 6f 72 64 73  FSET.** keywords
c8d0: 2e 20 20 4f 72 20 4e 55 4c 4c 20 69 66 20 74 68  .  Or NULL if th
c8e0: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 61 72 65  ose keywords are
c8f0: 20 6f 6d 69 74 74 65 64 2e 20 69 4c 69 6d 69 74   omitted. iLimit
c900: 20 61 6e 64 20 69 4f 66 66 73 65 74 20 0a 2a 2a   and iOffset .**
c910: 20 61 72 65 20 74 68 65 20 69 6e 74 65 67 65 72   are the integer
c920: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
c930: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75   numbers for cou
c940: 6e 74 65 72 73 20 75 73 65 64 20 74 6f 20 63 6f  nters used to co
c950: 6d 70 75 74 65 20 0a 2a 2a 20 74 68 65 20 6c 69  mpute .** the li
c960: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 2e 20  mit and offset. 
c970: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
c980: 6c 69 6d 69 74 20 61 6e 64 2f 6f 72 20 6f 66 66  limit and/or off
c990: 73 65 74 2c 20 74 68 65 6e 20 0a 2a 2a 20 69 4c  set, then .** iL
c9a0: 69 6d 69 74 20 61 6e 64 20 69 4f 66 66 73 65 74  imit and iOffset
c9b0: 20 61 72 65 20 6e 65 67 61 74 69 76 65 2e 0a 2a   are negative..*
c9c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c9d0: 65 20 63 68 61 6e 67 65 73 20 74 68 65 20 76 61  e changes the va
c9e0: 6c 75 65 73 20 6f 66 20 69 4c 69 6d 69 74 20 61  lues of iLimit a
c9f0: 6e 64 20 69 4f 66 66 73 65 74 20 6f 6e 6c 79 20  nd iOffset only 
ca00: 69 66 0a 2a 2a 20 61 20 6c 69 6d 69 74 20 6f 72  if.** a limit or
ca10: 20 6f 66 66 73 65 74 20 69 73 20 64 65 66 69 6e   offset is defin
ca20: 65 64 20 62 79 20 70 4c 69 6d 69 74 20 61 6e 64  ed by pLimit and
ca30: 20 70 4f 66 66 73 65 74 2e 20 20 69 4c 69 6d 69   pOffset.  iLimi
ca40: 74 20 61 6e 64 0a 2a 2a 20 69 4f 66 66 73 65 74  t and.** iOffset
ca50: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
ca60: 6e 20 70 72 65 73 65 74 20 74 6f 20 61 70 70 72  n preset to appr
ca70: 6f 70 72 69 61 74 65 20 64 65 66 61 75 6c 74 20  opriate default 
ca80: 76 61 6c 75 65 73 0a 2a 2a 20 28 75 73 75 61 6c  values.** (usual
ca90: 6c 79 20 62 75 74 20 6e 6f 74 20 61 6c 77 61 79  ly but not alway
caa0: 73 20 2d 31 29 20 70 72 69 6f 72 20 74 6f 20 63  s -1) prior to c
cab0: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
cac0: 69 6e 65 2e 0a 2a 2a 20 4f 6e 6c 79 20 69 66 20  ine..** Only if 
cad0: 70 4c 69 6d 69 74 21 3d 30 20 6f 72 20 70 4f 66  pLimit!=0 or pOf
cae0: 66 73 65 74 21 3d 30 20 64 6f 20 74 68 65 20 6c  fset!=0 do the l
caf0: 69 6d 69 74 20 72 65 67 69 73 74 65 72 73 20 67  imit registers g
cb00: 65 74 0a 2a 2a 20 72 65 64 65 66 69 6e 65 64 2e  et.** redefined.
cb10: 20 20 54 68 65 20 55 4e 49 4f 4e 20 41 4c 4c 20    The UNION ALL 
cb20: 6f 70 65 72 61 74 6f 72 20 75 73 65 73 20 74 68  operator uses th
cb30: 69 73 20 70 72 6f 70 65 72 74 79 20 74 6f 20 66  is property to f
cb40: 6f 72 63 65 0a 2a 2a 20 74 68 65 20 72 65 75 73  orce.** the reus
cb50: 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6c 69  e of the same li
cb60: 6d 69 74 20 61 6e 64 20 6f 66 66 73 65 74 20 72  mit and offset r
cb70: 65 67 69 73 74 65 72 73 20 61 63 72 6f 73 73 20  egisters across 
cb80: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 53 45 4c 45  multiple.** SELE
cb90: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CT statements..*
cba0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
cbb0: 6d 70 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74  mputeLimitRegist
cbc0: 65 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ers(Parse *pPars
cbd0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e  e, Select *p, in
cbe0: 74 20 69 42 72 65 61 6b 29 7b 0a 20 20 56 64 62  t iBreak){.  Vdb
cbf0: 65 20 2a 76 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *v = 0;.  int 
cc00: 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 69 6e  iLimit = 0;.  in
cc10: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
cc20: 20 61 64 64 72 31 2c 20 6e 3b 0a 20 20 69 66 28   addr1, n;.  if(
cc30: 20 70 2d 3e 69 4c 69 6d 69 74 20 29 20 72 65 74   p->iLimit ) ret
cc40: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  urn;..  /* .  **
cc50: 20 22 4c 49 4d 49 54 20 2d 31 22 20 61 6c 77 61   "LIMIT -1" alwa
cc60: 79 73 20 73 68 6f 77 73 20 61 6c 6c 20 72 6f 77  ys shows all row
cc70: 73 2e 20 20 54 68 65 72 65 20 69 73 20 73 6f 6d  s.  There is som
cc80: 65 0a 20 20 2a 2a 20 63 6f 6e 74 72 61 76 65 72  e.  ** contraver
cc90: 73 79 20 61 62 6f 75 74 20 77 68 61 74 20 74 68  sy about what th
cca0: 65 20 63 6f 72 72 65 63 74 20 62 65 68 61 76 69  e correct behavi
ccb0: 6f 72 20 73 68 6f 75 6c 64 20 62 65 2e 0a 20 20  or should be..  
ccc0: 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 69  ** The current i
ccd0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e  mplementation in
cce0: 74 65 72 70 72 65 74 73 20 22 4c 49 4d 49 54 20  terprets "LIMIT 
ccf0: 30 22 20 74 6f 20 6d 65 61 6e 0a 20 20 2a 2a 20  0" to mean.  ** 
cd00: 6e 6f 20 72 6f 77 73 2e 0a 20 20 2a 2f 0a 20 20  no rows..  */.  
cd10: 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
cd20: 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
cd30: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66   assert( p->pOff
cd40: 73 65 74 3d 3d 30 20 7c 7c 20 70 2d 3e 70 4c 69  set==0 || p->pLi
cd50: 6d 69 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  mit!=0 );.  if( 
cd60: 70 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20  p->pLimit ){.   
cd70: 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 4c 69   p->iLimit = iLi
cd80: 6d 69 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  mit = ++pParse->
cd90: 6e 4d 65 6d 3b 0a 20 20 20 20 76 20 3d 20 73 71  nMem;.    v = sq
cda0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
cdb0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  rse);.    if( NE
cdc0: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
cdd0: 72 6e 3b 20 20 2f 2a 20 56 44 42 45 20 73 68 6f  rn;  /* VDBE sho
cde0: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
cdf0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
ce00: 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
ce10: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
ce20: 70 2d 3e 70 4c 69 6d 69 74 2c 20 26 6e 29 20 29  p->pLimit, &n) )
ce30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
ce40: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ce50: 49 6e 74 65 67 65 72 2c 20 6e 2c 20 69 4c 69 6d  Integer, n, iLim
ce60: 69 74 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  it);.      VdbeC
ce70: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 4c 49 4d 49  omment((v, "LIMI
ce80: 54 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20  T counter"));.  
ce90: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
cea0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ceb0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cec0: 47 6f 74 6f 2c 20 30 2c 20 69 42 72 65 61 6b 29  Goto, 0, iBreak)
ced0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cee0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53         if( p->nS
cef0: 65 6c 65 63 74 52 6f 77 20 3e 20 28 64 6f 75 62  electRow > (doub
cf00: 6c 65 29 6e 20 29 20 70 2d 3e 6e 53 65 6c 65 63  le)n ) p->nSelec
cf10: 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29 6e  tRow = (double)n
cf20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
cf30: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
cf40: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
cf50: 65 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 69 4c  e, p->pLimit, iL
cf60: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  imit);.      sql
cf70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
cf80: 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
cf90: 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 56  iLimit);.      V
cfa0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
cfb0: 4c 49 4d 49 54 20 63 6f 75 6e 74 65 72 22 29 29  LIMIT counter"))
cfc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
cfd0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
cfe0: 49 66 5a 65 72 6f 2c 20 69 4c 69 6d 69 74 2c 20  IfZero, iLimit, 
cff0: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 7d 0a 20  iBreak);.    }. 
d000: 20 20 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65     if( p->pOffse
d010: 74 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4f  t ){.      p->iO
d020: 66 66 73 65 74 20 3d 20 69 4f 66 66 73 65 74 20  ffset = iOffset 
d030: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
d040: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
d050: 6e 4d 65 6d 2b 2b 3b 20 20 20 2f 2a 20 41 6c 6c  nMem++;   /* All
d060: 6f 63 61 74 65 20 61 6e 20 65 78 74 72 61 20 72  ocate an extra r
d070: 65 67 69 73 74 65 72 20 66 6f 72 20 6c 69 6d 69  egister for limi
d080: 74 2b 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20  t+offset */.    
d090: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d0a0: 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4f 66  e(pParse, p->pOf
d0b0: 66 73 65 74 2c 20 69 4f 66 66 73 65 74 29 3b 0a  fset, iOffset);.
d0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d0d0: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4d 75  eAddOp1(v, OP_Mu
d0e0: 73 74 42 65 49 6e 74 2c 20 69 4f 66 66 73 65 74  stBeInt, iOffset
d0f0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
d100: 6d 65 6e 74 28 28 76 2c 20 22 4f 46 46 53 45 54  ment((v, "OFFSET
d110: 20 63 6f 75 6e 74 65 72 22 29 29 3b 0a 20 20 20   counter"));.   
d120: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
d130: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
d140: 4f 50 5f 49 66 50 6f 73 2c 20 69 4f 66 66 73 65  OP_IfPos, iOffse
d150: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
d160: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
d170: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 69 4f  P_Integer, 0, iO
d180: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 71  ffset);.      sq
d190: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
d1a0: 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 20  e(v, addr1);.   
d1b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d1c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 41 64 64 2c 20  dOp3(v, OP_Add, 
d1d0: 69 4c 69 6d 69 74 2c 20 69 4f 66 66 73 65 74 2c  iLimit, iOffset,
d1e0: 20 69 4f 66 66 73 65 74 2b 31 29 3b 0a 20 20 20   iOffset+1);.   
d1f0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
d200: 76 2c 20 22 4c 49 4d 49 54 2b 4f 46 46 53 45 54  v, "LIMIT+OFFSET
d210: 22 29 29 3b 0a 20 20 20 20 20 20 61 64 64 72 31  "));.      addr1
d220: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
d230: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73  dOp1(v, OP_IfPos
d240: 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20  , iLimit);.     
d250: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d260: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
d270: 2c 20 2d 31 2c 20 69 4f 66 66 73 65 74 2b 31 29  , -1, iOffset+1)
d280: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d290: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
d2a0: 64 64 72 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ddr1);.    }.  }
d2b0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
d2c0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
d2d0: 5f 53 45 4c 45 43 54 0a 2f 2a 0a 2a 2a 20 52 65  _SELECT./*.** Re
d2e0: 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
d2f0: 69 61 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  iate collating s
d300: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
d310: 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f  iCol-th column o
d320: 66 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20  f.** the result 
d330: 73 65 74 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  set for the comp
d340: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 73 74 61 74  ound-select stat
d350: 65 6d 65 6e 74 20 22 70 22 2e 20 20 52 65 74 75  ement "p".  Retu
d360: 72 6e 20 4e 55 4c 4c 20 69 66 0a 2a 2a 20 74 68  rn NULL if.** th
d370: 65 20 63 6f 6c 75 6d 6e 20 68 61 73 20 6e 6f 20  e column has no 
d380: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
d390: 67 20 73 65 71 75 65 6e 63 65 2e 0a 2a 2a 0a 2a  g sequence..**.*
d3a0: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
d3b0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
d3c0: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
d3d0: 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74   is taken from t
d3e0: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
d3f0: 74 65 72 6d 20 6f 66 20 74 68 65 20 73 65 6c 65  term of the sele
d400: 63 74 20 74 68 61 74 20 68 61 73 20 61 20 63 6f  ct that has a co
d410: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
d420: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c  ..*/.static Coll
d430: 53 65 71 20 2a 6d 75 6c 74 69 53 65 6c 65 63 74  Seq *multiSelect
d440: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
d450: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
d460: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 43  , int iCol){.  C
d470: 6f 6c 6c 53 65 71 20 2a 70 52 65 74 3b 0a 20 20  ollSeq *pRet;.  
d480: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
d490: 0a 20 20 20 20 70 52 65 74 20 3d 20 6d 75 6c 74  .    pRet = mult
d4a0: 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70  iSelectCollSeq(p
d4b0: 50 61 72 73 65 2c 20 70 2d 3e 70 50 72 69 6f 72  Parse, p->pPrior
d4c0: 2c 20 69 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  , iCol);.  }else
d4d0: 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a  {.    pRet = 0;.
d4e0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 43    }.  assert( iC
d4f0: 6f 6c 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ol>=0 );.  if( p
d500: 52 65 74 3d 3d 30 20 26 26 20 69 43 6f 6c 3c 70  Ret==0 && iCol<p
d510: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
d520: 29 7b 0a 20 20 20 20 70 52 65 74 20 3d 20 73 71  ){.    pRet = sq
d530: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
d540: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 45 4c 69  (pParse, p->pELi
d550: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
d560: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
d570: 20 70 52 65 74 3b 0a 7d 0a 23 65 6e 64 69 66 20   pRet;.}.#endif 
d580: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
d590: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 2a  OMPOUND_SELECT *
d5a0: 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
d5b0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
d5c0: 63 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63  c int multiSelec
d5d0: 74 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  tOrderBy(.  Pars
d5e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d5f0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d600: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
d610: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
d620: 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73  /* The right-mos
d630: 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20  t of SELECTs to 
d640: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65  be coded */.  Se
d650: 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20  lectDest *pDest 
d660: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
d670: 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73  o with query res
d680: 75 6c 74 73 20 2a 2f 0a 29 3b 0a 0a 0a 23 69 66  ults */.);...#if
d690: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d6a0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
d6b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d6c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
d6d0: 20 70 72 6f 63 65 73 73 20 61 20 63 6f 6d 70 6f   process a compo
d6e0: 75 6e 64 20 71 75 65 72 79 20 66 6f 72 6d 20 66  und query form f
d6f0: 72 6f 6d 0a 2a 2a 20 74 77 6f 20 6f 72 20 6d 6f  rom.** two or mo
d700: 72 65 20 73 65 70 61 72 61 74 65 20 71 75 65 72  re separate quer
d710: 69 65 73 20 75 73 69 6e 67 20 55 4e 49 4f 4e 2c  ies using UNION,
d720: 20 55 4e 49 4f 4e 20 41 4c 4c 2c 20 45 58 43 45   UNION ALL, EXCE
d730: 50 54 2c 20 6f 72 0a 2a 2a 20 49 4e 54 45 52 53  PT, or.** INTERS
d740: 45 43 54 0a 2a 2a 0a 2a 2a 20 22 70 22 20 70 6f  ECT.**.** "p" po
d750: 69 6e 74 73 20 74 6f 20 74 68 65 20 72 69 67 68  ints to the righ
d760: 74 2d 6d 6f 73 74 20 6f 66 20 74 68 65 20 74 77  t-most of the tw
d770: 6f 20 71 75 65 72 69 65 73 2e 20 20 74 68 65 20  o queries.  the 
d780: 71 75 65 72 79 20 6f 6e 20 74 68 65 0a 2a 2a 20  query on the.** 
d790: 6c 65 66 74 20 69 73 20 70 2d 3e 70 50 72 69 6f  left is p->pPrio
d7a0: 72 2e 20 20 54 68 65 20 6c 65 66 74 20 71 75 65  r.  The left que
d7b0: 72 79 20 63 6f 75 6c 64 20 61 6c 73 6f 20 62 65  ry could also be
d7c0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72   a compound quer
d7d0: 79 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 63 61  y.** in which ca
d7e0: 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  se this routine 
d7f0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 72  will be called r
d800: 65 63 75 72 73 69 76 65 6c 79 2e 20 0a 2a 2a 0a  ecursively. .**.
d810: 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f  ** The results o
d820: 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
d830: 79 20 61 72 65 20 74 6f 20 62 65 20 77 72 69 74  y are to be writ
d840: 74 65 6e 20 69 6e 74 6f 20 61 20 64 65 73 74 69  ten into a desti
d850: 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74 79 70  nation.** of typ
d860: 65 20 65 44 65 73 74 20 77 69 74 68 20 70 61 72  e eDest with par
d870: 61 6d 65 74 65 72 20 69 50 61 72 6d 2e 0a 2a 2a  ameter iParm..**
d880: 0a 2a 2a 20 45 78 61 6d 70 6c 65 20 31 3a 20 20  .** Example 1:  
d890: 43 6f 6e 73 69 64 65 72 20 61 20 74 68 72 65 65  Consider a three
d8a0: 2d 77 61 79 20 63 6f 6d 70 6f 75 6e 64 20 53 51  -way compound SQ
d8b0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  L statement..**.
d8c0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 20  **     SELECT a 
d8d0: 46 52 4f 4d 20 74 31 20 55 4e 49 4f 4e 20 53 45  FROM t1 UNION SE
d8e0: 4c 45 43 54 20 62 20 46 52 4f 4d 20 74 32 20 55  LECT b FROM t2 U
d8f0: 4e 49 4f 4e 20 53 45 4c 45 43 54 20 63 20 46 52  NION SELECT c FR
d900: 4f 4d 20 74 33 0a 2a 2a 0a 2a 2a 20 54 68 69 73  OM t3.**.** This
d910: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
d920: 72 73 65 64 20 75 70 20 61 73 20 66 6f 6c 6c 6f  rsed up as follo
d930: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ws:.**.**     SE
d940: 4c 45 43 54 20 63 20 46 52 4f 4d 20 74 33 0a 2a  LECT c FROM t3.*
d950: 2a 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20  *      |.**     
d960: 20 60 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43 54   `----->  SELECT
d970: 20 62 20 46 52 4f 4d 20 74 32 0a 2a 2a 20 20 20   b FROM t2.**   
d980: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 0a 2a               |.*
d990: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
d9a0: 20 60 2d 2d 2d 2d 2d 2d 3e 20 20 53 45 4c 45 43   `------>  SELEC
d9b0: 54 20 61 20 46 52 4f 4d 20 74 31 0a 2a 2a 0a 2a  T a FROM t1.**.*
d9c0: 2a 20 54 68 65 20 61 72 72 6f 77 73 20 69 6e 20  * The arrows in 
d9d0: 74 68 65 20 64 69 61 67 72 61 6d 20 61 62 6f 76  the diagram abov
d9e0: 65 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20  e represent the 
d9f0: 53 65 6c 65 63 74 2e 70 50 72 69 6f 72 20 70 6f  Select.pPrior po
da00: 69 6e 74 65 72 2e 0a 2a 2a 20 53 6f 20 69 66 20  inter..** So if 
da10: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
da20: 63 61 6c 6c 65 64 20 77 69 74 68 20 70 20 65 71  called with p eq
da30: 75 61 6c 20 74 6f 20 74 68 65 20 74 33 20 71 75  ual to the t3 qu
da40: 65 72 79 2c 20 74 68 65 6e 0a 2a 2a 20 70 50 72  ery, then.** pPr
da50: 69 6f 72 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ior will be the 
da60: 74 32 20 71 75 65 72 79 2e 20 20 70 2d 3e 6f 70  t2 query.  p->op
da70: 20 77 69 6c 6c 20 62 65 20 54 4b 5f 55 4e 49 4f   will be TK_UNIO
da80: 4e 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  N in this case..
da90: 2a 2a 0a 2a 2a 20 4e 6f 74 69 63 65 20 74 68 61  **.** Notice tha
daa0: 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
dab0: 20 77 61 79 20 53 51 4c 69 74 65 20 70 61 72 73   way SQLite pars
dac0: 65 73 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  es compound SELE
dad0: 43 54 73 2c 20 74 68 65 0a 2a 2a 20 69 6e 64 69  CTs, the.** indi
dae0: 76 69 64 75 61 6c 20 73 65 6c 65 63 74 73 20 61  vidual selects a
daf0: 6c 77 61 79 73 20 67 72 6f 75 70 20 66 72 6f 6d  lways group from
db00: 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 2e 0a   left to right..
db10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 75  */.static int mu
db20: 6c 74 69 53 65 6c 65 63 74 28 0a 20 20 50 61 72  ltiSelect(.  Par
db30: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
db40: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
db50: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
db60: 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
db70: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f   /* The right-mo
db80: 73 74 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f  st of SELECTs to
db90: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53   be coded */.  S
dba0: 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65 73 74  electDest *pDest
dbb0: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
dbc0: 64 6f 20 77 69 74 68 20 71 75 65 72 79 20 72 65  do with query re
dbd0: 73 75 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  sults */.){.  in
dbe0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
dbf0: 3b 20 20 20 2f 2a 20 53 75 63 63 65 73 73 20 63  ;   /* Success c
dc00: 6f 64 65 20 66 72 6f 6d 20 61 20 73 75 62 72 6f  ode from a subro
dc10: 75 74 69 6e 65 20 2a 2f 0a 20 20 53 65 6c 65 63  utine */.  Selec
dc20: 74 20 2a 70 50 72 69 6f 72 3b 20 20 20 20 20 20  t *pPrior;      
dc30: 20 2f 2a 20 41 6e 6f 74 68 65 72 20 53 45 4c 45   /* Another SELE
dc40: 43 54 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  CT immediately t
dc50: 6f 20 6f 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20  o our left */.  
dc60: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
dc70: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
dc80: 65 20 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56  e code to this V
dc90: 44 42 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  DBE */.  SelectD
dca0: 65 73 74 20 64 65 73 74 3b 20 20 20 20 20 20 2f  est dest;      /
dcb0: 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
dcc0: 74 61 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 2a  ta destination *
dcd0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 44 65 6c  /.  Select *pDel
dce0: 65 74 65 20 3d 20 30 3b 20 20 2f 2a 20 43 68 61  ete = 0;  /* Cha
dcf0: 69 6e 20 6f 66 20 73 69 6d 70 6c 65 20 73 65 6c  in of simple sel
dd00: 65 63 74 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ects to delete *
dd10: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
dd20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
dd30: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
dd40: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
dd50: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
dd60: 20 20 69 6e 74 20 69 53 75 62 31 3b 20 20 20 20    int iSub1;    
dd70: 20 20 20 20 20 20 20 20 2f 2a 20 45 51 50 20 69          /* EQP i
dd80: 64 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 71  d of left-hand q
dd90: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 69 53  uery */.  int iS
dda0: 75 62 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  ub2;            
ddb0: 2f 2a 20 45 51 50 20 69 64 20 6f 66 20 72 69 67  /* EQP id of rig
ddc0: 68 74 2d 68 61 6e 64 20 71 75 65 72 79 20 2a 2f  ht-hand query */
ddd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61  .#endif..  /* Ma
dde0: 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
ddf0: 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 6f 72 20   no ORDER BY or 
de00: 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 6e 20  LIMIT clause on 
de10: 70 72 69 6f 72 20 53 45 4c 45 43 54 73 2e 20 20  prior SELECTs.  
de20: 4f 6e 6c 79 0a 20 20 2a 2a 20 74 68 65 20 6c 61  Only.  ** the la
de30: 73 74 20 28 72 69 67 68 74 2d 6d 6f 73 74 29 20  st (right-most) 
de40: 53 45 4c 45 43 54 20 69 6e 20 74 68 65 20 73 65  SELECT in the se
de50: 72 69 65 73 20 6d 61 79 20 68 61 76 65 20 61 6e  ries may have an
de60: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 4c 49 4d   ORDER BY or LIM
de70: 49 54 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  IT..  */.  asser
de80: 74 28 20 70 20 26 26 20 70 2d 3e 70 50 72 69 6f  t( p && p->pPrio
de90: 72 20 29 3b 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  r );  /* Calling
dea0: 20 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 61 6e   function guaran
deb0: 74 65 65 73 20 74 68 69 73 20 6d 75 63 68 20 2a  tees this much *
dec0: 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
ded0: 3e 64 62 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  >db;.  pPrior = 
dee0: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 61 73 73  p->pPrior;.  ass
def0: 65 72 74 28 20 70 50 72 69 6f 72 2d 3e 70 52 69  ert( pPrior->pRi
df00: 67 68 74 6d 6f 73 74 21 3d 70 50 72 69 6f 72 20  ghtmost!=pPrior 
df10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72  );.  assert( pPr
df20: 69 6f 72 2d 3e 70 52 69 67 68 74 6d 6f 73 74 3d  ior->pRightmost=
df30: 3d 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 20 29  =p->pRightmost )
df40: 3b 0a 20 20 64 65 73 74 20 3d 20 2a 70 44 65 73  ;.  dest = *pDes
df50: 74 3b 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d  t;.  if( pPrior-
df60: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
df70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
df80: 28 70 50 61 72 73 65 2c 22 4f 52 44 45 52 20 42  (pParse,"ORDER B
df90: 59 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20  Y clause should 
dfa0: 63 6f 6d 65 20 61 66 74 65 72 20 25 73 20 6e 6f  come after %s no
dfb0: 74 20 62 65 66 6f 72 65 22 2c 0a 20 20 20 20 20  t before",.     
dfc0: 20 73 65 6c 65 63 74 4f 70 4e 61 6d 65 28 70 2d   selectOpName(p-
dfd0: 3e 6f 70 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  >op));.    rc = 
dfe0: 31 3b 0a 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74  1;.    goto mult
dff0: 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  i_select_end;.  
e000: 7d 0a 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e  }.  if( pPrior->
e010: 70 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  pLimit ){.    sq
e020: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
e030: 61 72 73 65 2c 22 4c 49 4d 49 54 20 63 6c 61 75  arse,"LIMIT clau
e040: 73 65 20 73 68 6f 75 6c 64 20 63 6f 6d 65 20 61  se should come a
e050: 66 74 65 72 20 25 73 20 6e 6f 74 20 62 65 66 6f  fter %s not befo
e060: 72 65 22 2c 0a 20 20 20 20 20 20 73 65 6c 65 63  re",.      selec
e070: 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b  tOpName(p->op));
e080: 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
e090: 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c 65   goto multi_sele
e0a0: 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76  ct_end;.  }..  v
e0b0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
e0c0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73  e(pParse);.  ass
e0d0: 65 72 74 28 20 76 21 3d 30 20 29 3b 20 20 2f 2a  ert( v!=0 );  /*
e0e0: 20 54 68 65 20 56 44 42 45 20 61 6c 72 65 61 64   The VDBE alread
e0f0: 79 20 63 72 65 61 74 65 64 20 62 79 20 63 61 6c  y created by cal
e100: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ling function */
e110: 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68  ..  /* Create th
e120: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 65  e destination te
e130: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 66  mporary table if
e140: 20 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2f 0a   necessary.  */.
e150: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
e160: 3d 3d 53 52 54 5f 45 70 68 65 6d 54 61 62 20 29  ==SRT_EphemTab )
e170: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
e180: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20 73  >pEList );.    s
e190: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
e1a0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
e1b0: 65 72 61 6c 2c 20 64 65 73 74 2e 69 53 44 50 61  eral, dest.iSDPa
e1c0: 72 6d 2c 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e  rm, p->pEList->n
e1d0: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
e1e0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
e1f0: 2c 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  , BTREE_UNORDERE
e200: 44 29 3b 0a 20 20 20 20 64 65 73 74 2e 65 44 65  D);.    dest.eDe
e210: 73 74 20 3d 20 53 52 54 5f 54 61 62 6c 65 3b 0a  st = SRT_Table;.
e220: 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
e230: 75 72 65 20 61 6c 6c 20 53 45 4c 45 43 54 73 20  ure all SELECTs 
e240: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
e250: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e   have the same n
e260: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
e270: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 69 72 20  s.  ** in their 
e280: 72 65 73 75 6c 74 20 73 65 74 73 2e 0a 20 20 2a  result sets..  *
e290: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  /.  assert( p->p
e2a0: 45 4c 69 73 74 20 26 26 20 70 50 72 69 6f 72 2d  EList && pPrior-
e2b0: 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 69 66 28  >pEList );.  if(
e2c0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
e2d0: 72 21 3d 70 50 72 69 6f 72 2d 3e 70 45 4c 69 73  r!=pPrior->pELis
e2e0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
e2f0: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
e300: 26 20 53 46 5f 56 61 6c 75 65 73 20 29 7b 0a 20  & SF_Values ){. 
e310: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
e320: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 6c  rMsg(pParse, "al
e330: 6c 20 56 41 4c 55 45 53 20 6d 75 73 74 20 68 61  l VALUES must ha
e340: 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
e350: 65 72 20 6f 66 20 74 65 72 6d 73 22 29 3b 0a 20  er of terms");. 
e360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e370: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e380: 70 50 61 72 73 65 2c 20 22 53 45 4c 45 43 54 73  pParse, "SELECTs
e390: 20 74 6f 20 74 68 65 20 6c 65 66 74 20 61 6e 64   to the left and
e3a0: 20 72 69 67 68 74 20 6f 66 20 25 73 22 0a 20 20   right of %s".  
e3b0: 20 20 20 20 20 20 22 20 64 6f 20 6e 6f 74 20 68        " do not h
e3c0: 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ave the same num
e3d0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
e3e0: 6c 75 6d 6e 73 22 2c 20 73 65 6c 65 63 74 4f 70  lumns", selectOp
e3f0: 4e 61 6d 65 28 70 2d 3e 6f 70 29 29 3b 0a 20 20  Name(p->op));.  
e400: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a    }.    rc = 1;.
e410: 20 20 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73      goto multi_s
e420: 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 7d 0a 0a  elect_end;.  }..
e430: 20 20 2f 2a 20 43 6f 6d 70 6f 75 6e 64 20 53 45    /* Compound SE
e440: 4c 45 43 54 73 20 74 68 61 74 20 68 61 76 65 20  LECTs that have 
e450: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
e460: 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73  se are handled s
e470: 65 70 61 72 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  eparately..  */.
e480: 20 20 69 66 28 20 70 2d 3e 70 4f 72 64 65 72 42    if( p->pOrderB
e490: 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
e4a0: 6d 75 6c 74 69 53 65 6c 65 63 74 4f 72 64 65 72  multiSelectOrder
e4b0: 42 79 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44  By(pParse, p, pD
e4c0: 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  est);.  }..  /* 
e4d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
e4e0: 72 20 74 68 65 20 6c 65 66 74 20 61 6e 64 20 72  r the left and r
e4f0: 69 67 68 74 20 53 45 4c 45 43 54 20 73 74 61 74  ight SELECT stat
e500: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 73  ements..  */.  s
e510: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
e520: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4c 4c 3a      case TK_ALL:
e530: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
e540: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r = 0;.      int
e550: 20 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 61   nLimit;.      a
e560: 73 73 65 72 74 28 20 21 70 50 72 69 6f 72 2d 3e  ssert( !pPrior->
e570: 70 4c 69 6d 69 74 20 29 3b 0a 20 20 20 20 20 20  pLimit );.      
e580: 70 50 72 69 6f 72 2d 3e 70 4c 69 6d 69 74 20 3d  pPrior->pLimit =
e590: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
e5a0: 20 20 70 50 72 69 6f 72 2d 3e 70 4f 66 66 73 65    pPrior->pOffse
e5b0: 74 20 3d 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a  t = p->pOffset;.
e5c0: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
e5d0: 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
e5e0: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
e5f0: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
e600: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
e610: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
e620: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  &dest);.      p-
e630: 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20  >pLimit = 0;.   
e640: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
e650: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  0;.      if( rc 
e660: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
e670: 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64  multi_select_end
e680: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e690: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20  p->pPrior = 0;. 
e6a0: 20 20 20 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d       p->iLimit =
e6b0: 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74 3b   pPrior->iLimit;
e6c0: 0a 20 20 20 20 20 20 70 2d 3e 69 4f 66 66 73 65  .      p->iOffse
e6d0: 74 20 3d 20 70 50 72 69 6f 72 2d 3e 69 4f 66 66  t = pPrior->iOff
e6e0: 73 65 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  set;.      if( p
e6f0: 2d 3e 69 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20  ->iLimit ){.    
e700: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
e710: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
e720: 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69 4c  OP_IfZero, p->iL
e730: 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 20 56  imit);.        V
e740: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
e750: 4a 75 6d 70 20 61 68 65 61 64 20 69 66 20 4c 49  Jump ahead if LI
e760: 4d 49 54 20 72 65 61 63 68 65 64 22 29 29 3b 0a  MIT reached"));.
e770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
e780: 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72 28  plainSetInteger(
e790: 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d 3e 69  iSub2, pParse->i
e7a0: 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b 0a 20  NextSelectId);. 
e7b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e7c0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
e7d0: 70 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  p, &dest);.     
e7e0: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
e7f0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
e800: 20 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70    pDelete = p->p
e810: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e  Prior;.      p->
e820: 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b  pPrior = pPrior;
e830: 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65 63  .      p->nSelec
e840: 74 52 6f 77 20 2b 3d 20 70 50 72 69 6f 72 2d 3e  tRow += pPrior->
e850: 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 20 20  nSelectRow;.    
e860: 20 20 69 66 28 20 70 50 72 69 6f 72 2d 3e 70 4c    if( pPrior->pL
e870: 69 6d 69 74 0a 20 20 20 20 20 20 20 26 26 20 73  imit.       && s
e880: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
e890: 67 65 72 28 70 50 72 69 6f 72 2d 3e 70 4c 69 6d  ger(pPrior->pLim
e8a0: 69 74 2c 20 26 6e 4c 69 6d 69 74 29 0a 20 20 20  it, &nLimit).   
e8b0: 20 20 20 20 26 26 20 70 2d 3e 6e 53 65 6c 65 63      && p->nSelec
e8c0: 74 52 6f 77 20 3e 20 28 64 6f 75 62 6c 65 29 6e  tRow > (double)n
e8d0: 4c 69 6d 69 74 20 0a 20 20 20 20 20 20 29 7b 0a  Limit .      ){.
e8e0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 53 65 6c 65          p->nSele
e8f0: 63 74 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65 29  ctRow = (double)
e900: 6e 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 7d 0a  nLimit;.      }.
e910: 20 20 20 20 20 20 69 66 28 20 61 64 64 72 20 29        if( addr )
e920: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e930: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
e940: 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a   addr);.      }.
e950: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e960: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45   }.    case TK_E
e970: 58 43 45 50 54 3a 0a 20 20 20 20 63 61 73 65 20  XCEPT:.    case 
e980: 54 4b 5f 55 4e 49 4f 4e 3a 20 7b 0a 20 20 20 20  TK_UNION: {.    
e990: 20 20 69 6e 74 20 75 6e 69 6f 6e 54 61 62 3b 20    int unionTab; 
e9a0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
e9b0: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
e9c0: 72 61 72 79 20 74 61 62 6c 65 20 68 6f 6c 64 69  rary table holdi
e9d0: 6e 67 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20  ng result */.   
e9e0: 20 20 20 75 38 20 6f 70 20 3d 20 30 3b 20 20 20     u8 op = 0;   
e9f0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
ea00: 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69 6f 6e  e SRT_ operation
ea10: 73 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 73 65  s to apply to se
ea20: 6c 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  lf */.      int 
ea30: 70 72 69 6f 72 4f 70 3b 20 20 20 20 20 2f 2a 20  priorOp;     /* 
ea40: 54 68 65 20 53 52 54 5f 20 6f 70 65 72 61 74 69  The SRT_ operati
ea50: 6f 6e 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  on to apply to p
ea60: 72 69 6f 72 20 73 65 6c 65 63 74 73 20 2a 2f 0a  rior selects */.
ea70: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 69 6d        Expr *pLim
ea80: 69 74 2c 20 2a 70 4f 66 66 73 65 74 3b 20 2f 2a  it, *pOffset; /*
ea90: 20 53 61 76 65 64 20 76 61 6c 75 65 73 20 6f 66   Saved values of
eaa0: 20 70 2d 3e 6e 4c 69 6d 69 74 20 61 6e 64 20 70   p->nLimit and p
eab0: 2d 3e 6e 4f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ->nOffset */.   
eac0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
ead0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 75 6e     SelectDest un
eae0: 69 6f 6e 64 65 73 74 3b 0a 0a 20 20 20 20 20 20  iondest;..      
eaf0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d  testcase( p->op=
eb00: 3d 54 4b 5f 45 58 43 45 50 54 20 29 3b 0a 20 20  =TK_EXCEPT );.  
eb10: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
eb20: 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b  >op==TK_UNION );
eb30: 0a 20 20 20 20 20 20 70 72 69 6f 72 4f 70 20 3d  .      priorOp =
eb40: 20 53 52 54 5f 55 6e 69 6f 6e 3b 0a 20 20 20 20   SRT_Union;.    
eb50: 20 20 69 66 28 20 64 65 73 74 2e 65 44 65 73 74    if( dest.eDest
eb60: 3d 3d 70 72 69 6f 72 4f 70 20 26 26 20 41 4c 57  ==priorOp && ALW
eb70: 41 59 53 28 21 70 2d 3e 70 4c 69 6d 69 74 20 26  AYS(!p->pLimit &
eb80: 26 21 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b  &!p->pOffset) ){
eb90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 63  .        /* We c
eba0: 61 6e 20 72 65 75 73 65 20 61 20 74 65 6d 70 6f  an reuse a tempo
ebb0: 72 61 72 79 20 74 61 62 6c 65 20 67 65 6e 65 72  rary table gener
ebc0: 61 74 65 64 20 62 79 20 61 20 53 45 4c 45 43 54  ated by a SELECT
ebd0: 20 74 6f 20 6f 75 72 0a 20 20 20 20 20 20 20 20   to our.        
ebe0: 2a 2a 20 72 69 67 68 74 2e 0a 20 20 20 20 20 20  ** right..      
ebf0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
ec00: 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74 6d 6f  ert( p->pRightmo
ec10: 73 74 21 3d 70 20 29 3b 20 20 2f 2a 20 43 61 6e  st!=p );  /* Can
ec20: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 66 6f 72   only happen for
ec30: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
ec40: 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ts.             
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec60: 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
ec70: 33 2d 77 61 79 20 6f 72 20 6d 6f 72 65 20 63 6f  3-way or more co
ec80: 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20  mpound */.      
ec90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4c 69    assert( p->pLi
eca0: 6d 69 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  mit==0 );      /
ecb0: 2a 20 4e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  * Not allowed on
ecc0: 20 6c 65 66 74 77 61 72 64 20 65 6c 65 6d 65 6e   leftward elemen
ecd0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ts */.        as
ece0: 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65 74  sert( p->pOffset
ecf0: 3d 3d 30 20 29 3b 20 20 20 20 20 2f 2a 20 4e 6f  ==0 );     /* No
ed00: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 6c 65 66  t allowed on lef
ed10: 74 77 61 72 64 20 65 6c 65 6d 65 6e 74 73 20 2a  tward elements *
ed20: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
ed30: 61 62 20 3d 20 64 65 73 74 2e 69 53 44 50 61 72  ab = dest.iSDPar
ed40: 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  m;.      }else{.
ed50: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 77 69          /* We wi
ed60: 6c 6c 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  ll need to creat
ed70: 65 20 6f 75 72 20 6f 77 6e 20 74 65 6d 70 6f 72  e our own tempor
ed80: 61 72 79 20 74 61 62 6c 65 20 74 6f 20 68 6f 6c  ary table to hol
ed90: 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  d the.        **
eda0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65   intermediate re
edb0: 73 75 6c 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  sults..        *
edc0: 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 6f 6e 54  /.        unionT
edd0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  ab = pParse->nTa
ede0: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  b++;.        ass
edf0: 65 72 74 28 20 70 2d 3e 70 4f 72 64 65 72 42 79  ert( p->pOrderBy
ee00: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
ee10: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
ee20: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70  eAddOp2(v, OP_Op
ee30: 65 6e 45 70 68 65 6d 65 72 61 6c 2c 20 75 6e 69  enEphemeral, uni
ee40: 6f 6e 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20  onTab, 0);.     
ee50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
ee60: 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d  drOpenEphm[0] ==
ee70: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70   -1 );.        p
ee80: 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30  ->addrOpenEphm[0
ee90: 5d 20 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20  ] = addr;.      
eea0: 20 20 70 2d 3e 70 52 69 67 68 74 6d 6f 73 74 2d    p->pRightmost-
eeb0: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
eec0: 55 73 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20  UsesEphemeral;. 
eed0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
eee0: 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20 20 20  ->pEList );.    
eef0: 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f    }..      /* Co
ef00: 64 65 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  de the SELECT st
ef10: 61 74 65 6d 65 6e 74 73 20 74 6f 20 6f 75 72 20  atements to our 
ef20: 6c 65 66 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20  left.      */.  
ef30: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 72      assert( !pPr
ef40: 69 6f 72 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  ior->pOrderBy );
ef50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
ef60: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 75 6e  lectDestInit(&un
ef70: 69 6f 6e 64 65 73 74 2c 20 70 72 69 6f 72 4f 70  iondest, priorOp
ef80: 2c 20 75 6e 69 6f 6e 54 61 62 29 3b 0a 20 20 20  , unionTab);.   
ef90: 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74     explainSetInt
efa0: 65 67 65 72 28 69 53 75 62 31 2c 20 70 50 61 72  eger(iSub1, pPar
efb0: 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49  se->iNextSelectI
efc0: 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  d);.      rc = s
efd0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
efe0: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 26 75 6e  rse, pPrior, &un
eff0: 69 6f 6e 64 65 73 74 29 3b 0a 20 20 20 20 20 20  iondest);.      
f000: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
f010: 20 20 67 6f 74 6f 20 6d 75 6c 74 69 5f 73 65 6c    goto multi_sel
f020: 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d  ect_end;.      }
f030: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20  ..      /* Code 
f040: 74 68 65 20 63 75 72 72 65 6e 74 20 53 45 4c 45  the current SELE
f050: 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  CT statement.   
f060: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
f070: 70 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 43 45 50 54  p->op==TK_EXCEPT
f080: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
f090: 20 53 52 54 5f 45 78 63 65 70 74 3b 0a 20 20 20   SRT_Except;.   
f0a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f0b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d    assert( p->op=
f0c0: 3d 54 4b 5f 55 4e 49 4f 4e 20 29 3b 0a 20 20 20  =TK_UNION );.   
f0d0: 20 20 20 20 20 6f 70 20 3d 20 53 52 54 5f 55 6e       op = SRT_Un
f0e0: 69 6f 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ion;.      }.   
f0f0: 20 20 20 70 2d 3e 70 50 72 69 6f 72 20 3d 20 30     p->pPrior = 0
f100: 3b 0a 20 20 20 20 20 20 70 4c 69 6d 69 74 20 3d  ;.      pLimit =
f110: 20 70 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20 20   p->pLimit;.    
f120: 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b    p->pLimit = 0;
f130: 0a 20 20 20 20 20 20 70 4f 66 66 73 65 74 20 3d  .      pOffset =
f140: 20 70 2d 3e 70 4f 66 66 73 65 74 3b 0a 20 20 20   p->pOffset;.   
f150: 20 20 20 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20     p->pOffset = 
f160: 30 3b 0a 20 20 20 20 20 20 75 6e 69 6f 6e 64 65  0;.      unionde
f170: 73 74 2e 65 44 65 73 74 20 3d 20 6f 70 3b 0a 20  st.eDest = op;. 
f180: 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74 49       explainSetI
f190: 6e 74 65 67 65 72 28 69 53 75 62 32 2c 20 70 50  nteger(iSub2, pP
f1a0: 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65 63  arse->iNextSelec
f1b0: 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  tId);.      rc =
f1c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
f1d0: 50 61 72 73 65 2c 20 70 2c 20 26 75 6e 69 6f 6e  Parse, p, &union
f1e0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 74 65 73  dest);.      tes
f1f0: 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
f200: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 2f 2a  E_OK );.      /*
f210: 20 51 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e   Query flattenin
f220: 67 20 69 6e 20 73 71 6c 69 74 65 33 53 65 6c 65  g in sqlite3Sele
f230: 63 74 28 29 20 6d 69 67 68 74 20 72 65 66 69 6c  ct() might refil
f240: 6c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2e 0a 20  l p->pOrderBy.. 
f250: 20 20 20 20 20 2a 2a 20 42 65 20 73 75 72 65 20       ** Be sure 
f260: 74 6f 20 64 65 6c 65 74 65 20 70 2d 3e 70 4f 72  to delete p->pOr
f270: 64 65 72 42 79 2c 20 74 68 65 72 65 66 6f 72 65  derBy, therefore
f280: 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 65 6d  , to avoid a mem
f290: 6f 72 79 20 6c 65 61 6b 2e 20 2a 2f 0a 20 20 20  ory leak. */.   
f2a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
f2b0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
f2c0: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20  pOrderBy);.     
f2d0: 20 70 44 65 6c 65 74 65 20 3d 20 70 2d 3e 70 50   pDelete = p->pP
f2e0: 72 69 6f 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  rior;.      p->p
f2f0: 50 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 3b 0a  Prior = pPrior;.
f300: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
f310: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  y = 0;.      if(
f320: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4e 49 4f 4e   p->op==TK_UNION
f330: 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
f340: 20 2b 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c   += pPrior->nSel
f350: 65 63 74 52 6f 77 3b 0a 20 20 20 20 20 20 73 71  ectRow;.      sq
f360: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
f370: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  db, p->pLimit);.
f380: 20 20 20 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20        p->pLimit 
f390: 3d 20 70 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  = pLimit;.      
f3a0: 70 2d 3e 70 4f 66 66 73 65 74 20 3d 20 70 4f 66  p->pOffset = pOf
f3b0: 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d 3e 69  fset;.      p->i
f3c0: 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  Limit = 0;.     
f3d0: 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 30 3b   p->iOffset = 0;
f3e0: 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65  ..      /* Conve
f3f0: 72 74 20 74 68 65 20 64 61 74 61 20 69 6e 20 74  rt the data in t
f400: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
f410: 6c 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  le into whatever
f420: 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 69   form.      ** i
f430: 74 20 69 73 20 74 68 61 74 20 77 65 20 63 75 72  t is that we cur
f440: 72 65 6e 74 6c 79 20 6e 65 65 64 2e 0a 20 20 20  rently need..   
f450: 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65     */.      asse
f460: 72 74 28 20 75 6e 69 6f 6e 54 61 62 3d 3d 64 65  rt( unionTab==de
f470: 73 74 2e 69 53 44 50 61 72 6d 20 7c 7c 20 64 65  st.iSDParm || de
f480: 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72 4f  st.eDest!=priorO
f490: 70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  p );.      if( d
f4a0: 65 73 74 2e 65 44 65 73 74 21 3d 70 72 69 6f 72  est.eDest!=prior
f4b0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Op ){.        in
f4c0: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
f4d0: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 20   iStart;.       
f4e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69   assert( p->pELi
f4f0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
f500: 28 20 64 65 73 74 2e 65 44 65 73 74 3d 3d 53 52  ( dest.eDest==SR
f510: 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20  T_Output ){.    
f520: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 46        Select *pF
f530: 69 72 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  irst = p;.      
f540: 20 20 20 20 77 68 69 6c 65 28 20 70 46 69 72 73      while( pFirs
f550: 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46 69 72  t->pPrior ) pFir
f560: 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70 50 72  st = pFirst->pPr
f570: 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 67  ior;.          g
f580: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
f590: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
f5a0: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
f5b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f5c0: 20 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65   iBreak = sqlite
f5d0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
f5e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 43 6f 6e 74  );.        iCont
f5f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
f600: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
f610: 20 20 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69 74      computeLimit
f620: 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73 65  Registers(pParse
f630: 2c 20 70 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20  , p, iBreak);.  
f640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f650: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
f660: 77 69 6e 64 2c 20 75 6e 69 6f 6e 54 61 62 2c 20  wind, unionTab, 
f670: 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20 20 20  iBreak);.       
f680: 20 69 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   iStart = sqlite
f690: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
f6a0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c  (v);.        sel
f6b0: 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61  ectInnerLoop(pPa
f6c0: 72 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73  rse, p, p->pELis
f6d0: 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 70 2d 3e  t, unionTab, p->
f6e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 0a 20  pEList->nExpr,. 
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 20 20 20 20 20 30 2c 20 30 2c 20 26 64 65         0, 0, &de
f710: 73 74 2c 20 69 43 6f 6e 74 2c 20 69 42 72 65 61  st, iCont, iBrea
f720: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
f730: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
f740: 62 65 6c 28 76 2c 20 69 43 6f 6e 74 29 3b 0a 20  bel(v, iCont);. 
f750: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
f760: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
f770: 65 78 74 2c 20 75 6e 69 6f 6e 54 61 62 2c 20 69  ext, unionTab, i
f780: 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20  Start);.        
f790: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
f7a0: 76 65 4c 61 62 65 6c 28 76 2c 20 69 42 72 65 61  veLabel(v, iBrea
f7b0: 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  k);.        sqli
f7c0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
f7d0: 20 4f 50 5f 43 6c 6f 73 65 2c 20 75 6e 69 6f 6e   OP_Close, union
f7e0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Tab, 0);.      }
f7f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f800: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
f810: 20 61 73 73 65 72 74 28 20 70 2d 3e 6f 70 3d 3d   assert( p->op==
f820: 54 4b 5f 49 4e 54 45 52 53 45 43 54 20 29 3b 20  TK_INTERSECT ); 
f830: 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 61 62 31  {.      int tab1
f840: 2c 20 74 61 62 32 3b 0a 20 20 20 20 20 20 69 6e  , tab2;.      in
f850: 74 20 69 43 6f 6e 74 2c 20 69 42 72 65 61 6b 2c  t iCont, iBreak,
f860: 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20 20 45   iStart;.      E
f870: 78 70 72 20 2a 70 4c 69 6d 69 74 2c 20 2a 70 4f  xpr *pLimit, *pO
f880: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 6e 74  ffset;.      int
f890: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 53 65 6c   addr;.      Sel
f8a0: 65 63 74 44 65 73 74 20 69 6e 74 65 72 73 65 63  ectDest intersec
f8b0: 74 64 65 73 74 3b 0a 20 20 20 20 20 20 69 6e 74  tdest;.      int
f8c0: 20 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49   r1;..      /* I
f8d0: 4e 54 45 52 53 45 43 54 20 69 73 20 64 69 66 66  NTERSECT is diff
f8e0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 6f  erent from the o
f8f0: 74 68 65 72 73 20 73 69 6e 63 65 20 69 74 20 72  thers since it r
f900: 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 2a 2a  equires.      **
f910: 20 74 77 6f 20 74 65 6d 70 6f 72 61 72 79 20 74   two temporary t
f920: 61 62 6c 65 73 2e 20 20 48 65 6e 63 65 20 69 74  ables.  Hence it
f930: 20 68 61 73 20 69 74 73 20 6f 77 6e 20 63 61 73   has its own cas
f940: 65 2e 20 20 42 65 67 69 6e 0a 20 20 20 20 20 20  e.  Begin.      
f950: 2a 2a 20 62 79 20 61 6c 6c 6f 63 61 74 69 6e 67  ** by allocating
f960: 20 74 68 65 20 74 61 62 6c 65 73 20 77 65 20 77   the tables we w
f970: 69 6c 6c 20 6e 65 65 64 2e 0a 20 20 20 20 20 20  ill need..      
f980: 2a 2f 0a 20 20 20 20 20 20 74 61 62 31 20 3d 20  */.      tab1 = 
f990: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
f9a0: 20 20 20 20 20 20 74 61 62 32 20 3d 20 70 50 61        tab2 = pPa
f9b0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
f9c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 4f     assert( p->pO
f9d0: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 0a 20 20  rderBy==0 );..  
f9e0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
f9f0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
fa00: 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c  OP_OpenEphemeral
fa10: 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20 20 20 20  , tab1, 0);.    
fa20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64 64    assert( p->add
fa30: 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d 3d 20  rOpenEphm[0] == 
fa40: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  -1 );.      p->a
fa50: 64 64 72 4f 70 65 6e 45 70 68 6d 5b 30 5d 20 3d  ddrOpenEphm[0] =
fa60: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d 3e   addr;.      p->
fa70: 70 52 69 67 68 74 6d 6f 73 74 2d 3e 73 65 6c 46  pRightmost->selF
fa80: 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 45  lags |= SF_UsesE
fa90: 70 68 65 6d 65 72 61 6c 3b 0a 20 20 20 20 20 20  phemeral;.      
faa0: 61 73 73 65 72 74 28 20 70 2d 3e 70 45 4c 69 73  assert( p->pELis
fab0: 74 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  t );..      /* C
fac0: 6f 64 65 20 74 68 65 20 53 45 4c 45 43 54 73 20  ode the SELECTs 
fad0: 74 6f 20 6f 75 72 20 6c 65 66 74 20 69 6e 74 6f  to our left into
fae0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
faf0: 20 22 74 61 62 31 22 2e 0a 20 20 20 20 20 20 2a   "tab1"..      *
fb00: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  /.      sqlite3S
fb10: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 69  electDestInit(&i
fb20: 6e 74 65 72 73 65 63 74 64 65 73 74 2c 20 53 52  ntersectdest, SR
fb30: 54 5f 55 6e 69 6f 6e 2c 20 74 61 62 31 29 3b 0a  T_Union, tab1);.
fb40: 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53 65 74        explainSet
fb50: 49 6e 74 65 67 65 72 28 69 53 75 62 31 2c 20 70  Integer(iSub1, p
fb60: 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
fb70: 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72 63 20  ctId);.      rc 
fb80: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  = sqlite3Select(
fb90: 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c 20  pParse, pPrior, 
fba0: 26 69 6e 74 65 72 73 65 63 74 64 65 73 74 29 3b  &intersectdest);
fbb0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
fbc0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 75  .        goto mu
fbd0: 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b 0a  lti_select_end;.
fbe0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
fbf0: 2a 20 43 6f 64 65 20 74 68 65 20 63 75 72 72 65  * Code the curre
fc00: 6e 74 20 53 45 4c 45 43 54 20 69 6e 74 6f 20 74  nt SELECT into t
fc10: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 22  emporary table "
fc20: 74 61 62 32 22 0a 20 20 20 20 20 20 2a 2f 0a 20  tab2".      */. 
fc30: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
fc40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
fc50: 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
fc60: 6c 2c 20 74 61 62 32 2c 20 30 29 3b 0a 20 20 20  l, tab2, 0);.   
fc70: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 64     assert( p->ad
fc80: 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20 3d 3d  drOpenEphm[1] ==
fc90: 20 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e   -1 );.      p->
fca0: 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 31 5d 20  addrOpenEphm[1] 
fcb0: 3d 20 61 64 64 72 3b 0a 20 20 20 20 20 20 70 2d  = addr;.      p-
fcc0: 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
fcd0: 20 20 20 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70     pLimit = p->p
fce0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
fcf0: 70 4c 69 6d 69 74 20 3d 20 30 3b 0a 20 20 20 20  pLimit = 0;.    
fd00: 20 20 70 4f 66 66 73 65 74 20 3d 20 70 2d 3e 70    pOffset = p->p
fd10: 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 70 2d  Offset;.      p-
fd20: 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  >pOffset = 0;.  
fd30: 20 20 20 20 69 6e 74 65 72 73 65 63 74 64 65 73      intersectdes
fd40: 74 2e 69 53 44 50 61 72 6d 20 3d 20 74 61 62 32  t.iSDParm = tab2
fd50: 3b 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 53  ;.      explainS
fd60: 65 74 49 6e 74 65 67 65 72 28 69 53 75 62 32 2c  etInteger(iSub2,
fd70: 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65   pParse->iNextSe
fd80: 6c 65 63 74 49 64 29 3b 0a 20 20 20 20 20 20 72  lectId);.      r
fd90: 63 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  c = sqlite3Selec
fda0: 74 28 70 50 61 72 73 65 2c 20 70 2c 20 26 69 6e  t(pParse, p, &in
fdb0: 74 65 72 73 65 63 74 64 65 73 74 29 3b 0a 20 20  tersectdest);.  
fdc0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
fdd0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
fde0: 20 20 20 20 20 70 44 65 6c 65 74 65 20 3d 20 70       pDelete = p
fdf0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  ->pPrior;.      
fe00: 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69  p->pPrior = pPri
fe10: 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  or;.      if( p-
fe20: 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 70 50 72 69  >nSelectRow>pPri
fe30: 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 29  or->nSelectRow )
fe40: 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d   p->nSelectRow =
fe50: 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63 74   pPrior->nSelect
fe60: 52 6f 77 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Row;.      sqlit
fe70: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
fe80: 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20 20   p->pLimit);.   
fe90: 20 20 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 70     p->pLimit = p
fea0: 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 70 2d 3e  Limit;.      p->
feb0: 70 4f 66 66 73 65 74 20 3d 20 70 4f 66 66 73 65  pOffset = pOffse
fec0: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  t;..      /* Gen
fed0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 74 61  erate code to ta
fee0: 6b 65 20 74 68 65 20 69 6e 74 65 72 73 65 63 74  ke the intersect
fef0: 69 6f 6e 20 6f 66 20 74 68 65 20 74 77 6f 20 74  ion of the two t
ff00: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 2a  emporary.      *
ff10: 2a 20 74 61 62 6c 65 73 2e 0a 20 20 20 20 20 20  * tables..      
ff20: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
ff30: 20 70 2d 3e 70 45 4c 69 73 74 20 29 3b 0a 20 20   p->pEList );.  
ff40: 20 20 20 20 69 66 28 20 64 65 73 74 2e 65 44 65      if( dest.eDe
ff50: 73 74 3d 3d 53 52 54 5f 4f 75 74 70 75 74 20 29  st==SRT_Output )
ff60: 7b 0a 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  {.        Select
ff70: 20 2a 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20   *pFirst = p;.  
ff80: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 46 69        while( pFi
ff90: 72 73 74 2d 3e 70 50 72 69 6f 72 20 29 20 70 46  rst->pPrior ) pF
ffa0: 69 72 73 74 20 3d 20 70 46 69 72 73 74 2d 3e 70  irst = pFirst->p
ffb0: 50 72 69 6f 72 3b 0a 20 20 20 20 20 20 20 20 67  Prior;.        g
ffc0: 65 6e 65 72 61 74 65 43 6f 6c 75 6d 6e 4e 61 6d  enerateColumnNam
ffd0: 65 73 28 70 50 61 72 73 65 2c 20 30 2c 20 70 46  es(pParse, 0, pF
ffe0: 69 72 73 74 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  irst->pEList);. 
fff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 42 72       }.      iBr
10000 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  eak = sqlite3Vdb
10010 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
10020 20 20 20 20 20 69 43 6f 6e 74 20 3d 20 73 71 6c       iCont = sql
10030 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
10040 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6d 70  l(v);.      comp
10050 75 74 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72  uteLimitRegister
10060 73 28 70 50 61 72 73 65 2c 20 70 2c 20 69 42 72  s(pParse, p, iBr
10070 65 61 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eak);.      sqli
10080 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
10090 20 4f 50 5f 52 65 77 69 6e 64 2c 20 74 61 62 31   OP_Rewind, tab1
100a0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
100b0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
100c0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
100d0 0a 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20  .      iStart = 
100e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
100f0 32 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  2(v, OP_RowKey, 
10100 74 61 62 31 2c 20 72 31 29 3b 0a 20 20 20 20 20  tab1, r1);.     
10110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10120 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4e 6f 74 46  p4Int(v, OP_NotF
10130 6f 75 6e 64 2c 20 74 61 62 32 2c 20 69 43 6f 6e  ound, tab2, iCon
10140 74 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20 20  t, r1, 0);.     
10150 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
10160 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
10170 31 29 3b 0a 20 20 20 20 20 20 73 65 6c 65 63 74  1);.      select
10180 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72 73 65  InnerLoop(pParse
10190 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20  , p, p->pEList, 
101a0 74 61 62 31 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  tab1, p->pEList-
101b0 3e 6e 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  >nExpr,.        
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
101d0 20 30 2c 20 26 64 65 73 74 2c 20 69 43 6f 6e 74   0, &dest, iCont
101e0 2c 20 69 42 72 65 61 6b 29 3b 0a 20 20 20 20 20  , iBreak);.     
101f0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
10200 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
10210 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
10220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
10230 50 5f 4e 65 78 74 2c 20 74 61 62 31 2c 20 69 53  P_Next, tab1, iS
10240 74 61 72 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  tart);.      sql
10250 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
10260 61 62 65 6c 28 76 2c 20 69 42 72 65 61 6b 29 3b  abel(v, iBreak);
10270 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10280 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
10290 6c 6f 73 65 2c 20 74 61 62 32 2c 20 30 29 3b 0a  lose, tab2, 0);.
102a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
102b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
102c0 6f 73 65 2c 20 74 61 62 31 2c 20 30 29 3b 0a 20  ose, tab1, 0);. 
102d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
102e0 7d 0a 20 20 7d 0a 0a 20 20 65 78 70 6c 61 69 6e  }.  }..  explain
102f0 43 6f 6d 70 6f 73 69 74 65 28 70 50 61 72 73 65  Composite(pParse
10300 2c 20 70 2d 3e 6f 70 2c 20 69 53 75 62 31 2c 20  , p->op, iSub1, 
10310 69 53 75 62 32 2c 20 70 2d 3e 6f 70 21 3d 54 4b  iSub2, p->op!=TK
10320 5f 41 4c 4c 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  _ALL);..  /* Com
10330 70 75 74 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73  pute collating s
10340 65 71 75 65 6e 63 65 73 20 75 73 65 64 20 62 79  equences used by
10350 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
10360 20 74 61 62 6c 65 73 20 6e 65 65 64 65 64 20 74   tables needed t
10370 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
10380 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e  compound select.
10390 0a 20 20 2a 2a 20 41 74 74 61 63 68 20 74 68 65  .  ** Attach the
103a0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
103b0 72 65 20 74 6f 20 61 6c 6c 20 74 65 6d 70 6f 72  re to all tempor
103c0 61 72 79 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a  ary tables..  **
103d0 0a 20 20 2a 2a 20 54 68 69 73 20 73 65 63 74 69  .  ** This secti
103e0 6f 6e 20 69 73 20 72 75 6e 20 62 79 20 74 68 65  on is run by the
103f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
10400 43 54 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c  CT statement onl
10410 79 2e 0a 20 20 2a 2a 20 53 45 4c 45 43 54 20 73  y..  ** SELECT s
10420 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 74 68 65  tatements to the
10430 20 6c 65 66 74 20 61 6c 77 61 79 73 20 73 6b 69   left always ski
10440 70 20 74 68 69 73 20 70 61 72 74 2e 20 20 54 68  p this part.  Th
10450 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
10460 2a 20 53 45 4c 45 43 54 20 6d 69 67 68 74 20 61  * SELECT might a
10470 6c 73 6f 20 73 6b 69 70 20 74 68 69 73 20 70 61  lso skip this pa
10480 72 74 20 69 66 20 69 74 20 68 61 73 20 6e 6f 20  rt if it has no 
10490 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
104a0 61 6e 64 0a 20 20 2a 2a 20 6e 6f 20 74 65 6d 70  and.  ** no temp
104b0 20 74 61 62 6c 65 73 20 61 72 65 20 72 65 71 75   tables are requ
104c0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ired..  */.  if(
104d0 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53   p->selFlags & S
104e0 46 5f 55 73 65 73 45 70 68 65 6d 65 72 61 6c 20  F_UsesEphemeral 
104f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
10500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10510 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
10520 6e 74 65 72 20 2a 2f 0a 20 20 20 20 4b 65 79 49  nter */.    KeyI
10530 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 20 20  nfo *pKeyInfo;  
10540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
10550 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
10560 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  for the result s
10570 65 74 20 2a 2f 0a 20 20 20 20 53 65 6c 65 63 74  et */.    Select
10580 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
10590 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
105a0 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 53  ooping through S
105b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
105c0 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20   */.    CollSeq 
105d0 2a 2a 61 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  **apColl;       
105e0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
105f0 70 69 6e 67 20 74 68 72 6f 75 67 68 20 70 4b 65  ping through pKe
10600 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 5d 20 2a  yInfo->aColl[] *
10610 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20  /.    int nCol; 
10620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10630 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10640 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73 75   columns in resu
10650 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 20 20 61  lt set */..    a
10660 73 73 65 72 74 28 20 70 2d 3e 70 52 69 67 68 74  ssert( p->pRight
10670 6d 6f 73 74 3d 3d 70 20 29 3b 0a 20 20 20 20 6e  most==p );.    n
10680 43 6f 6c 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d  Col = p->pEList-
10690 3e 6e 45 78 70 72 3b 0a 20 20 20 20 70 4b 65 79  >nExpr;.    pKey
106a0 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
106b0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 0a 20  MallocZero(db,. 
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b        sizeof(*pK
106e0 65 79 49 6e 66 6f 29 2b 6e 43 6f 6c 2a 28 73 69  eyInfo)+nCol*(si
106f0 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b  zeof(CollSeq*) +
10700 20 31 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1));.    if( !p
10710 4b 65 79 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  KeyInfo ){.     
10720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
10730 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  EM;.      goto m
10740 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e 64 3b  ulti_select_end;
10750 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4b 65 79  .    }..    pKey
10760 49 6e 66 6f 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  Info->enc = ENC(
10770 64 62 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66  db);.    pKeyInf
10780 6f 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  o->nField = (u16
10790 29 6e 43 6f 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  )nCol;..    for(
107a0 69 3d 30 2c 20 61 70 43 6f 6c 6c 3d 70 4b 65 79  i=0, apColl=pKey
107b0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 3b 20 69 3c 6e  Info->aColl; i<n
107c0 43 6f 6c 3b 20 69 2b 2b 2c 20 61 70 43 6f 6c 6c  Col; i++, apColl
107d0 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 61 70 43 6f  ++){.      *apCo
107e0 6c 6c 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  ll = multiSelect
107f0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
10800 70 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  p, i);.      if(
10810 20 30 3d 3d 2a 61 70 43 6f 6c 6c 20 29 7b 0a 20   0==*apColl ){. 
10820 20 20 20 20 20 20 20 2a 61 70 43 6f 6c 6c 20 3d         *apColl =
10830 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
10840 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10850 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72    pKeyInfo->aSor
10860 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 61 70  tOrder = (u8*)ap
10870 43 6f 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 70  Coll;..    for(p
10880 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
10890 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69  Loop=pLoop->pPri
108a0 6f 72 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  or){.      for(i
108b0 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20  =0; i<2; i++){. 
108c0 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 20         int addr 
108d0 3d 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  = pLoop->addrOpe
108e0 6e 45 70 68 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  nEphm[i];.      
108f0 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
10900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
10910 5b 30 5d 20 69 73 20 75 6e 75 73 65 64 20 74 68  [0] is unused th
10920 65 6e 20 5b 31 5d 20 69 73 20 61 6c 73 6f 20 75  en [1] is also u
10930 6e 75 73 65 64 2e 20 20 53 6f 20 77 65 20 63 61  nused.  So we ca
10940 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  n.          ** a
10950 6c 77 61 79 73 20 73 61 66 65 6c 79 20 61 62 6f  lways safely abo
10960 72 74 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  rt as soon as th
10970 65 20 66 69 72 73 74 20 75 6e 75 73 65 64 20 73  e first unused s
10980 6c 6f 74 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  lot is found */.
10990 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
109a0 28 20 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65  ( pLoop->addrOpe
109b0 6e 45 70 68 6d 5b 31 5d 3c 30 20 29 3b 0a 20 20  nEphm[1]<0 );.  
109c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
109d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
109e0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
109f0 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 6e 43  geP2(v, addr, nC
10a00 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ol);.        sql
10a10 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
10a20 28 76 2c 20 61 64 64 72 2c 20 28 63 68 61 72 2a  (v, addr, (char*
10a30 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
10a40 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 20 20  YINFO);.        
10a50 70 4c 6f 6f 70 2d 3e 61 64 64 72 4f 70 65 6e 45  pLoop->addrOpenE
10a60 70 68 6d 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[i] = -1;.   
10a70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
10a80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
10a90 20 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 7d 0a   pKeyInfo);.  }.
10aa0 0a 6d 75 6c 74 69 5f 73 65 6c 65 63 74 5f 65 6e  .multi_select_en
10ab0 64 3a 0a 20 20 70 44 65 73 74 2d 3e 69 53 64 73  d:.  pDest->iSds
10ac0 74 20 3d 20 64 65 73 74 2e 69 53 64 73 74 3b 0a  t = dest.iSdst;.
10ad0 20 20 70 44 65 73 74 2d 3e 6e 53 64 73 74 20 3d    pDest->nSdst =
10ae0 20 64 65 73 74 2e 6e 53 64 73 74 3b 0a 20 20 73   dest.nSdst;.  s
10af0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
10b00 74 65 28 64 62 2c 20 70 44 65 6c 65 74 65 29 3b  te(db, pDelete);
10b10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10b20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10b30 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
10b40 45 4c 45 43 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ELECT */../*.** 
10b50 43 6f 64 65 20 61 6e 20 6f 75 74 70 75 74 20 73  Code an output s
10b60 75 62 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 20  ubroutine for a 
10b70 63 6f 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  coroutine implem
10b80 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 2a 2a  entation of a.**
10b90 20 53 45 4c 45 43 54 20 73 74 61 74 6d 65 6e 74   SELECT statment
10ba0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61  ..**.** The data
10bb0 20 74 6f 20 62 65 20 6f 75 74 70 75 74 20 69 73   to be output is
10bc0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 70 49   contained in pI
10bd0 6e 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 72 65  n->iSdst.  There
10be0 20 61 72 65 0a 2a 2a 20 70 49 6e 2d 3e 6e 53 64   are.** pIn->nSd
10bf0 73 74 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  st columns to be
10c00 20 6f 75 74 70 75 74 2e 20 20 70 44 65 73 74 20   output.  pDest 
10c10 69 73 20 77 68 65 72 65 20 74 68 65 20 6f 75 74  is where the out
10c20 70 75 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  put should.** be
10c30 20 73 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 72 65 67   sent..**.** reg
10c40 52 65 74 75 72 6e 20 69 73 20 74 68 65 20 6e 75  Return is the nu
10c50 6d 62 65 72 20 6f 66 20 74 68 65 20 72 65 67 69  mber of the regi
10c60 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 74 68 65  ster holding the
10c70 20 73 75 62 72 6f 75 74 69 6e 65 0a 2a 2a 20 72   subroutine.** r
10c80 65 74 75 72 6e 20 61 64 64 72 65 73 73 2e 0a 2a  eturn address..*
10c90 2a 0a 2a 2a 20 49 66 20 72 65 67 50 72 65 76 3e  *.** If regPrev>
10ca0 30 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  0 then it is the
10cb0 20 66 69 72 73 74 20 72 65 67 69 73 74 65 72 20   first register 
10cc0 69 6e 20 61 20 76 65 63 74 6f 72 20 74 68 61 74  in a vector that
10cd0 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74 68 65 20  .** records the 
10ce0 70 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e  previous output.
10cf0 20 20 6d 65 6d 5b 72 65 67 50 72 65 76 5d 20 69    mem[regPrev] i
10d00 73 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 73  s a flag that is
10d10 20 66 61 6c 73 65 0a 2a 2a 20 69 66 20 74 68 65   false.** if the
10d20 72 65 20 68 61 73 20 62 65 65 6e 20 6e 6f 20 70  re has been no p
10d30 72 65 76 69 6f 75 73 20 6f 75 74 70 75 74 2e 20  revious output. 
10d40 20 49 66 20 72 65 67 50 72 65 76 3e 30 20 74 68   If regPrev>0 th
10d50 65 6e 20 63 6f 64 65 20 69 73 0a 2a 2a 20 67 65  en code is.** ge
10d60 6e 65 72 61 74 65 64 20 74 6f 20 73 75 70 70 72  nerated to suppr
10d70 65 73 73 20 64 75 70 6c 69 63 61 74 65 73 2e 20  ess duplicates. 
10d80 20 70 4b 65 79 49 6e 66 6f 20 69 73 20 75 73 65   pKeyInfo is use
10d90 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 0a  d for comparing.
10da0 2a 2a 20 6b 65 79 73 2e 0a 2a 2a 0a 2a 2a 20 49  ** keys..**.** I
10db0 66 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 75 6e  f the LIMIT foun
10dc0 64 20 69 6e 20 70 2d 3e 69 4c 69 6d 69 74 20 69  d in p->iLimit i
10dd0 73 20 72 65 61 63 68 65 64 2c 20 6a 75 6d 70 20  s reached, jump 
10de0 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 0a 2a  immediately to.*
10df0 2a 20 69 42 72 65 61 6b 2e 0a 2a 2f 0a 73 74 61  * iBreak..*/.sta
10e00 74 69 63 20 69 6e 74 20 67 65 6e 65 72 61 74 65  tic int generate
10e10 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
10e20 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
10e30 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
10e40 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
10e50 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
10e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10e70 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
10e80 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44  ent */.  SelectD
10e90 65 73 74 20 2a 70 49 6e 2c 20 20 20 20 20 20 20  est *pIn,       
10ea0 20 2f 2a 20 43 6f 72 6f 75 74 69 6e 65 20 73 75   /* Coroutine su
10eb0 70 70 6c 79 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pplying data */.
10ec0 20 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44    SelectDest *pD
10ed0 65 73 74 2c 20 20 20 20 20 20 2f 2a 20 57 68 65  est,      /* Whe
10ee0 72 65 20 74 6f 20 73 65 6e 64 20 74 68 65 20 64  re to send the d
10ef0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ata */.  int reg
10f00 52 65 74 75 72 6e 2c 20 20 20 20 20 20 20 20 20  Return,         
10f10 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 61   /* The return a
10f20 64 64 72 65 73 73 20 72 65 67 69 73 74 65 72 20  ddress register 
10f30 2a 2f 0a 20 20 69 6e 74 20 72 65 67 50 72 65 76  */.  int regPrev
10f40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
10f50 50 72 65 76 69 6f 75 73 20 72 65 73 75 6c 74 20  Previous result 
10f60 72 65 67 69 73 74 65 72 2e 20 20 4e 6f 20 75 6e  register.  No un
10f70 69 71 75 65 6e 65 73 73 20 69 66 20 30 20 2a 2f  iqueness if 0 */
10f80 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
10f90 49 6e 66 6f 2c 20 20 20 20 20 20 2f 2a 20 46 6f  Info,      /* Fo
10fa0 72 20 63 6f 6d 70 61 72 69 6e 67 20 77 69 74 68  r comparing with
10fb0 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20   previous entry 
10fc0 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 2c  */.  int p4type,
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10fe0 54 68 65 20 70 34 20 74 79 70 65 20 66 6f 72 20  The p4 type for 
10ff0 70 4b 65 79 49 6e 66 6f 20 2a 2f 0a 20 20 69 6e  pKeyInfo */.  in
11000 74 20 69 42 72 65 61 6b 20 20 20 20 20 20 20 20  t iBreak        
11010 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
11020 72 65 20 69 66 20 77 65 20 68 69 74 20 74 68 65  re if we hit the
11030 20 4c 49 4d 49 54 20 2a 2f 0a 29 7b 0a 20 20 56   LIMIT */.){.  V
11040 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
11050 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 43  >pVdbe;.  int iC
11060 6f 6e 74 69 6e 75 65 3b 0a 20 20 69 6e 74 20 61  ontinue;.  int a
11070 64 64 72 3b 0a 0a 20 20 61 64 64 72 20 3d 20 73  ddr;..  addr = s
11080 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
11090 74 41 64 64 72 28 76 29 3b 0a 20 20 69 43 6f 6e  tAddr(v);.  iCon
110a0 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33 56  tinue = sqlite3V
110b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
110c0 0a 0a 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20  ..  /* Suppress 
110d0 64 75 70 6c 69 63 61 74 65 73 20 66 6f 72 20 55  duplicates for U
110e0 4e 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e  NION, EXCEPT, an
110f0 64 20 49 4e 54 45 52 53 45 43 54 20 0a 20 20 2a  d INTERSECT .  *
11100 2f 0a 20 20 69 66 28 20 72 65 67 50 72 65 76 20  /.  if( regPrev 
11110 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a  ){.    int j1, j
11120 32 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  2;.    j1 = sqli
11130 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
11140 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 65 67 50 72   OP_IfNot, regPr
11150 65 76 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73 71  ev);.    j2 = sq
11160 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
11170 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c 20 70  v, OP_Compare, p
11180 49 6e 2d 3e 69 53 64 73 74 2c 20 72 65 67 50 72  In->iSdst, regPr
11190 65 76 2b 31 2c 20 70 49 6e 2d 3e 6e 53 64 73 74  ev+1, pIn->nSdst
111a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111c0 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f 2c  (char*)pKeyInfo,
111d0 20 70 34 74 79 70 65 29 3b 0a 20 20 20 20 73 71   p4type);.    sq
111e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
111f0 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 6a 32 2b 32  v, OP_Jump, j2+2
11200 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20 6a 32 2b  , iContinue, j2+
11210 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
11220 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
11230 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
11240 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
11250 43 6f 70 79 2c 20 70 49 6e 2d 3e 69 53 64 73 74  Copy, pIn->iSdst
11260 2c 20 72 65 67 50 72 65 76 2b 31 2c 20 70 49 6e  , regPrev+1, pIn
11270 2d 3e 6e 53 64 73 74 2d 31 29 3b 0a 20 20 20 20  ->nSdst-1);.    
11280 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11290 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
112a0 20 31 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20   1, regPrev);.  
112b0 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  }.  if( pParse->
112c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
112d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
112e0 2f 2a 20 53 75 70 70 72 65 73 73 20 74 68 65 20  /* Suppress the 
112f0 66 69 72 73 74 20 4f 46 46 53 45 54 20 65 6e 74  first OFFSET ent
11300 72 69 65 73 20 69 66 20 74 68 65 72 65 20 69 73  ries if there is
11310 20 61 6e 20 4f 46 46 53 45 54 20 63 6c 61 75 73   an OFFSET claus
11320 65 0a 20 20 2a 2f 0a 20 20 63 6f 64 65 4f 66 66  e.  */.  codeOff
11330 73 65 74 28 76 2c 20 70 2c 20 69 43 6f 6e 74 69  set(v, p, iConti
11340 6e 75 65 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  nue);..  switch(
11350 20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 29 7b   pDest->eDest ){
11360 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68  .    /* Store th
11370 65 20 72 65 73 75 6c 74 20 61 73 20 64 61 74 61  e result as data
11380 20 75 73 69 6e 67 20 61 20 75 6e 69 71 75 65 20   using a unique 
11390 6b 65 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  key..    */.    
113a0 63 61 73 65 20 53 52 54 5f 54 61 62 6c 65 3a 0a  case SRT_Table:.
113b0 20 20 20 20 63 61 73 65 20 53 52 54 5f 45 70 68      case SRT_Eph
113c0 65 6d 54 61 62 3a 20 7b 0a 20 20 20 20 20 20 69  emTab: {.      i
113d0 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
113e0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
113f0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 32 20  );.      int r2 
11400 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
11410 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
11420 20 20 20 74 65 73 74 63 61 73 65 28 20 70 44 65     testcase( pDe
11430 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 54  st->eDest==SRT_T
11440 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 74 65  able );.      te
11450 73 74 63 61 73 65 28 20 70 44 65 73 74 2d 3e 65  stcase( pDest->e
11460 44 65 73 74 3d 3d 53 52 54 5f 45 70 68 65 6d 54  Dest==SRT_EphemT
11470 61 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ab );.      sqli
11480 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11490 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
114a0 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d  pIn->iSdst, pIn-
114b0 3e 6e 53 64 73 74 2c 20 72 31 29 3b 0a 20 20 20  >nSdst, r1);.   
114c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
114d0 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
114e0 77 69 64 2c 20 70 44 65 73 74 2d 3e 69 53 44 50  wid, pDest->iSDP
114f0 61 72 6d 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  arm, r2);.      
11500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11510 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
11520 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
11530 72 31 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 73  r1, r2);.      s
11540 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
11550 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50  P5(v, OPFLAG_APP
11560 45 4e 44 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  END);.      sqli
11570 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
11580 67 28 70 50 61 72 73 65 2c 20 72 32 29 3b 0a 20  g(pParse, r2);. 
11590 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
115a0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
115b0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62 72  e, r1);.      br
115c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  eak;.    }..#ifn
115d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
115e0 53 55 42 51 55 45 52 59 0a 20 20 20 20 2f 2a 20  SUBQUERY.    /* 
115f0 49 66 20 77 65 20 61 72 65 20 63 72 65 61 74 69  If we are creati
11600 6e 67 20 61 20 73 65 74 20 66 6f 72 20 61 6e 20  ng a set for an 
11610 22 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54  "expr IN (SELECT
11620 20 2e 2e 2e 29 22 20 63 6f 6e 73 74 72 75 63 74   ...)" construct
11630 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68  ,.    ** then th
11640 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20  ere should be a 
11650 73 69 6e 67 6c 65 20 69 74 65 6d 20 6f 6e 20 74  single item on t
11660 68 65 20 73 74 61 63 6b 2e 20 20 57 72 69 74 65  he stack.  Write
11670 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 74 65   this.    ** ite
11680 6d 20 69 6e 74 6f 20 74 68 65 20 73 65 74 20 74  m into the set t
11690 61 62 6c 65 20 77 69 74 68 20 62 6f 67 75 73 20  able with bogus 
116a0 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
116b0 20 63 61 73 65 20 53 52 54 5f 53 65 74 3a 20 7b   case SRT_Set: {
116c0 0a 20 20 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  .      int r1;. 
116d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
116e0 2d 3e 6e 53 64 73 74 3d 3d 31 20 29 3b 0a 20 20  ->nSdst==1 );.  
116f0 20 20 20 20 70 44 65 73 74 2d 3e 61 66 66 53 64      pDest->affSd
11700 73 74 20 3d 20 0a 20 20 20 20 20 20 20 20 20 73  st = .         s
11710 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
11720 69 6e 69 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d  inity(p->pEList-
11730 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 70 44 65  >a[0].pExpr, pDe
11740 73 74 2d 3e 61 66 66 53 64 73 74 29 3b 0a 20 20  st->affSdst);.  
11750 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
11760 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
11770 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
11780 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
11790 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 70 49  P_MakeRecord, pI
117a0 6e 2d 3e 69 53 64 73 74 2c 20 31 2c 20 72 31 2c  n->iSdst, 1, r1,
117b0 20 26 70 44 65 73 74 2d 3e 61 66 66 53 64 73 74   &pDest->affSdst
117c0 2c 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ,1);.      sqlit
117d0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
117e0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
117f0 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 31 29  , pIn->iSdst, 1)
11800 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11810 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
11820 49 64 78 49 6e 73 65 72 74 2c 20 70 44 65 73 74  IdxInsert, pDest
11830 2d 3e 69 53 44 50 61 72 6d 2c 20 72 31 29 3b 0a  ->iSDParm, r1);.
11840 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
11850 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
11860 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 62  se, r1);.      b
11870 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
11880 20 30 20 20 2f 2a 20 4e 65 76 65 72 20 6f 63 63   0  /* Never occ
11890 75 72 73 20 6f 6e 20 61 6e 20 4f 52 44 45 52 20  urs on an ORDER 
118a0 42 59 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20  BY query */.    
118b0 2f 2a 20 49 66 20 61 6e 79 20 72 6f 77 20 65 78  /* If any row ex
118c0 69 73 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ist in the resul
118d0 74 20 73 65 74 2c 20 72 65 63 6f 72 64 20 74 68  t set, record th
118e0 61 74 20 66 61 63 74 20 61 6e 64 20 61 62 6f 72  at fact and abor
118f0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  t..    */.    ca
11900 73 65 20 53 52 54 5f 45 78 69 73 74 73 3a 20 7b  se SRT_Exists: {
11910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11920 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
11930 6e 74 65 67 65 72 2c 20 31 2c 20 70 44 65 73 74  nteger, 1, pDest
11940 2d 3e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  ->iSDParm);.    
11950 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 63    /* The LIMIT c
11960 6c 61 75 73 65 20 77 69 6c 6c 20 74 65 72 6d 69  lause will termi
11970 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 20 66 6f  nate the loop fo
11980 72 20 75 73 20 2a 2f 0a 20 20 20 20 20 20 62 72  r us */.      br
11990 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
119a0 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  f..    /* If thi
119b0 73 20 69 73 20 61 20 73 63 61 6c 61 72 20 73 65  s is a scalar se
119c0 6c 65 63 74 20 74 68 61 74 20 69 73 20 70 61 72  lect that is par
119d0 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  t of an expressi
119e0 6f 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  on, then.    ** 
119f0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
11a00 73 20 69 6e 20 74 68 65 20 61 70 70 72 6f 70 72  s in the appropr
11a10 69 61 74 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iate memory cell
11a20 20 61 6e 64 20 62 72 65 61 6b 20 6f 75 74 0a 20   and break out. 
11a30 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 63 61     ** of the sca
11a40 6e 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20  n loop..    */. 
11a50 20 20 20 63 61 73 65 20 53 52 54 5f 4d 65 6d 3a     case SRT_Mem:
11a60 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
11a70 20 70 49 6e 2d 3e 6e 53 64 73 74 3d 3d 31 20 29   pIn->nSdst==1 )
11a80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
11a90 78 70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72  xprCodeMove(pPar
11aa0 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20  se, pIn->iSdst, 
11ab0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2c 20  pDest->iSDParm, 
11ac0 31 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  1);.      /* The
11ad0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 77 69   LIMIT clause wi
11ae0 6c 6c 20 6a 75 6d 70 20 6f 75 74 20 6f 66 20 74  ll jump out of t
11af0 68 65 20 6c 6f 6f 70 20 66 6f 72 20 75 73 20 2a  he loop for us *
11b00 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
11b10 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 23     }.#endif /* #
11b20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11b30 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
11b40 20 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c      /* The resul
11b50 74 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ts are stored in
11b60 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 72   a sequence of r
11b70 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20  egisters.    ** 
11b80 73 74 61 72 74 69 6e 67 20 61 74 20 70 44 65 73  starting at pDes
11b90 74 2d 3e 69 53 64 73 74 2e 20 20 54 68 65 6e 20  t->iSdst.  Then 
11ba0 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 79  the co-routine y
11bb0 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
11bc0 20 20 63 61 73 65 20 53 52 54 5f 43 6f 72 6f 75    case SRT_Corou
11bd0 74 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 66  tine: {.      if
11be0 28 20 70 44 65 73 74 2d 3e 69 53 64 73 74 3d 3d  ( pDest->iSdst==
11bf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
11c00 73 74 2d 3e 69 53 64 73 74 20 3d 20 73 71 6c 69  st->iSdst = sqli
11c10 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
11c20 70 50 61 72 73 65 2c 20 70 49 6e 2d 3e 6e 53 64  pParse, pIn->nSd
11c30 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44 65  st);.        pDe
11c40 73 74 2d 3e 6e 53 64 73 74 20 3d 20 70 49 6e 2d  st->nSdst = pIn-
11c50 3e 6e 53 64 73 74 3b 0a 20 20 20 20 20 20 7d 0a  >nSdst;.      }.
11c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11c70 72 43 6f 64 65 4d 6f 76 65 28 70 50 61 72 73 65  rCodeMove(pParse
11c80 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c 20 70 44  , pIn->iSdst, pD
11c90 65 73 74 2d 3e 69 53 64 73 74 2c 20 70 44 65 73  est->iSdst, pDes
11ca0 74 2d 3e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20  t->nSdst);.     
11cb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11cc0 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
11cd0 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 29 3b  pDest->iSDParm);
11ce0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11cf0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
11d00 6f 6e 65 20 6f 66 20 74 68 65 20 61 62 6f 76 65  one of the above
11d10 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
11d20 74 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 6d 75  t destination mu
11d30 73 74 20 62 65 0a 20 20 20 20 2a 2a 20 53 52 54  st be.    ** SRT
11d40 5f 4f 75 74 70 75 74 2e 20 20 54 68 69 73 20 72  _Output.  This r
11d50 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20  outine is never 
11d60 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 79 20  called with any 
11d70 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 65 73  other.    ** des
11d80 74 69 6e 61 74 69 6f 6e 20 6f 74 68 65 72 20 74  tination other t
11d90 68 61 6e 20 74 68 65 20 6f 6e 65 73 20 68 61 6e  han the ones han
11da0 64 6c 65 64 20 61 62 6f 76 65 20 6f 72 20 53 52  dled above or SR
11db0 54 5f 4f 75 74 70 75 74 2e 0a 20 20 20 20 2a 2a  T_Output..    **
11dc0 0a 20 20 20 20 2a 2a 20 46 6f 72 20 53 52 54 5f  .    ** For SRT_
11dd0 4f 75 74 70 75 74 2c 20 72 65 73 75 6c 74 73 20  Output, results 
11de0 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20  are stored in a 
11df0 73 65 71 75 65 6e 63 65 20 6f 66 20 72 65 67 69  sequence of regi
11e00 73 74 65 72 73 2e 20 20 0a 20 20 20 20 2a 2a 20  sters.  .    ** 
11e10 54 68 65 6e 20 74 68 65 20 4f 50 5f 52 65 73 75  Then the OP_Resu
11e20 6c 74 52 6f 77 20 6f 70 63 6f 64 65 20 69 73 20  ltRow opcode is 
11e30 75 73 65 64 20 74 6f 20 63 61 75 73 65 20 73 71  used to cause sq
11e40 6c 69 74 65 33 5f 73 74 65 70 28 29 20 74 6f 0a  lite3_step() to.
11e50 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68      ** return th
11e60 65 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 72 65  e next row of re
11e70 73 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sult..    */.   
11e80 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
11e90 20 20 61 73 73 65 72 74 28 20 70 44 65 73 74 2d    assert( pDest-
11ea0 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
11eb0 75 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ut );.      sqli
11ec0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
11ed0 20 4f 50 5f 52 65 73 75 6c 74 52 6f 77 2c 20 70   OP_ResultRow, p
11ee0 49 6e 2d 3e 69 53 64 73 74 2c 20 70 49 6e 2d 3e  In->iSdst, pIn->
11ef0 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71  nSdst);.      sq
11f00 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
11f10 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
11f20 72 73 65 2c 20 70 49 6e 2d 3e 69 53 64 73 74 2c  rse, pIn->iSdst,
11f30 20 70 49 6e 2d 3e 6e 53 64 73 74 29 3b 0a 20 20   pIn->nSdst);.  
11f40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11f50 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
11f60 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
11f70 65 20 6c 6f 6f 70 20 69 66 20 74 68 65 20 4c 49  e loop if the LI
11f80 4d 49 54 20 69 73 20 72 65 61 63 68 65 64 2e 0a  MIT is reached..
11f90 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 4c    */.  if( p->iL
11fa0 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  imit ){.    sqli
11fb0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11fc0 20 4f 50 5f 49 66 5a 65 72 6f 2c 20 70 2d 3e 69   OP_IfZero, p->i
11fd0 4c 69 6d 69 74 2c 20 69 42 72 65 61 6b 2c 20 2d  Limit, iBreak, -
11fe0 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  1);.  }..  /* Ge
11ff0 6e 65 72 61 74 65 20 74 68 65 20 73 75 62 72 6f  nerate the subro
12000 75 74 69 6e 65 20 72 65 74 75 72 6e 0a 20 20 2a  utine return.  *
12010 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
12020 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
12030 43 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 73 71 6c  Continue);.  sql
12040 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
12050 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65 67  , OP_Return, reg
12060 52 65 74 75 72 6e 29 3b 0a 0a 20 20 72 65 74 75  Return);..  retu
12070 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
12080 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 63 6f  * Alternative co
12090 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 63 6f  mpound select co
120a0 64 65 20 67 65 6e 65 72 61 74 6f 72 20 66 6f 72  de generator for
120b0 20 63 61 73 65 73 20 77 68 65 6e 20 74 68 65 72   cases when ther
120c0 65 0a 2a 2a 20 69 73 20 61 6e 20 4f 52 44 45 52  e.** is an ORDER
120d0 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a   BY clause..**.*
120e0 2a 20 57 65 20 61 73 73 75 6d 65 20 61 20 71 75  * We assume a qu
120f0 65 72 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ery of the follo
12100 77 69 6e 67 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a  wing form:.**.**
12110 20 20 20 20 20 20 3c 73 65 6c 65 63 74 41 3e 20        <selectA> 
12120 20 3c 6f 70 65 72 61 74 6f 72 3e 20 20 3c 73 65   <operator>  <se
12130 6c 65 63 74 42 3e 20 20 4f 52 44 45 52 20 42 59  lectB>  ORDER BY
12140 20 3c 6f 72 64 65 72 62 79 6c 69 73 74 3e 0a 2a   <orderbylist>.*
12150 2a 0a 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20  *.** <operator> 
12160 69 73 20 6f 6e 65 20 6f 66 20 55 4e 49 4f 4e 20  is one of UNION 
12170 41 4c 4c 2c 20 55 4e 49 4f 4e 2c 20 45 58 43 45  ALL, UNION, EXCE
12180 50 54 2c 20 6f 72 20 49 4e 54 45 52 53 45 43 54  PT, or INTERSECT
12190 2e 20 20 54 68 65 20 69 64 65 61 0a 2a 2a 20 69  .  The idea.** i
121a0 73 20 74 6f 20 63 6f 64 65 20 62 6f 74 68 20 3c  s to code both <
121b0 73 65 6c 65 63 74 41 3e 20 61 6e 64 20 3c 73 65  selectA> and <se
121c0 6c 65 63 74 42 3e 20 77 69 74 68 20 74 68 65 20  lectB> with the 
121d0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
121e0 61 73 0a 2a 2a 20 63 6f 2d 72 6f 75 74 69 6e 65  as.** co-routine
121f0 73 2e 20 20 54 68 65 6e 20 72 75 6e 20 74 68 65  s.  Then run the
12200 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 69 6e 20   co-routines in 
12210 70 61 72 61 6c 6c 65 6c 20 61 6e 64 20 6d 65 72  parallel and mer
12220 67 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a  ge the results.*
12230 2a 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75  * into the outpu
12240 74 2e 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  t.  In addition 
12250 74 6f 20 74 68 65 20 74 77 6f 20 63 6f 72 6f 75  to the two corou
12260 74 69 6e 65 73 20 28 63 61 6c 6c 65 64 20 73 65  tines (called se
12270 6c 65 63 74 41 20 61 6e 64 0a 2a 2a 20 73 65 6c  lectA and.** sel
12280 65 63 74 42 29 20 74 68 65 72 65 20 61 72 65 20  ectB) there are 
12290 37 20 73 75 62 72 6f 75 74 69 6e 65 73 3a 0a 2a  7 subroutines:.*
122a0 2a 0a 2a 2a 20 20 20 20 6f 75 74 41 3a 20 20 20  *.**    outA:   
122b0 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75 74   Move the output
122c0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 41 20   of the selectA 
122d0 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 74  coroutine into t
122e0 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20 20  he output.**    
122f0 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20           of the 
12300 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e 0a  compound query..
12310 2a 2a 0a 2a 2a 20 20 20 20 6f 75 74 42 3a 20 20  **.**    outB:  
12320 20 20 4d 6f 76 65 20 74 68 65 20 6f 75 74 70 75    Move the outpu
12330 74 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 42  t of the selectB
12340 20 63 6f 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20   coroutine into 
12350 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 20 20  the output.**   
12360 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68 65            of the
12370 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2e   compound query.
12380 20 20 28 4f 6e 6c 79 20 67 65 6e 65 72 61 74 65    (Only generate
12390 64 20 66 6f 72 20 55 4e 49 4f 4e 20 61 6e 64 0a  d for UNION and.
123a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 55  **             U
123b0 4e 49 4f 4e 20 41 4c 4c 2e 20 20 45 58 43 45 50  NION ALL.  EXCEP
123c0 54 20 61 6e 64 20 49 4e 53 45 52 54 53 45 43 54  T and INSERTSECT
123d0 20 6e 65 76 65 72 20 6f 75 74 70 75 74 20 61 20   never output a 
123e0 72 6f 77 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  row that.**     
123f0 20 20 20 20 20 20 20 20 61 70 70 65 61 72 73 20          appears 
12400 6f 6e 6c 79 20 69 6e 20 42 2e 29 0a 2a 2a 0a 2a  only in B.).**.*
12410 2a 20 20 20 20 41 6c 74 42 3a 20 20 20 20 43 61  *    AltB:    Ca
12420 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  lled when there 
12430 69 73 20 64 61 74 61 20 66 72 6f 6d 20 62 6f 74  is data from bot
12440 68 20 63 6f 72 6f 75 74 69 6e 65 73 20 61 6e 64  h coroutines and
12450 20 41 3c 42 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 41   A<B..**.**    A
12460 65 71 42 3a 20 20 20 20 43 61 6c 6c 65 64 20 77  eqB:    Called w
12470 68 65 6e 20 74 68 65 72 65 20 69 73 20 64 61 74  hen there is dat
12480 61 20 66 72 6f 6d 20 62 6f 74 68 20 63 6f 72 6f  a from both coro
12490 75 74 69 6e 65 73 20 61 6e 64 20 41 3d 3d 42 2e  utines and A==B.
124a0 0a 2a 2a 0a 2a 2a 20 20 20 20 41 67 74 42 3a 20  .**.**    AgtB: 
124b0 20 20 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74     Called when t
124c0 68 65 72 65 20 69 73 20 64 61 74 61 20 66 72 6f  here is data fro
124d0 6d 20 62 6f 74 68 20 63 6f 72 6f 75 74 69 6e 65  m both coroutine
124e0 73 20 61 6e 64 20 41 3e 42 2e 0a 2a 2a 0a 2a 2a  s and A>B..**.**
124f0 20 20 20 20 45 6f 66 41 3a 20 20 20 20 43 61 6c      EofA:    Cal
12500 6c 65 64 20 77 68 65 6e 20 64 61 74 61 20 69 73  led when data is
12510 20 65 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20   exhausted from 
12520 73 65 6c 65 63 74 41 2e 0a 2a 2a 0a 2a 2a 20 20  selectA..**.**  
12530 20 20 45 6f 66 42 3a 20 20 20 20 43 61 6c 6c 65    EofB:    Calle
12540 64 20 77 68 65 6e 20 64 61 74 61 20 69 73 20 65  d when data is e
12550 78 68 61 75 73 74 65 64 20 66 72 6f 6d 20 73 65  xhausted from se
12560 6c 65 63 74 42 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lectB..**.** The
12570 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
12580 6f 66 20 74 68 65 20 6c 61 74 74 65 72 20 66 69  of the latter fi
12590 76 65 20 73 75 62 72 6f 75 74 69 6e 65 73 20 64  ve subroutines d
125a0 65 70 65 6e 64 20 6f 6e 20 77 68 69 63 68 20 0a  epend on which .
125b0 2a 2a 20 3c 6f 70 65 72 61 74 6f 72 3e 20 69 73  ** <operator> is
125c0 20 75 73 65 64 3a 0a 2a 2a 0a 2a 2a 0a 2a 2a 20   used:.**.**.** 
125d0 20 20 20 20 20 20 20 20 20 20 20 20 55 4e 49 4f              UNIO
125e0 4e 20 41 4c 4c 20 20 20 20 20 20 20 20 20 55 4e  N ALL         UN
125f0 49 4f 4e 20 20 20 20 20 20 20 20 20 20 20 20 45  ION            E
12600 58 43 45 50 54 20 20 20 20 20 20 20 20 20 20 49  XCEPT          I
12610 4e 54 45 52 53 45 43 54 0a 2a 2a 20 20 20 20 20  NTERSECT.**     
12620 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
12630 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  --  ------------
12640 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
12650 2d 2d 2d 2d 2d 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  -----  ---------
12660 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 41 6c  --------.**   Al
12670 74 42 3a 20 20 20 6f 75 74 41 2c 20 6e 65 78 74  tB:   outA, next
12680 41 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78  A      outA, nex
12690 74 41 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e  tA       outA, n
126a0 65 78 74 41 20 20 20 20 20 20 20 20 20 6e 65 78  extA         nex
126b0 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 65 71 42 3a  tA.**.**   AeqB:
126c0 20 20 20 6f 75 74 41 2c 20 6e 65 78 74 41 20 20     outA, nextA  
126d0 20 20 20 20 20 20 20 6e 65 78 74 41 20 20 20 20         nextA    
126e0 20 20 20 20 20 20 20 20 20 6e 65 78 74 41 20 20           nextA  
126f0 20 20 20 20 20 20 20 6f 75 74 41 2c 20 6e 65 78         outA, nex
12700 74 41 0a 2a 2a 0a 2a 2a 20 20 20 41 67 74 42 3a  tA.**.**   AgtB:
12710 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20     outB, nextB  
12720 20 20 20 20 6f 75 74 42 2c 20 6e 65 78 74 42 20      outB, nextB 
12730 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 20 20           nextB  
12740 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 42 0a            nextB.
12750 2a 2a 0a 2a 2a 20 20 20 45 6f 66 41 3a 20 20 20  **.**   EofA:   
12760 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20 20  outB, nextB     
12770 20 6f 75 74 42 2c 20 6e 65 78 74 42 20 20 20 20   outB, nextB    
12780 20 20 20 20 20 20 68 61 6c 74 20 20 20 20 20 20        halt      
12790 20 20 20 20 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a         halt.**.*
127a0 2a 20 20 20 45 6f 66 42 3a 20 20 20 6f 75 74 41  *   EofB:   outA
127b0 2c 20 6e 65 78 74 41 20 20 20 20 20 20 6f 75 74  , nextA      out
127c0 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20 20 6f  A, nextA       o
127d0 75 74 41 2c 20 6e 65 78 74 41 20 20 20 20 20 20  utA, nextA      
127e0 20 20 20 68 61 6c 74 0a 2a 2a 0a 2a 2a 20 49 6e     halt.**.** In
127f0 20 74 68 65 20 41 6c 74 42 2c 20 41 65 71 42 2c   the AltB, AeqB,
12800 20 61 6e 64 20 41 67 74 42 20 73 75 62 72 6f 75   and AgtB subrou
12810 74 69 6e 65 73 2c 20 61 6e 20 45 4f 46 20 6f 6e  tines, an EOF on
12820 20 41 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 65 78   A following nex
12830 74 41 0a 2a 2a 20 63 61 75 73 65 73 20 61 6e 20  tA.** causes an 
12840 69 6d 6d 65 64 69 61 74 65 20 6a 75 6d 70 20 74  immediate jump t
12850 6f 20 45 6f 66 41 20 61 6e 64 20 61 6e 20 45 4f  o EofA and an EO
12860 46 20 6f 6e 20 42 20 66 6f 6c 6c 6f 77 69 6e 67  F on B following
12870 20 6e 65 78 74 42 20 63 61 75 73 65 73 0a 2a 2a   nextB causes.**
12880 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 6a 75   an immediate ju
12890 6d 70 20 74 6f 20 45 6f 66 42 2e 20 20 57 69 74  mp to EofB.  Wit
128a0 68 69 6e 20 45 6f 66 41 20 61 6e 64 20 45 6f 66  hin EofA and Eof
128b0 42 2c 20 61 6e 64 20 45 4f 46 20 6f 6e 20 65 6e  B, and EOF on en
128c0 74 72 79 20 6f 72 0a 2a 2a 20 66 6f 6c 6c 6f 77  try or.** follow
128d0 69 6e 67 20 6e 65 78 74 58 20 63 61 75 73 65 73  ing nextX causes
128e0 20 61 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 65   a jump to the e
128f0 6e 64 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  nd of the select
12900 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
12910 2a 2a 20 44 75 70 6c 69 63 61 74 65 20 72 65 6d  ** Duplicate rem
12920 6f 76 61 6c 20 69 6e 20 74 68 65 20 55 4e 49 4f  oval in the UNIO
12930 4e 2c 20 45 58 43 45 50 54 2c 20 61 6e 64 20 49  N, EXCEPT, and I
12940 4e 54 45 52 53 45 43 54 20 63 61 73 65 73 20 69  NTERSECT cases i
12950 73 20 68 61 6e 64 6c 65 64 0a 2a 2a 20 77 69 74  s handled.** wit
12960 68 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 73  hin the output s
12970 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  ubroutine.  The 
12980 72 65 67 50 72 65 76 20 72 65 67 69 73 74 65 72  regPrev register
12990 20 73 65 74 20 68 6f 6c 64 73 20 74 68 65 20 70   set holds the p
129a0 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20 6f 75 74  reviously.** out
129b0 70 75 74 20 76 61 6c 75 65 2e 20 20 41 20 63 6f  put value.  A co
129c0 6d 70 61 72 69 73 6f 6e 20 69 73 20 6d 61 64 65  mparison is made
129d0 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 76 61   against this va
129e0 6c 75 65 20 61 6e 64 20 74 68 65 20 6f 75 74 70  lue and the outp
129f0 75 74 0a 2a 2a 20 69 73 20 73 6b 69 70 70 65 64  ut.** is skipped
12a00 20 69 66 20 74 68 65 20 6e 65 78 74 20 72 65 73   if the next res
12a10 75 6c 74 73 20 77 6f 75 6c 64 20 62 65 20 74 68  ults would be th
12a20 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 72  e same as the pr
12a30 65 76 69 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  evious..**.** Th
12a40 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
12a50 20 70 6c 61 6e 20 69 73 20 74 6f 20 69 6d 70 6c   plan is to impl
12a60 65 6d 65 6e 74 20 74 68 65 20 74 77 6f 20 63 6f  ement the two co
12a70 72 6f 75 74 69 6e 65 73 20 61 6e 64 20 73 65 76  routines and sev
12a80 65 6e 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65  en.** subroutine
12a90 73 20 66 69 72 73 74 2c 20 74 68 65 6e 20 70 75  s first, then pu
12aa0 74 20 74 68 65 20 63 6f 6e 74 72 6f 6c 20 6c 6f  t the control lo
12ab0 67 69 63 20 61 74 20 74 68 65 20 62 6f 74 74 6f  gic at the botto
12ac0 6d 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 0a 2a  m.  Like this:.*
12ad0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 67 6f  *.**          go
12ae0 74 6f 20 49 6e 69 74 0a 2a 2a 20 20 20 20 20 63  to Init.**     c
12af0 6f 41 3a 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f  oA: coroutine fo
12b00 72 20 6c 65 66 74 20 71 75 65 72 79 20 28 41 29  r left query (A)
12b10 0a 2a 2a 20 20 20 20 20 63 6f 42 3a 20 63 6f 72  .**     coB: cor
12b20 6f 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74  outine for right
12b30 20 71 75 65 72 79 20 28 42 29 0a 2a 2a 20 20 20   query (B).**   
12b40 20 6f 75 74 41 3a 20 6f 75 74 70 75 74 20 6f 6e   outA: output on
12b50 65 20 72 6f 77 20 6f 66 20 41 0a 2a 2a 20 20 20  e row of A.**   
12b60 20 6f 75 74 42 3a 20 6f 75 74 70 75 74 20 6f 6e   outB: output on
12b70 65 20 72 6f 77 20 6f 66 20 42 20 28 55 4e 49 4f  e row of B (UNIO
12b80 4e 20 61 6e 64 20 55 4e 49 4f 4e 20 41 4c 4c 20  N and UNION ALL 
12b90 6f 6e 6c 79 29 0a 2a 2a 20 20 20 20 45 6f 66 41  only).**    EofA
12ba0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 45 6f 66 42  : ....**    EofB
12bb0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 6c 74 42  : ....**    AltB
12bc0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 65 71 42  : ....**    AeqB
12bd0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 41 67 74 42  : ....**    AgtB
12be0 3a 20 2e 2e 2e 0a 2a 2a 20 20 20 20 49 6e 69 74  : ....**    Init
12bf0 3a 20 69 6e 69 74 69 61 6c 69 7a 65 20 63 6f 72  : initialize cor
12c00 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
12c10 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 79 69 65  .**          yie
12c20 6c 64 20 63 6f 41 0a 2a 2a 20 20 20 20 20 20 20  ld coA.**       
12c30 20 20 20 69 66 20 65 6f 66 28 41 29 20 67 6f 74     if eof(A) got
12c40 6f 20 45 6f 66 41 0a 2a 2a 20 20 20 20 20 20 20  o EofA.**       
12c50 20 20 20 79 69 65 6c 64 20 63 6f 42 0a 2a 2a 20     yield coB.** 
12c60 20 20 20 20 20 20 20 20 20 69 66 20 65 6f 66 28           if eof(
12c70 42 29 20 67 6f 74 6f 20 45 6f 66 42 0a 2a 2a 20  B) goto EofB.** 
12c80 20 20 20 43 6d 70 72 3a 20 43 6f 6d 70 61 72 65     Cmpr: Compare
12c90 20 41 2c 20 42 0a 2a 2a 20 20 20 20 20 20 20 20   A, B.**        
12ca0 20 20 4a 75 6d 70 20 41 6c 74 42 2c 20 41 65 71    Jump AltB, Aeq
12cb0 42 2c 20 41 67 74 42 0a 2a 2a 20 20 20 20 20 45  B, AgtB.**     E
12cc0 6e 64 3a 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 57 65  nd: ....**.** We
12cd0 20 63 61 6c 6c 20 41 6c 74 42 2c 20 41 65 71 42   call AltB, AeqB
12ce0 2c 20 41 67 74 42 2c 20 45 6f 66 41 2c 20 61 6e  , AgtB, EofA, an
12cf0 64 20 45 6f 66 42 20 22 73 75 62 72 6f 75 74 69  d EofB "subrouti
12d00 6e 65 73 22 20 62 75 74 20 74 68 65 79 20 61 72  nes" but they ar
12d10 65 20 6e 6f 74 0a 2a 2a 20 61 63 74 75 61 6c 6c  e not.** actuall
12d20 79 20 63 61 6c 6c 65 64 20 75 73 69 6e 67 20 47  y called using G
12d30 6f 73 75 62 20 61 6e 64 20 74 68 65 79 20 64 6f  osub and they do
12d40 20 6e 6f 74 20 52 65 74 75 72 6e 2e 20 20 45 6f   not Return.  Eo
12d50 66 41 20 61 6e 64 20 45 6f 66 42 20 6c 6f 6f 70  fA and EofB loop
12d60 0a 2a 2a 20 75 6e 74 69 6c 20 61 6c 6c 20 64 61  .** until all da
12d70 74 61 20 69 73 20 65 78 68 61 75 73 74 65 64 20  ta is exhausted 
12d80 74 68 65 6e 20 6a 75 6d 70 20 74 6f 20 74 68 65  then jump to the
12d90 20 22 65 6e 64 22 20 6c 61 62 65 2e 20 20 41 6c   "end" labe.  Al
12da0 74 42 2c 20 41 65 71 42 2c 0a 2a 2a 20 61 6e 64  tB, AeqB,.** and
12db0 20 41 67 74 42 20 6a 75 6d 70 20 74 6f 20 65 69   AgtB jump to ei
12dc0 74 68 65 72 20 4c 32 20 6f 72 20 74 6f 20 6f 6e  ther L2 or to on
12dd0 65 20 6f 66 20 45 6f 66 41 20 6f 72 20 45 6f 66  e of EofA or Eof
12de0 42 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  B..*/.#ifndef SQ
12df0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
12e00 4e 44 5f 53 45 4c 45 43 54 0a 73 74 61 74 69 63  ND_SELECT.static
12e10 20 69 6e 74 20 6d 75 6c 74 69 53 65 6c 65 63 74   int multiSelect
12e20 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
12e30 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
12e40 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
12e50 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
12e60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
12e70 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
12e80 20 6f 66 20 53 45 4c 45 43 54 73 20 74 6f 20 62   of SELECTs to b
12e90 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 53 65 6c  e coded */.  Sel
12ea0 65 63 74 44 65 73 74 20 2a 70 44 65 73 74 20 20  ectDest *pDest  
12eb0 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
12ec0 20 77 69 74 68 20 71 75 65 72 79 20 72 65 73 75   with query resu
12ed0 6c 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lts */.){.  int 
12ee0 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20  i, j;           
12ef0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
12f00 72 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  rs */.  Select *
12f10 70 50 72 69 6f 72 3b 20 20 20 20 20 20 20 2f 2a  pPrior;       /*
12f20 20 41 6e 6f 74 68 65 72 20 53 45 4c 45 43 54 20   Another SELECT 
12f30 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6f  immediately to o
12f40 75 72 20 6c 65 66 74 20 2a 2f 0a 20 20 56 64 62  ur left */.  Vdb
12f50 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
12f60 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
12f70 6f 64 65 20 74 6f 20 74 68 69 73 20 56 44 42 45  ode to this VDBE
12f80 20 2a 2f 0a 20 20 53 65 6c 65 63 74 44 65 73 74   */.  SelectDest
12f90 20 64 65 73 74 41 3b 20 20 20 20 20 2f 2a 20 44   destA;     /* D
12fa0 65 73 74 69 6e 61 74 69 6f 6e 20 66 6f 72 20 63  estination for c
12fb0 6f 72 6f 75 74 69 6e 65 20 41 20 2a 2f 0a 20 20  oroutine A */.  
12fc0 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 42  SelectDest destB
12fd0 3b 20 20 20 20 20 2f 2a 20 44 65 73 74 69 6e 61  ;     /* Destina
12fe0 74 69 6f 6e 20 66 6f 72 20 63 6f 72 6f 75 74 69  tion for corouti
12ff0 6e 65 20 42 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ne B */.  int re
13000 67 41 64 64 72 41 3b 20 20 20 20 20 20 20 20 20  gAddrA;         
13010 2f 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73  /* Address regis
13020 74 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41  ter for select-A
13030 20 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20   coroutine */.  
13040 69 6e 74 20 72 65 67 45 6f 66 41 3b 20 20 20 20  int regEofA;    
13050 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f        /* Flag to
13060 20 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73   indicate when s
13070 65 6c 65 63 74 2d 41 20 69 73 20 63 6f 6d 70 6c  elect-A is compl
13080 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  ete */.  int reg
13090 41 64 64 72 42 3b 20 20 20 20 20 20 20 20 20 2f  AddrB;         /
130a0 2a 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74  * Address regist
130b0 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 42 20  er for select-B 
130c0 63 6f 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  coroutine */.  i
130d0 6e 74 20 72 65 67 45 6f 66 42 3b 20 20 20 20 20  nt regEofB;     
130e0 20 20 20 20 20 2f 2a 20 46 6c 61 67 20 74 6f 20       /* Flag to 
130f0 69 6e 64 69 63 61 74 65 20 77 68 65 6e 20 73 65  indicate when se
13100 6c 65 63 74 2d 42 20 69 73 20 63 6f 6d 70 6c 65  lect-B is comple
13110 74 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  te */.  int addr
13120 53 65 6c 65 63 74 41 3b 20 20 20 20 20 20 2f 2a  SelectA;      /*
13130 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13140 73 65 6c 65 63 74 2d 41 20 63 6f 72 6f 75 74 69  select-A corouti
13150 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ne */.  int addr
13160 53 65 6c 65 63 74 42 3b 20 20 20 20 20 20 2f 2a  SelectB;      /*
13170 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
13180 73 65 6c 65 63 74 2d 42 20 63 6f 72 6f 75 74 69  select-B corouti
13190 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4f  ne */.  int regO
131a0 75 74 41 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  utA;          /*
131b0 20 41 64 64 72 65 73 73 20 72 65 67 69 73 74 65   Address registe
131c0 72 20 66 6f 72 20 74 68 65 20 6f 75 74 70 75 74  r for the output
131d0 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f  -A subroutine */
131e0 0a 20 20 69 6e 74 20 72 65 67 4f 75 74 42 3b 20  .  int regOutB; 
131f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
13200 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
13210 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20 73 75   the output-B su
13220 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e  broutine */.  in
13230 74 20 61 64 64 72 4f 75 74 41 3b 20 20 20 20 20  t addrOutA;     
13240 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
13250 66 20 74 68 65 20 6f 75 74 70 75 74 2d 41 20 73  f the output-A s
13260 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
13270 6e 74 20 61 64 64 72 4f 75 74 42 20 3d 20 30 3b  nt addrOutB = 0;
13280 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
13290 6f 66 20 74 68 65 20 6f 75 74 70 75 74 2d 42 20  of the output-B 
132a0 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
132b0 69 6e 74 20 61 64 64 72 45 6f 66 41 3b 20 20 20  int addrEofA;   
132c0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
132d0 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 2d 41   of the select-A
132e0 2d 65 78 68 61 75 73 74 65 64 20 73 75 62 72 6f  -exhausted subro
132f0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 61  utine */.  int a
13300 64 64 72 45 6f 66 42 3b 20 20 20 20 20 20 20 20  ddrEofB;        
13310 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
13320 68 65 20 73 65 6c 65 63 74 2d 42 2d 65 78 68 61  he select-B-exha
13330 75 73 74 65 64 20 73 75 62 72 6f 75 74 69 6e 65  usted subroutine
13340 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 41 6c   */.  int addrAl
13350 74 42 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  tB;         /* A
13360 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 41 3c  ddress of the A<
13370 42 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  B subroutine */.
13380 20 20 69 6e 74 20 61 64 64 72 41 65 71 42 3b 20    int addrAeqB; 
13390 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
133a0 73 73 20 6f 66 20 74 68 65 20 41 3d 3d 42 20 73  ss of the A==B s
133b0 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
133c0 6e 74 20 61 64 64 72 41 67 74 42 3b 20 20 20 20  nt addrAgtB;    
133d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
133e0 6f 66 20 74 68 65 20 41 3e 42 20 73 75 62 72 6f  of the A>B subro
133f0 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72  utine */.  int r
13400 65 67 4c 69 6d 69 74 41 3b 20 20 20 20 20 20 20  egLimitA;       
13410 20 2f 2a 20 4c 69 6d 69 74 20 72 65 67 69 73 74   /* Limit regist
13420 65 72 20 66 6f 72 20 73 65 6c 65 63 74 2d 41 20  er for select-A 
13430 2a 2f 0a 20 20 69 6e 74 20 72 65 67 4c 69 6d 69  */.  int regLimi
13440 74 42 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 69  tB;        /* Li
13450 6d 69 74 20 72 65 67 69 73 74 65 72 20 66 6f 72  mit register for
13460 20 73 65 6c 65 63 74 2d 41 20 2a 2f 0a 20 20 69   select-A */.  i
13470 6e 74 20 72 65 67 50 72 65 76 3b 20 20 20 20 20  nt regPrev;     
13480 20 20 20 20 20 2f 2a 20 41 20 72 61 6e 67 65 20       /* A range 
13490 6f 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20  of registers to 
134a0 68 6f 6c 64 20 70 72 65 76 69 6f 75 73 20 6f 75  hold previous ou
134b0 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 73 61  tput */.  int sa
134c0 76 65 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  vedLimit;       
134d0 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
134e0 66 20 70 2d 3e 69 4c 69 6d 69 74 20 2a 2f 0a 20  f p->iLimit */. 
134f0 20 69 6e 74 20 73 61 76 65 64 4f 66 66 73 65 74   int savedOffset
13500 3b 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20  ;      /* Saved 
13510 76 61 6c 75 65 20 6f 66 20 70 2d 3e 69 4f 66 66  value of p->iOff
13520 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 62  set */.  int lab
13530 65 6c 43 6d 70 72 3b 20 20 20 20 20 20 20 20 2f  elCmpr;        /
13540 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 65 20  * Label for the 
13550 73 74 61 72 74 20 6f 66 20 74 68 65 20 6d 65 72  start of the mer
13560 67 65 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a  ge algorithm */.
13570 20 20 69 6e 74 20 6c 61 62 65 6c 45 6e 64 3b 20    int labelEnd; 
13580 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c          /* Label
13590 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
135a0 74 68 65 20 6f 76 65 72 61 6c 6c 20 53 45 4c 45  the overall SELE
135b0 43 54 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e 74  CT stmt */.  int
135c0 20 6a 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   j1;            
135d0 20 20 20 2f 2a 20 4a 75 6d 70 20 69 6e 73 74 72     /* Jump instr
135e0 75 63 74 69 6f 6e 73 20 74 68 61 74 20 67 65 74  uctions that get
135f0 20 72 65 74 61 72 67 65 74 74 65 64 20 2a 2f 0a   retargetted */.
13600 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
13610 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
13620 66 20 54 4b 5f 41 4c 4c 2c 20 54 4b 5f 55 4e 49  f TK_ALL, TK_UNI
13630 4f 4e 2c 20 54 4b 5f 45 58 43 45 50 54 2c 20 54  ON, TK_EXCEPT, T
13640 4b 5f 49 4e 54 45 52 53 45 43 54 20 2a 2f 0a 20  K_INTERSECT */. 
13650 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 44 75   KeyInfo *pKeyDu
13660 70 20 3d 20 30 3b 20 2f 2a 20 43 6f 6d 70 61 72  p = 0; /* Compar
13670 69 73 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ison information
13680 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 72   for duplicate r
13690 65 6d 6f 76 61 6c 20 2a 2f 0a 20 20 4b 65 79 49  emoval */.  KeyI
136a0 6e 66 6f 20 2a 70 4b 65 79 4d 65 72 67 65 3b 20  nfo *pKeyMerge; 
136b0 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
136c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
136d0 6d 65 72 67 69 6e 67 20 72 6f 77 73 20 2a 2f 0a  merging rows */.
136e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
136f0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
13700 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
13710 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
13720 72 64 65 72 42 79 3b 20 20 20 2f 2a 20 54 68 65  rderBy;   /* The
13730 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
13740 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72   */.  int nOrder
13750 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
13760 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
13770 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
13780 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  lause */.  int *
13790 61 50 65 72 6d 75 74 65 3b 20 20 20 20 20 20 20  aPermute;       
137a0 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
137b0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
137c0 74 6f 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  to result set co
137d0 6c 75 6d 6e 73 20 2a 2f 0a 23 69 66 6e 64 65 66  lumns */.#ifndef
137e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
137f0 4c 41 49 4e 0a 20 20 69 6e 74 20 69 53 75 62 31  LAIN.  int iSub1
13800 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
13810 45 51 50 20 69 64 20 6f 66 20 6c 65 66 74 2d 68  EQP id of left-h
13820 61 6e 64 20 71 75 65 72 79 20 2a 2f 0a 20 20 69  and query */.  i
13830 6e 74 20 69 53 75 62 32 3b 20 20 20 20 20 20 20  nt iSub2;       
13840 20 20 20 20 20 2f 2a 20 45 51 50 20 69 64 20 6f       /* EQP id o
13850 66 20 72 69 67 68 74 2d 68 61 6e 64 20 71 75 65  f right-hand que
13860 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ry */.#endif..  
13870 61 73 73 65 72 74 28 20 70 2d 3e 70 4f 72 64 65  assert( p->pOrde
13880 72 42 79 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rBy!=0 );.  asse
13890 72 74 28 20 70 4b 65 79 44 75 70 3d 3d 30 20 29  rt( pKeyDup==0 )
138a0 3b 20 2f 2a 20 22 4d 61 6e 61 67 65 64 22 20 63  ; /* "Managed" c
138b0 6f 64 65 20 6e 65 65 64 73 20 74 68 69 73 2e 20  ode needs this. 
138c0 20 54 69 63 6b 65 74 20 23 33 33 38 32 2e 20 2a   Ticket #3382. *
138d0 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  /.  db = pParse-
138e0 3e 64 62 3b 0a 20 20 76 20 3d 20 70 50 61 72 73  >db;.  v = pPars
138f0 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65  e->pVdbe;.  asse
13900 72 74 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20  rt( v!=0 );     
13910 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 74 68 72    /* Already thr
13920 6f 77 6e 20 74 68 65 20 65 72 72 6f 72 20 69 66  own the error if
13930 20 56 44 42 45 20 61 6c 6c 6f 63 20 66 61 69 6c   VDBE alloc fail
13940 65 64 20 2a 2f 0a 20 20 6c 61 62 65 6c 45 6e 64  ed */.  labelEnd
13950 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
13960 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 6c 61  keLabel(v);.  la
13970 62 65 6c 43 6d 70 72 20 3d 20 73 71 6c 69 74 65  belCmpr = sqlite
13980 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
13990 29 3b 0a 0a 0a 20 20 2f 2a 20 50 61 74 63 68 20  );...  /* Patch 
139a0 75 70 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  up the ORDER BY 
139b0 63 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 6f 70  clause.  */.  op
139c0 20 3d 20 70 2d 3e 6f 70 3b 20 20 0a 20 20 70 50   = p->op;  .  pP
139d0 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69 6f 72  rior = p->pPrior
139e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 72 69  ;.  assert( pPri
139f0 6f 72 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  or->pOrderBy==0 
13a00 29 3b 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  );.  pOrderBy = 
13a10 70 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 61  p->pOrderBy;.  a
13a20 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 20  ssert( pOrderBy 
13a30 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
13a40 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
13a50 0a 0a 20 20 2f 2a 20 46 6f 72 20 6f 70 65 72 61  ..  /* For opera
13a60 74 6f 72 73 20 6f 74 68 65 72 20 74 68 61 6e 20  tors other than 
13a70 55 4e 49 4f 4e 20 41 4c 4c 20 77 65 20 68 61 76  UNION ALL we hav
13a80 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
13a90 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 4f 52 44  hat.  ** the ORD
13aa0 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 76  ER BY clause cov
13ab0 65 72 73 20 65 76 65 72 79 20 74 65 72 6d 20 6f  ers every term o
13ac0 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
13ad0 2e 20 20 41 64 64 0a 20 20 2a 2a 20 74 65 72 6d  .  Add.  ** term
13ae0 73 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42  s to the ORDER B
13af0 59 20 63 6c 61 75 73 65 20 61 73 20 6e 65 63 65  Y clause as nece
13b00 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ssary..  */.  if
13b10 28 20 6f 70 21 3d 54 4b 5f 41 4c 4c 20 29 7b 0a  ( op!=TK_ALL ){.
13b20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 64 62 2d      for(i=1; db-
13b30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
13b40 20 26 26 20 69 3c 3d 70 2d 3e 70 45 4c 69 73 74   && i<=p->pEList
13b50 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
13b60 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
13b70 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
13b80 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c  ;.      for(j=0,
13b90 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
13ba0 3e 61 3b 20 6a 3c 6e 4f 72 64 65 72 42 79 3b 20  >a; j<nOrderBy; 
13bb0 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  j++, pItem++){. 
13bc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13bd0 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f  Item->iOrderByCo
13be0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
13bf0 66 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72  f( pItem->iOrder
13c00 42 79 43 6f 6c 3d 3d 69 20 29 20 62 72 65 61 6b  ByCol==i ) break
13c10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13c20 69 66 28 20 6a 3d 3d 6e 4f 72 64 65 72 42 79 20  if( j==nOrderBy 
13c30 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
13c40 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45  *pNew = sqlite3E
13c50 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
13c60 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
13c70 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
13c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13c90 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
13ca0 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
13cb0 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
13cc0 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
13cd0 69 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 64 65  i;.        pOrde
13ce0 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
13cf0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
13d00 73 65 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 4e  se, pOrderBy, pN
13d10 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ew);.        if(
13d20 20 70 4f 72 64 65 72 42 79 20 29 20 70 4f 72 64   pOrderBy ) pOrd
13d30 65 72 42 79 2d 3e 61 5b 6e 4f 72 64 65 72 42 79  erBy->a[nOrderBy
13d40 2b 2b 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  ++].iOrderByCol 
13d50 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 20 20  = (u16)i;.      
13d60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
13d70 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
13d80 6d 70 61 72 69 73 6f 6e 20 70 65 72 6d 75 74 61  mparison permuta
13d90 74 69 6f 6e 20 61 6e 64 20 6b 65 79 69 6e 66 6f  tion and keyinfo
13da0 20 74 68 61 74 20 69 73 20 75 73 65 64 20 77 69   that is used wi
13db0 74 68 0a 20 20 2a 2a 20 74 68 65 20 70 65 72 6d  th.  ** the perm
13dc0 75 74 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  utation used to 
13dd0 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
13de0 20 6e 65 78 74 0a 20 20 2a 2a 20 72 6f 77 20 6f   next.  ** row o
13df0 66 20 72 65 73 75 6c 74 73 20 63 6f 6d 65 73 20  f results comes 
13e00 66 72 6f 6d 20 73 65 6c 65 63 74 41 20 6f 72 20  from selectA or 
13e10 73 65 6c 65 63 74 42 2e 20 20 41 6c 73 6f 20 61  selectB.  Also a
13e20 64 64 20 65 78 70 6c 69 63 69 74 0a 20 20 2a 2a  dd explicit.  **
13e30 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 74 6f 20 74   collations to t
13e40 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
13e50 73 65 20 74 65 72 6d 73 20 73 6f 20 74 68 61 74  se terms so that
13e60 20 77 68 65 6e 20 74 68 65 20 73 75 62 71 75 65   when the subque
13e70 72 69 65 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65  ries.  ** to the
13e80 20 72 69 67 68 74 20 61 6e 64 20 74 68 65 20 6c   right and the l
13e90 65 66 74 20 61 72 65 20 65 76 61 6c 75 61 74 65  eft are evaluate
13ea0 64 2c 20 74 68 65 79 20 75 73 65 20 74 68 65 20  d, they use the 
13eb0 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 63 6f 6c  correct.  ** col
13ec0 6c 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 61  lation..  */.  a
13ed0 50 65 72 6d 75 74 65 20 3d 20 73 71 6c 69 74 65  Permute = sqlite
13ee0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
13ef0 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 4f 72   sizeof(int)*nOr
13f00 64 65 72 42 79 29 3b 0a 20 20 69 66 28 20 61 50  derBy);.  if( aP
13f10 65 72 6d 75 74 65 20 29 7b 0a 20 20 20 20 73 74  ermute ){.    st
13f20 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
13f30 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 66  em *pItem;.    f
13f40 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(i=0, pItem=pO
13f50 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 6e 4f 72  rderBy->a; i<nOr
13f60 64 65 72 42 79 3b 20 69 2b 2b 2c 20 70 49 74 65  derBy; i++, pIte
13f70 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  m++){.      asse
13f80 72 74 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65  rt( pItem->iOrde
13f90 72 42 79 43 6f 6c 3e 30 20 20 26 26 20 70 49 74  rByCol>0  && pIt
13fa0 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 3c  em->iOrderByCol<
13fb0 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  =p->pEList->nExp
13fc0 72 20 29 3b 0a 20 20 20 20 20 20 61 50 65 72 6d  r );.      aPerm
13fd0 75 74 65 5b 69 5d 20 3d 20 70 49 74 65 6d 2d 3e  ute[i] = pItem->
13fe0 69 4f 72 64 65 72 42 79 43 6f 6c 20 2d 20 31 3b  iOrderByCol - 1;
13ff0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 4d  .    }.    pKeyM
14000 65 72 67 65 20 3d 0a 20 20 20 20 20 20 73 71 6c  erge =.      sql
14010 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
14020 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4b 65 79  db, sizeof(*pKey
14030 4d 65 72 67 65 29 2b 6e 4f 72 64 65 72 42 79 2a  Merge)+nOrderBy*
14040 28 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  (sizeof(CollSeq*
14050 29 2b 31 29 29 3b 0a 20 20 20 20 69 66 28 20 70  )+1));.    if( p
14060 4b 65 79 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  KeyMerge ){.    
14070 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61 53 6f    pKeyMerge->aSo
14080 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
14090 70 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c  pKeyMerge->aColl
140a0 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20  [nOrderBy];.    
140b0 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 6e 46 69    pKeyMerge->nFi
140c0 65 6c 64 20 3d 20 28 75 31 36 29 6e 4f 72 64 65  eld = (u16)nOrde
140d0 72 42 79 3b 0a 20 20 20 20 20 20 70 4b 65 79 4d  rBy;.      pKeyM
140e0 65 72 67 65 2d 3e 65 6e 63 20 3d 20 45 4e 43 28  erge->enc = ENC(
140f0 64 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  db);.      for(i
14100 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
14110 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  i++){.        Co
14120 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20  llSeq *pColl;.  
14130 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65 72        Expr *pTer
14140 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  m = pOrderBy->a[
14150 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
14160 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
14170 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20  gs & EP_Collate 
14180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  ){.          pCo
14190 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
141a0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
141b0 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20  pTerm);.        
141c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
141d0 20 70 43 6f 6c 6c 20 3d 20 6d 75 6c 74 69 53 65   pColl = multiSe
141e0 6c 65 63 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  lectCollSeq(pPar
141f0 73 65 2c 20 70 2c 20 61 50 65 72 6d 75 74 65 5b  se, p, aPermute[
14200 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  i]);.          i
14210 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43  f( pColl==0 ) pC
14220 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
14230 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70  oll;.          p
14240 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
14250 78 70 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  xpr =.          
14260 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 64     sqlite3ExprAd
14270 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70  dCollateString(p
14280 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 43  Parse, pTerm, pC
14290 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
142a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
142b0 4b 65 79 4d 65 72 67 65 2d 3e 61 43 6f 6c 6c 5b  KeyMerge->aColl[
142c0 69 5d 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20 20  i] = pColl;.    
142d0 20 20 20 20 70 4b 65 79 4d 65 72 67 65 2d 3e 61      pKeyMerge->a
142e0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
142f0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f  OrderBy->a[i].so
14300 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 7d  rtOrder;.      }
14310 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
14320 20 20 20 20 70 4b 65 79 4d 65 72 67 65 20 3d 20      pKeyMerge = 
14330 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  0;.  }..  /* Rea
14340 74 74 61 63 68 20 74 68 65 20 4f 52 44 45 52 20  ttach the ORDER 
14350 42 59 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65  BY clause to the
14360 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20 70   query..  */.  p
14370 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
14380 64 65 72 42 79 3b 0a 20 20 70 50 72 69 6f 72 2d  derBy;.  pPrior-
14390 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
143a0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
143b0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4f 72 64 65  Parse->db, pOrde
143c0 72 42 79 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 41  rBy, 0);..  /* A
143d0 6c 6c 6f 63 61 74 65 20 61 20 72 61 6e 67 65 20  llocate a range 
143e0 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  of temporary reg
143f0 69 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 4b  isters and the K
14400 65 79 49 6e 66 6f 20 6e 65 65 64 65 64 0a 20 20  eyInfo needed.  
14410 2a 2a 20 66 6f 72 20 74 68 65 20 6c 6f 67 69 63  ** for the logic
14420 20 74 68 61 74 20 72 65 6d 6f 76 65 73 20 64 75   that removes du
14430 70 6c 69 63 61 74 65 20 72 65 73 75 6c 74 20 72  plicate result r
14440 6f 77 73 20 77 68 65 6e 20 74 68 65 0a 20 20 2a  ows when the.  *
14450 2a 20 6f 70 65 72 61 74 6f 72 20 69 73 20 55 4e  * operator is UN
14460 49 4f 4e 2c 20 45 58 43 45 50 54 2c 20 6f 72 20  ION, EXCEPT, or 
14470 49 4e 54 45 52 53 45 43 54 20 28 62 75 74 20 6e  INTERSECT (but n
14480 6f 74 20 55 4e 49 4f 4e 20 41 4c 4c 29 2e 0a 20  ot UNION ALL).. 
14490 20 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b   */.  if( op==TK
144a0 5f 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 50  _ALL ){.    regP
144b0 72 65 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  rev = 0;.  }else
144c0 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20  {.    int nExpr 
144d0 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  = p->pEList->nEx
144e0 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  pr;.    assert( 
144f0 6e 4f 72 64 65 72 42 79 3e 3d 6e 45 78 70 72 20  nOrderBy>=nExpr 
14500 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
14510 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 67 50 72  led );.    regPr
14520 65 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  ev = sqlite3GetT
14530 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
14540 20 6e 45 78 70 72 2b 31 29 3b 0a 20 20 20 20 73   nExpr+1);.    s
14550 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
14560 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
14570 30 2c 20 72 65 67 50 72 65 76 29 3b 0a 20 20 20  0, regPrev);.   
14580 20 70 4b 65 79 44 75 70 20 3d 20 73 71 6c 69 74   pKeyDup = sqlit
14590 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
145a0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
145b0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4b 65       sizeof(*pKe
145c0 79 44 75 70 29 20 2b 20 6e 45 78 70 72 2a 28 73  yDup) + nExpr*(s
145d0 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 2b  izeof(CollSeq*)+
145e0 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  1) );.    if( pK
145f0 65 79 44 75 70 20 29 7b 0a 20 20 20 20 20 20 70  eyDup ){.      p
14600 4b 65 79 44 75 70 2d 3e 61 53 6f 72 74 4f 72 64  KeyDup->aSortOrd
14610 65 72 20 3d 20 28 75 38 2a 29 26 70 4b 65 79 44  er = (u8*)&pKeyD
14620 75 70 2d 3e 61 43 6f 6c 6c 5b 6e 45 78 70 72 5d  up->aColl[nExpr]
14630 3b 0a 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d  ;.      pKeyDup-
14640 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e  >nField = (u16)n
14650 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4b 65 79  Expr;.      pKey
14660 44 75 70 2d 3e 65 6e 63 20 3d 20 45 4e 43 28 64  Dup->enc = ENC(d
14670 62 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  b);.      for(i=
14680 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 29  0; i<nExpr; i++)
14690 7b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 44 75  {.        pKeyDu
146a0 70 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 6d 75  p->aColl[i] = mu
146b0 6c 74 69 53 65 6c 65 63 74 43 6f 6c 6c 53 65 71  ltiSelectCollSeq
146c0 28 70 50 61 72 73 65 2c 20 70 2c 20 69 29 3b 0a  (pParse, p, i);.
146d0 20 20 20 20 20 20 20 20 70 4b 65 79 44 75 70 2d          pKeyDup-
146e0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
146f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
14700 7d 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 53 65 70  }.  }. .  /* Sep
14710 61 72 61 74 65 20 74 68 65 20 6c 65 66 74 20 61  arate the left a
14720 6e 64 20 74 68 65 20 72 69 67 68 74 20 71 75 65  nd the right que
14730 72 79 20 66 72 6f 6d 20 6f 6e 65 20 61 6e 6f 74  ry from one anot
14740 68 65 72 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 50  her.  */.  p->pP
14750 72 69 6f 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rior = 0;.  sqli
14760 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
14770 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
14780 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
14790 4f 52 44 45 52 22 29 3b 0a 20 20 69 66 28 20 70  ORDER");.  if( p
147a0 50 72 69 6f 72 2d 3e 70 50 72 69 6f 72 3d 3d 30  Prior->pPrior==0
147b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
147c0 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
147d0 42 79 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f  By(pParse, pPrio
147e0 72 2c 20 70 50 72 69 6f 72 2d 3e 70 4f 72 64 65  r, pPrior->pOrde
147f0 72 42 79 2c 20 22 4f 52 44 45 52 22 29 3b 0a 20  rBy, "ORDER");. 
14800 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
14810 20 74 68 65 20 6c 69 6d 69 74 20 72 65 67 69 73   the limit regis
14820 74 65 72 73 20 2a 2f 0a 20 20 63 6f 6d 70 75 74  ters */.  comput
14830 65 4c 69 6d 69 74 52 65 67 69 73 74 65 72 73 28  eLimitRegisters(
14840 70 50 61 72 73 65 2c 20 70 2c 20 6c 61 62 65 6c  pParse, p, label
14850 45 6e 64 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69  End);.  if( p->i
14860 4c 69 6d 69 74 20 26 26 20 6f 70 3d 3d 54 4b 5f  Limit && op==TK_
14870 41 4c 4c 20 29 7b 0a 20 20 20 20 72 65 67 4c 69  ALL ){.    regLi
14880 6d 69 74 41 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitA = ++pParse-
14890 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 4c 69  >nMem;.    regLi
148a0 6d 69 74 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d  mitB = ++pParse-
148b0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74  >nMem;.    sqlit
148c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
148d0 4f 50 5f 43 6f 70 79 2c 20 70 2d 3e 69 4f 66 66  OP_Copy, p->iOff
148e0 73 65 74 20 3f 20 70 2d 3e 69 4f 66 66 73 65 74  set ? p->iOffset
148f0 2b 31 20 3a 20 70 2d 3e 69 4c 69 6d 69 74 2c 0a  +1 : p->iLimit,.
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14920 20 20 72 65 67 4c 69 6d 69 74 41 29 3b 0a 20 20    regLimitA);.  
14930 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
14940 4f 70 32 28 76 2c 20 4f 50 5f 43 6f 70 79 2c 20  Op2(v, OP_Copy, 
14950 72 65 67 4c 69 6d 69 74 41 2c 20 72 65 67 4c 69  regLimitA, regLi
14960 6d 69 74 42 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mitB);.  }else{.
14970 20 20 20 20 72 65 67 4c 69 6d 69 74 41 20 3d 20      regLimitA = 
14980 72 65 67 4c 69 6d 69 74 42 20 3d 20 30 3b 0a 20  regLimitB = 0;. 
14990 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
149a0 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 4c  Delete(db, p->pL
149b0 69 6d 69 74 29 3b 0a 20 20 70 2d 3e 70 4c 69 6d  imit);.  p->pLim
149c0 69 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  it = 0;.  sqlite
149d0 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
149e0 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
149f0 2d 3e 70 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a  ->pOffset = 0;..
14a00 20 20 72 65 67 41 64 64 72 41 20 3d 20 2b 2b 70    regAddrA = ++p
14a10 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72  Parse->nMem;.  r
14a20 65 67 45 6f 66 41 20 3d 20 2b 2b 70 50 61 72 73  egEofA = ++pPars
14a30 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 72 65 67 41 64  e->nMem;.  regAd
14a40 64 72 42 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  drB = ++pParse->
14a50 6e 4d 65 6d 3b 0a 20 20 72 65 67 45 6f 66 42 20  nMem;.  regEofB 
14a60 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
14a70 3b 0a 20 20 72 65 67 4f 75 74 41 20 3d 20 2b 2b  ;.  regOutA = ++
14a80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
14a90 72 65 67 4f 75 74 42 20 3d 20 2b 2b 70 50 61 72  regOutB = ++pPar
14aa0 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71 6c 69  se->nMem;.  sqli
14ab0 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69  te3SelectDestIni
14ac0 74 28 26 64 65 73 74 41 2c 20 53 52 54 5f 43 6f  t(&destA, SRT_Co
14ad0 72 6f 75 74 69 6e 65 2c 20 72 65 67 41 64 64 72  routine, regAddr
14ae0 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  A);.  sqlite3Sel
14af0 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
14b00 74 42 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e  tB, SRT_Coroutin
14b10 65 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 0a 20  e, regAddrB);.. 
14b20 20 2f 2a 20 4a 75 6d 70 20 70 61 73 74 20 74 68   /* Jump past th
14b30 65 20 76 61 72 69 6f 75 73 20 73 75 62 72 6f 75  e various subrou
14b40 74 69 6e 65 73 20 61 6e 64 20 63 6f 72 6f 75 74  tines and corout
14b50 69 6e 65 73 20 74 6f 20 74 68 65 20 6d 61 69 6e  ines to the main
14b60 0a 20 20 2a 2a 20 6d 65 72 67 65 20 6c 6f 6f 70  .  ** merge loop
14b70 0a 20 20 2a 2f 0a 20 20 6a 31 20 3d 20 73 71 6c  .  */.  j1 = sql
14b80 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
14b90 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20 20 61 64  , OP_Goto);.  ad
14ba0 64 72 53 65 6c 65 63 74 41 20 3d 20 73 71 6c 69  drSelectA = sqli
14bb0 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
14bc0 64 72 28 76 29 3b 0a 0a 0a 20 20 2f 2a 20 47 65  dr(v);...  /* Ge
14bd0 6e 65 72 61 74 65 20 61 20 63 6f 72 6f 75 74 69  nerate a corouti
14be0 6e 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  ne to evaluate t
14bf0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
14c00 65 6e 74 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ent to the.  ** 
14c10 6c 65 66 74 20 6f 66 20 74 68 65 20 63 6f 6d 70  left of the comp
14c20 6f 75 6e 64 20 6f 70 65 72 61 74 6f 72 20 2d 20  ound operator - 
14c30 74 68 65 20 22 41 22 20 73 65 6c 65 63 74 2e 0a  the "A" select..
14c40 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43    */.  VdbeNoopC
14c50 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
14c60 6e 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  n coroutine for 
14c70 6c 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a  left SELECT"));.
14c80 20 20 70 50 72 69 6f 72 2d 3e 69 4c 69 6d 69 74    pPrior->iLimit
14c90 20 3d 20 72 65 67 4c 69 6d 69 74 41 3b 0a 20 20   = regLimitA;.  
14ca0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14cb0 72 28 69 53 75 62 31 2c 20 70 50 61 72 73 65 2d  r(iSub1, pParse-
14cc0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14cd0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14ce0 28 70 50 61 72 73 65 2c 20 70 50 72 69 6f 72 2c  (pParse, pPrior,
14cf0 20 26 64 65 73 74 41 29 3b 0a 20 20 73 71 6c 69   &destA);.  sqli
14d00 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
14d10 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
14d20 72 65 67 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69  regEofA);.  sqli
14d30 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
14d40 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41 64   OP_Yield, regAd
14d50 64 72 41 29 3b 0a 20 20 56 64 62 65 4e 6f 6f 70  drA);.  VdbeNoop
14d60 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
14d70 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20 6c   coroutine for l
14d80 65 66 74 20 53 45 4c 45 43 54 22 29 29 3b 0a 0a  eft SELECT"));..
14d90 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
14da0 63 6f 72 6f 75 74 69 6e 65 20 74 6f 20 65 76 61  coroutine to eva
14db0 6c 75 61 74 65 20 74 68 65 20 53 45 4c 45 43 54  luate the SELECT
14dc0 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 0a 20   statement on . 
14dd0 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 2d 20   ** the right - 
14de0 74 68 65 20 22 42 22 20 73 65 6c 65 63 74 0a 20  the "B" select. 
14df0 20 2a 2f 0a 20 20 61 64 64 72 53 65 6c 65 63 74   */.  addrSelect
14e00 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  B = sqlite3VdbeC
14e10 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
14e20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
14e30 28 28 76 2c 20 22 42 65 67 69 6e 20 63 6f 72 6f  ((v, "Begin coro
14e40 75 74 69 6e 65 20 66 6f 72 20 72 69 67 68 74 20  utine for right 
14e50 53 45 4c 45 43 54 22 29 29 3b 0a 20 20 73 61 76  SELECT"));.  sav
14e60 65 64 4c 69 6d 69 74 20 3d 20 70 2d 3e 69 4c 69  edLimit = p->iLi
14e70 6d 69 74 3b 0a 20 20 73 61 76 65 64 4f 66 66 73  mit;.  savedOffs
14e80 65 74 20 3d 20 70 2d 3e 69 4f 66 66 73 65 74 3b  et = p->iOffset;
14e90 0a 20 20 70 2d 3e 69 4c 69 6d 69 74 20 3d 20 72  .  p->iLimit = r
14ea0 65 67 4c 69 6d 69 74 42 3b 0a 20 20 70 2d 3e 69  egLimitB;.  p->i
14eb0 4f 66 66 73 65 74 20 3d 20 30 3b 20 20 0a 20 20  Offset = 0;  .  
14ec0 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65  explainSetIntege
14ed0 72 28 69 53 75 62 32 2c 20 70 50 61 72 73 65 2d  r(iSub2, pParse-
14ee0 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
14ef0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
14f00 28 70 50 61 72 73 65 2c 20 70 2c 20 26 64 65 73  (pParse, p, &des
14f10 74 42 29 3b 0a 20 20 70 2d 3e 69 4c 69 6d 69 74  tB);.  p->iLimit
14f20 20 3d 20 73 61 76 65 64 4c 69 6d 69 74 3b 0a 20   = savedLimit;. 
14f30 20 70 2d 3e 69 4f 66 66 73 65 74 20 3d 20 73 61   p->iOffset = sa
14f40 76 65 64 4f 66 66 73 65 74 3b 0a 20 20 73 71 6c  vedOffset;.  sql
14f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14f60 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
14f70 20 72 65 67 45 6f 66 42 29 3b 0a 20 20 73 71 6c   regEofB);.  sql
14f80 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
14f90 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67 41  , OP_Yield, regA
14fa0 64 64 72 42 29 3b 0a 20 20 56 64 62 65 4e 6f 6f  ddrB);.  VdbeNoo
14fb0 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e  pComment((v, "En
14fc0 64 20 63 6f 72 6f 75 74 69 6e 65 20 66 6f 72 20  d coroutine for 
14fd0 72 69 67 68 74 20 53 45 4c 45 43 54 22 29 29 3b  right SELECT"));
14fe0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14ff0 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
15000 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
15010 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
15020 20 41 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   A.  ** select a
15030 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
15040 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
15050 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
15060 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  */.  VdbeNoopCom
15070 6d 65 6e 74 28 28 76 2c 20 22 4f 75 74 70 75 74  ment((v, "Output
15080 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 41 22 29   routine for A")
15090 29 3b 0a 20 20 61 64 64 72 4f 75 74 41 20 3d 20  );.  addrOutA = 
150a0 67 65 6e 65 72 61 74 65 4f 75 74 70 75 74 53 75  generateOutputSu
150b0 62 72 6f 75 74 69 6e 65 28 70 50 61 72 73 65 2c  broutine(pParse,
150c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
150d0 20 20 70 2c 20 26 64 65 73 74 41 2c 20 70 44 65    p, &destA, pDe
150e0 73 74 2c 20 72 65 67 4f 75 74 41 2c 0a 20 20 20  st, regOutA,.   
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
15100 67 50 72 65 76 2c 20 70 4b 65 79 44 75 70 2c 20  gPrev, pKeyDup, 
15110 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
15120 46 46 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20  FF, labelEnd);. 
15130 20 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   .  /* Generate 
15140 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68 61  a subroutine tha
15150 74 20 6f 75 74 70 75 74 73 20 74 68 65 20 63 75  t outputs the cu
15160 72 72 65 6e 74 20 72 6f 77 20 6f 66 20 74 68 65  rrent row of the
15170 20 42 0a 20 20 2a 2a 20 73 65 6c 65 63 74 20 61   B.  ** select a
15180 73 20 74 68 65 20 6e 65 78 74 20 6f 75 74 70 75  s the next outpu
15190 74 20 72 6f 77 20 6f 66 20 74 68 65 20 63 6f 6d  t row of the com
151a0 70 6f 75 6e 64 20 73 65 6c 65 63 74 2e 0a 20 20  pound select..  
151b0 2a 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  */.  if( op==TK_
151c0 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 4e  ALL || op==TK_UN
151d0 49 4f 4e 20 29 7b 0a 20 20 20 20 56 64 62 65 4e  ION ){.    VdbeN
151e0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
151f0 4f 75 74 70 75 74 20 72 6f 75 74 69 6e 65 20 66  Output routine f
15200 6f 72 20 42 22 29 29 3b 0a 20 20 20 20 61 64 64  or B"));.    add
15210 72 4f 75 74 42 20 3d 20 67 65 6e 65 72 61 74 65  rOutB = generate
15220 4f 75 74 70 75 74 53 75 62 72 6f 75 74 69 6e 65  OutputSubroutine
15230 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
15240 20 20 20 20 20 20 20 20 20 20 70 2c 20 26 64 65            p, &de
15250 73 74 42 2c 20 70 44 65 73 74 2c 20 72 65 67 4f  stB, pDest, regO
15260 75 74 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  utB,.           
15270 20 20 20 20 20 20 72 65 67 50 72 65 76 2c 20 70        regPrev, p
15280 4b 65 79 44 75 70 2c 20 50 34 5f 4b 45 59 49 4e  KeyDup, P4_KEYIN
15290 46 4f 5f 53 54 41 54 49 43 2c 20 6c 61 62 65 6c  FO_STATIC, label
152a0 45 6e 64 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  End);.  }..  /* 
152b0 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72 6f  Generate a subro
152c0 75 74 69 6e 65 20 74 6f 20 72 75 6e 20 77 68 65  utine to run whe
152d0 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 66 72  n the results fr
152e0 6f 6d 20 73 65 6c 65 63 74 20 41 0a 20 20 2a 2a  om select A.  **
152f0 20 61 72 65 20 65 78 68 61 75 73 74 65 64 20 61   are exhausted a
15300 6e 64 20 6f 6e 6c 79 20 64 61 74 61 20 69 6e 20  nd only data in 
15310 73 65 6c 65 63 74 20 42 20 72 65 6d 61 69 6e 73  select B remains
15320 2e 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4e 6f 6f  ..  */.  VdbeNoo
15330 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6f  pComment((v, "eo
15340 66 2d 41 20 73 75 62 72 6f 75 74 69 6e 65 22 29  f-A subroutine")
15350 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  );.  if( op==TK_
15360 45 58 43 45 50 54 20 7c 7c 20 6f 70 3d 3d 54 4b  EXCEPT || op==TK
15370 5f 49 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20  _INTERSECT ){.  
15380 20 20 61 64 64 72 45 6f 66 41 20 3d 20 73 71 6c    addrEofA = sql
15390 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
153a0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61  , OP_Goto, 0, la
153b0 62 65 6c 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  belEnd);.  }else
153c0 7b 20 20 0a 20 20 20 20 61 64 64 72 45 6f 66 41  {  .    addrEofA
153d0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
153e0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp2(v, OP_If, r
153f0 65 67 45 6f 66 42 2c 20 6c 61 62 65 6c 45 6e 64  egEofB, labelEnd
15400 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15410 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15420 6f 73 75 62 2c 20 72 65 67 4f 75 74 42 2c 20 61  osub, regOutB, a
15430 64 64 72 4f 75 74 42 29 3b 0a 20 20 20 20 73 71  ddrOutB);.    sq
15440 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
15450 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 72 65 67  v, OP_Yield, reg
15460 41 64 64 72 42 29 3b 0a 20 20 20 20 73 71 6c 69  AddrB);.    sqli
15470 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15480 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
15490 72 45 6f 66 41 29 3b 0a 20 20 20 20 70 2d 3e 6e  rEofA);.    p->n
154a0 53 65 6c 65 63 74 52 6f 77 20 2b 3d 20 70 50 72  SelectRow += pPr
154b0 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3b  ior->nSelectRow;
154c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  .  }..  /* Gener
154d0 61 74 65 20 61 20 73 75 62 72 6f 75 74 69 6e 65  ate a subroutine
154e0 20 74 6f 20 72 75 6e 20 77 68 65 6e 20 74 68 65   to run when the
154f0 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 73 65   results from se
15500 6c 65 63 74 20 42 0a 20 20 2a 2a 20 61 72 65 20  lect B.  ** are 
15510 65 78 68 61 75 73 74 65 64 20 61 6e 64 20 6f 6e  exhausted and on
15520 6c 79 20 64 61 74 61 20 69 6e 20 73 65 6c 65 63  ly data in selec
15530 74 20 41 20 72 65 6d 61 69 6e 73 2e 0a 20 20 2a  t A remains..  *
15540 2f 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  /.  if( op==TK_I
15550 4e 54 45 52 53 45 43 54 20 29 7b 0a 20 20 20 20  NTERSECT ){.    
15560 61 64 64 72 45 6f 66 42 20 3d 20 61 64 64 72 45  addrEofB = addrE
15570 6f 66 41 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ofA;.    if( p->
15580 6e 53 65 6c 65 63 74 52 6f 77 20 3e 20 70 50 72  nSelectRow > pPr
15590 69 6f 72 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ior->nSelectRow 
155a0 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 20  ) p->nSelectRow 
155b0 3d 20 70 50 72 69 6f 72 2d 3e 6e 53 65 6c 65 63  = pPrior->nSelec
155c0 74 52 6f 77 3b 0a 20 20 7d 65 6c 73 65 7b 20 20  tRow;.  }else{  
155d0 0a 20 20 20 20 56 64 62 65 4e 6f 6f 70 43 6f 6d  .    VdbeNoopCom
155e0 6d 65 6e 74 28 28 76 2c 20 22 65 6f 66 2d 42 20  ment((v, "eof-B 
155f0 73 75 62 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20  subroutine"));. 
15600 20 20 20 61 64 64 72 45 6f 66 42 20 3d 20 73 71     addrEofB = sq
15610 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15620 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66  v, OP_If, regEof
15630 41 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 20 20  A, labelEnd);.  
15640 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15650 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
15660 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72 4f 75   regOutA, addrOu
15670 74 41 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  tA);.    sqlite3
15680 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15690 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
156a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
156b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
156c0 6f 74 6f 2c 20 30 2c 20 61 64 64 72 45 6f 66 42  oto, 0, addrEofB
156d0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 6e  );.  }..  /* Gen
156e0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 68 61  erate code to ha
156f0 6e 64 6c 65 20 74 68 65 20 63 61 73 65 20 6f 66  ndle the case of
15700 20 41 3c 42 0a 20 20 2a 2f 0a 20 20 56 64 62 65   A<B.  */.  Vdbe
15710 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
15720 22 41 2d 6c 74 2d 42 20 73 75 62 72 6f 75 74 69  "A-lt-B subrouti
15730 6e 65 22 29 29 3b 0a 20 20 61 64 64 72 41 6c 74  ne"));.  addrAlt
15740 42 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  B = sqlite3VdbeA
15750 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
15760 62 2c 20 72 65 67 4f 75 74 41 2c 20 61 64 64 72  b, regOutA, addr
15770 4f 75 74 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  OutA);.  sqlite3
15780 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15790 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
157a0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
157b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 66 2c  AddOp2(v, OP_If,
157c0 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72 45 6f   regEofA, addrEo
157d0 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  fA);.  sqlite3Vd
157e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
157f0 6f 74 6f 2c 20 30 2c 20 6c 61 62 65 6c 43 6d 70  oto, 0, labelCmp
15800 72 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  r);..  /* Genera
15810 74 65 20 63 6f 64 65 20 74 6f 20 68 61 6e 64 6c  te code to handl
15820 65 20 74 68 65 20 63 61 73 65 20 6f 66 20 41 3d  e the case of A=
15830 3d 42 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6f 70  =B.  */.  if( op
15840 3d 3d 54 4b 5f 41 4c 4c 20 29 7b 0a 20 20 20 20  ==TK_ALL ){.    
15850 61 64 64 72 41 65 71 42 20 3d 20 61 64 64 72 41  addrAeqB = addrA
15860 6c 74 42 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ltB;.  }else if(
15870 20 6f 70 3d 3d 54 4b 5f 49 4e 54 45 52 53 45 43   op==TK_INTERSEC
15880 54 20 29 7b 0a 20 20 20 20 61 64 64 72 41 65 71  T ){.    addrAeq
15890 42 20 3d 20 61 64 64 72 41 6c 74 42 3b 0a 20 20  B = addrAltB;.  
158a0 20 20 61 64 64 72 41 6c 74 42 2b 2b 3b 0a 20 20    addrAltB++;.  
158b0 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 4e  }else{.    VdbeN
158c0 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
158d0 41 2d 65 71 2d 42 20 73 75 62 72 6f 75 74 69 6e  A-eq-B subroutin
158e0 65 22 29 29 3b 0a 20 20 20 20 61 64 64 72 41 65  e"));.    addrAe
158f0 71 42 20 3d 0a 20 20 20 20 73 71 6c 69 74 65 33  qB =.    sqlite3
15900 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15910 5f 59 69 65 6c 64 2c 20 72 65 67 41 64 64 72 41  _Yield, regAddrA
15920 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15930 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
15940 66 2c 20 72 65 67 45 6f 66 41 2c 20 61 64 64 72  f, regEofA, addr
15950 45 6f 66 41 29 3b 0a 20 20 20 20 73 71 6c 69 74  EofA);.    sqlit
15960 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15970 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6c 61 62 65  OP_Goto, 0, labe
15980 6c 43 6d 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  lCmpr);.  }..  /
15990 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
159a0 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 63 61  to handle the ca
159b0 73 65 20 6f 66 20 41 3e 42 0a 20 20 2a 2f 0a 20  se of A>B.  */. 
159c0 20 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74   VdbeNoopComment
159d0 28 28 76 2c 20 22 41 2d 67 74 2d 42 20 73 75 62  ((v, "A-gt-B sub
159e0 72 6f 75 74 69 6e 65 22 29 29 3b 0a 20 20 61 64  routine"));.  ad
159f0 64 72 41 67 74 42 20 3d 20 73 71 6c 69 74 65 33  drAgtB = sqlite3
15a00 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15a10 76 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b  v);.  if( op==TK
15a20 5f 41 4c 4c 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  _ALL || op==TK_U
15a30 4e 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  NION ){.    sqli
15a40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15a50 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 4f 75   OP_Gosub, regOu
15a60 74 42 2c 20 61 64 64 72 4f 75 74 42 29 3b 0a 20  tB, addrOutB);. 
15a70 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
15a80 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
15a90 6c 64 2c 20 72 65 67 41 64 64 72 42 29 3b 0a 20  ld, regAddrB);. 
15aa0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ab0 70 32 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67  p2(v, OP_If, reg
15ac0 45 6f 66 42 2c 20 61 64 64 72 45 6f 66 42 29 3b  EofB, addrEofB);
15ad0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15ae0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
15af0 20 30 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a   0, labelCmpr);.
15b00 0a 20 20 2f 2a 20 54 68 69 73 20 63 6f 64 65 20  .  /* This code 
15b10 72 75 6e 73 20 6f 6e 63 65 20 74 6f 20 69 6e 69  runs once to ini
15b20 74 69 61 6c 69 7a 65 20 65 76 65 72 79 74 68 69  tialize everythi
15b30 6e 67 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ng..  */.  sqlit
15b40 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
15b50 2c 20 6a 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , j1);.  sqlite3
15b60 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15b70 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
15b80 45 6f 66 41 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofA);.  sqlite3
15b90 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15ba0 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
15bb0 45 6f 66 42 29 3b 0a 20 20 73 71 6c 69 74 65 33  EofB);.  sqlite3
15bc0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15bd0 5f 47 6f 73 75 62 2c 20 72 65 67 41 64 64 72 41  _Gosub, regAddrA
15be0 2c 20 61 64 64 72 53 65 6c 65 63 74 41 29 3b 0a  , addrSelectA);.
15bf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15c00 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c  Op2(v, OP_Gosub,
15c10 20 72 65 67 41 64 64 72 42 2c 20 61 64 64 72 53   regAddrB, addrS
15c20 65 6c 65 63 74 42 29 3b 0a 20 20 73 71 6c 69 74  electB);.  sqlit
15c30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15c40 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 41 2c 20  OP_If, regEofA, 
15c50 61 64 64 72 45 6f 66 41 29 3b 0a 20 20 73 71 6c  addrEofA);.  sql
15c60 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15c70 2c 20 4f 50 5f 49 66 2c 20 72 65 67 45 6f 66 42  , OP_If, regEofB
15c80 2c 20 61 64 64 72 45 6f 66 42 29 3b 0a 0a 20 20  , addrEofB);..  
15c90 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 65  /* Implement the
15ca0 20 6d 61 69 6e 20 6d 65 72 67 65 20 6c 6f 6f 70   main merge loop
15cb0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
15cc0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
15cd0 76 2c 20 6c 61 62 65 6c 43 6d 70 72 29 3b 0a 20  v, labelCmpr);. 
15ce0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15cf0 70 34 28 76 2c 20 4f 50 5f 50 65 72 6d 75 74 61  p4(v, OP_Permuta
15d00 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 28  tion, 0, 0, 0, (
15d10 63 68 61 72 2a 29 61 50 65 72 6d 75 74 65 2c 20  char*)aPermute, 
15d20 50 34 5f 49 4e 54 41 52 52 41 59 29 3b 0a 20 20  P4_INTARRAY);.  
15d30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15d40 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65 2c  4(v, OP_Compare,
15d50 20 64 65 73 74 41 2e 69 53 64 73 74 2c 20 64 65   destA.iSdst, de
15d60 73 74 42 2e 69 53 64 73 74 2c 20 6e 4f 72 64 65  stB.iSdst, nOrde
15d70 72 42 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rBy,.           
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
15d90 68 61 72 2a 29 70 4b 65 79 4d 65 72 67 65 2c 20  har*)pKeyMerge, 
15da0 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
15db0 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  FF);.  sqlite3Vd
15dc0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
15dd0 46 4c 41 47 5f 50 45 52 4d 55 54 45 29 3b 0a 20  FLAG_PERMUTE);. 
15de0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15df0 70 33 28 76 2c 20 4f 50 5f 4a 75 6d 70 2c 20 61  p3(v, OP_Jump, a
15e00 64 64 72 41 6c 74 42 2c 20 61 64 64 72 41 65 71  ddrAltB, addrAeq
15e10 42 2c 20 61 64 64 72 41 67 74 42 29 3b 0a 0a 20  B, addrAgtB);.. 
15e20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 65 6d 70   /* Release temp
15e30 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 73 0a  orary registers.
15e40 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 67 50 72    */.  if( regPr
15e50 65 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ev ){.    sqlite
15e60 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
15e70 65 28 70 50 61 72 73 65 2c 20 72 65 67 50 72 65  e(pParse, regPre
15e80 76 2c 20 6e 4f 72 64 65 72 42 79 2b 31 29 3b 0a  v, nOrderBy+1);.
15e90 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 74    }..  /* Jump t
15ea0 6f 20 74 68 65 20 74 68 69 73 20 70 6f 69 6e 74  o the this point
15eb0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 74 65 72   in order to ter
15ec0 6d 69 6e 61 74 65 20 74 68 65 20 71 75 65 72 79  minate the query
15ed0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
15ee0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
15ef0 28 76 2c 20 6c 61 62 65 6c 45 6e 64 29 3b 0a 0a  (v, labelEnd);..
15f00 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 75 6d    /* Set the num
15f10 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 63 6f  ber of output co
15f20 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
15f30 20 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53   pDest->eDest==S
15f40 52 54 5f 4f 75 74 70 75 74 20 29 7b 0a 20 20 20  RT_Output ){.   
15f50 20 53 65 6c 65 63 74 20 2a 70 46 69 72 73 74 20   Select *pFirst 
15f60 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 77 68  = pPrior;.    wh
15f70 69 6c 65 28 20 70 46 69 72 73 74 2d 3e 70 50 72  ile( pFirst->pPr
15f80 69 6f 72 20 29 20 70 46 69 72 73 74 20 3d 20 70  ior ) pFirst = p
15f90 46 69 72 73 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  First->pPrior;. 
15fa0 20 20 20 67 65 6e 65 72 61 74 65 43 6f 6c 75 6d     generateColum
15fb0 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 30  nNames(pParse, 0
15fc0 2c 20 70 46 69 72 73 74 2d 3e 70 45 4c 69 73 74  , pFirst->pEList
15fd0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  );.  }..  /* Rea
15fe0 73 73 65 6d 62 6c 79 20 74 68 65 20 63 6f 6d 70  ssembly the comp
15ff0 6f 75 6e 64 20 71 75 65 72 79 20 73 6f 20 74 68  ound query so th
16000 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 66 72  at it will be fr
16010 65 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  eed correctly.  
16020 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
16030 67 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  g function */.  
16040 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
16050 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
16060 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  ctDelete(db, p->
16070 70 50 72 69 6f 72 29 3b 0a 20 20 7d 0a 20 20 70  pPrior);.  }.  p
16080 2d 3e 70 50 72 69 6f 72 20 3d 20 70 50 72 69 6f  ->pPrior = pPrio
16090 72 3b 0a 0a 20 20 2f 2a 2a 2a 20 54 42 44 3a 20  r;..  /*** TBD: 
160a0 20 49 6e 73 65 72 74 20 73 75 62 72 6f 75 74 69   Insert subrouti
160b0 6e 65 20 63 61 6c 6c 73 20 74 6f 20 63 6c 6f 73  ne calls to clos
160c0 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 69 6e 63  e cursors on inc
160d0 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 2a 2a 20 73  omplete.  **** s
160e0 75 62 71 75 65 72 69 65 73 20 2a 2a 2a 2a 2f 0a  ubqueries ****/.
160f0 20 20 65 78 70 6c 61 69 6e 43 6f 6d 70 6f 73 69    explainComposi
16100 74 65 28 70 50 61 72 73 65 2c 20 70 2d 3e 6f 70  te(pParse, p->op
16110 2c 20 69 53 75 62 31 2c 20 69 53 75 62 32 2c 20  , iSub1, iSub2, 
16120 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  0);.  return SQL
16130 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
16140 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
16150 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
16160 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
16170 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
16180 57 29 0a 2f 2a 20 46 6f 72 77 61 72 64 20 44 65  W)./* Forward De
16190 63 6c 61 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  clarations */.st
161a0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 45  atic void substE
161b0 78 70 72 4c 69 73 74 28 73 71 6c 69 74 65 33 2a  xprList(sqlite3*
161c0 2c 20 45 78 70 72 4c 69 73 74 2a 2c 20 69 6e 74  , ExprList*, int
161d0 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74  , ExprList*);.st
161e0 61 74 69 63 20 76 6f 69 64 20 73 75 62 73 74 53  atic void substS
161f0 65 6c 65 63 74 28 73 71 6c 69 74 65 33 2a 2c 20  elect(sqlite3*, 
16200 53 65 6c 65 63 74 20 2a 2c 20 69 6e 74 2c 20 45  Select *, int, E
16210 78 70 72 4c 69 73 74 20 2a 29 3b 0a 0a 2f 2a 0a  xprList *);../*.
16220 2a 2a 20 53 63 61 6e 20 74 68 72 6f 75 67 68 20  ** Scan through 
16230 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
16240 45 78 70 72 2e 20 20 52 65 70 6c 61 63 65 20 65  Expr.  Replace e
16250 76 65 72 79 20 72 65 66 65 72 65 6e 63 65 20 74  very reference t
16260 6f 0a 2a 2a 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  o.** a column in
16270 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 20 69 54   table number iT
16280 61 62 6c 65 20 77 69 74 68 20 61 20 63 6f 70 79  able with a copy
16290 20 6f 66 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d   of the iColumn-
162a0 74 68 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 70  th.** entry in p
162b0 45 4c 69 73 74 2e 20 20 28 42 75 74 20 6c 65 61  EList.  (But lea
162c0 76 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ve references to
162d0 20 74 68 65 20 52 4f 57 49 44 20 63 6f 6c 75 6d   the ROWID colum
162e0 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  n .** unchanged.
162f0 29 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ).**.** This rou
16300 74 69 6e 65 20 69 73 20 70 61 72 74 20 6f 66 20  tine is part of 
16310 74 68 65 20 66 6c 61 74 74 65 6e 69 6e 67 20 70  the flattening p
16320 72 6f 63 65 64 75 72 65 2e 20 20 41 20 73 75 62  rocedure.  A sub
16330 71 75 65 72 79 0a 2a 2a 20 77 68 6f 73 65 20 72  query.** whose r
16340 65 73 75 6c 74 20 73 65 74 20 69 73 20 64 65 66  esult set is def
16350 69 6e 65 64 20 62 79 20 70 45 4c 69 73 74 20 61  ined by pEList a
16360 70 70 65 61 72 73 20 61 73 20 65 6e 74 72 79 20  ppears as entry 
16370 69 6e 20 74 68 65 0a 2a 2a 20 46 52 4f 4d 20 63  in the.** FROM c
16380 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
16390 54 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20  T such that the 
163a0 56 44 42 45 20 63 75 72 73 6f 72 20 61 73 73 69  VDBE cursor assi
163b0 67 6e 65 64 20 74 6f 20 74 68 61 74 0a 2a 2a 20  gned to that.** 
163c0 46 4f 52 4d 20 63 6c 61 75 73 65 20 65 6e 74 72  FORM clause entr
163d0 79 20 69 73 20 69 54 61 62 6c 65 2e 20 20 54 68  y is iTable.  Th
163e0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 20  is routine make 
163f0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 0a 2a  the necessary .*
16400 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 70 45 78  * changes to pEx
16410 70 72 20 73 6f 20 74 68 61 74 20 69 74 20 72 65  pr so that it re
16420 66 65 72 73 20 64 69 72 65 63 74 6c 79 20 74 6f  fers directly to
16430 20 74 68 65 20 73 6f 75 72 63 65 20 74 61 62 6c   the source tabl
16440 65 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75 62 71  e.** of the subq
16450 75 65 72 79 20 72 61 74 68 65 72 20 74 68 65 20  uery rather the 
16460 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
16470 65 20 73 75 62 71 75 65 72 79 2e 0a 2a 2f 0a 73  e subquery..*/.s
16480 74 61 74 69 63 20 45 78 70 72 20 2a 73 75 62 73  tatic Expr *subs
16490 74 45 78 70 72 28 0a 20 20 73 71 6c 69 74 65 33  tExpr(.  sqlite3
164a0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
164b0 52 65 70 6f 72 74 20 6d 61 6c 6c 6f 63 20 65 72  Report malloc er
164c0 72 6f 72 73 20 74 6f 20 74 68 69 73 20 63 6f 6e  rors to this con
164d0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 45 78 70  nection */.  Exp
164e0 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
164f0 20 2f 2a 20 45 78 70 72 20 69 6e 20 77 68 69 63   /* Expr in whic
16500 68 20 73 75 62 73 74 69 74 75 74 69 6f 6e 20 6f  h substitution o
16510 63 63 75 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ccurs */.  int i
16520 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  Table,         /
16530 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 73 75  * Table to be su
16540 62 73 74 69 74 75 74 65 64 20 2a 2f 0a 20 20 45  bstituted */.  E
16550 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20  xprList *pEList 
16560 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
16570 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
16580 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ){.  if( pExpr==
16590 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
165a0 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
165b0 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70  K_COLUMN && pExp
165c0 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c  r->iTable==iTabl
165d0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78  e ){.    if( pEx
165e0 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
165f0 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
16600 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
16610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 45 78 70  }else{.      Exp
16620 72 20 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 61  r *pNew;.      a
16630 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
16640 20 26 26 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75   && pExpr->iColu
16650 6d 6e 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  mn<pEList->nExpr
16660 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
16670 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
16680 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
16690 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ht==0 );.      p
166a0 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
166b0 72 44 75 70 28 64 62 2c 20 70 45 4c 69 73 74 2d  rDup(db, pEList-
166c0 3e 61 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  >a[pExpr->iColum
166d0 6e 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  n].pExpr, 0);.  
166e0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
166f0 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29  elete(db, pExpr)
16700 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
16710 70 4e 65 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  pNew;.    }.  }e
16720 6c 73 65 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e  lse{.    pExpr->
16730 70 4c 65 66 74 20 3d 20 73 75 62 73 74 45 78 70  pLeft = substExp
16740 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  r(db, pExpr->pLe
16750 66 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  ft, iTable, pELi
16760 73 74 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  st);.    pExpr->
16770 70 52 69 67 68 74 20 3d 20 73 75 62 73 74 45 78  pRight = substEx
16780 70 72 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52  pr(db, pExpr->pR
16790 69 67 68 74 2c 20 69 54 61 62 6c 65 2c 20 70 45  ight, iTable, pE
167a0 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 45  List);.    if( E
167b0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
167c0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
167d0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 73 75 62  ct) ){.      sub
167e0 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 45 78  stSelect(db, pEx
167f0 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 2c 20 69  pr->x.pSelect, i
16800 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a  Table, pEList);.
16810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16820 20 73 75 62 73 74 45 78 70 72 4c 69 73 74 28 64   substExprList(d
16830 62 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  b, pExpr->x.pLis
16840 74 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73  t, iTable, pELis
16850 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
16860 72 65 74 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a  return pExpr;.}.
16870 73 74 61 74 69 63 20 76 6f 69 64 20 73 75 62 73  static void subs
16880 74 45 78 70 72 4c 69 73 74 28 0a 20 20 73 71 6c  tExprList(.  sql
16890 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
168a0 20 20 2f 2a 20 52 65 70 6f 72 74 20 6d 61 6c 6c    /* Report mall
168b0 6f 63 20 65 72 72 6f 72 73 20 68 65 72 65 20 2a  oc errors here *
168c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
168d0 69 73 74 2c 20 20 20 20 20 2f 2a 20 4c 69 73 74  ist,     /* List
168e0 20 74 6f 20 73 63 61 6e 20 61 6e 64 20 69 6e 20   to scan and in 
168f0 77 68 69 63 68 20 74 6f 20 6d 61 6b 65 20 73 75  which to make su
16900 62 73 74 69 74 75 74 65 73 20 2a 2f 0a 20 20 69  bstitutes */.  i
16910 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
16920 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
16930 62 65 20 73 75 62 73 74 69 74 75 74 65 64 20 2a  be substituted *
16940 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
16950 4c 69 73 74 20 20 20 20 20 2f 2a 20 53 75 62 73  List     /* Subs
16960 74 69 74 75 74 65 20 76 61 6c 75 65 73 20 2a 2f  titute values */
16970 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
16980 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
16990 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
169a0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
169b0 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 69 73 74   i++){.    pList
169c0 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 20 3d 20 73  ->a[i].pExpr = s
169d0 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 4c 69  ubstExpr(db, pLi
169e0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
169f0 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16a00 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
16a10 69 64 20 73 75 62 73 74 53 65 6c 65 63 74 28 0a  id substSelect(.
16a20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
16a30 20 20 20 20 20 20 20 2f 2a 20 52 65 70 6f 72 74         /* Report
16a40 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 68   malloc errors h
16a50 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
16a60 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
16a70 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
16a80 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 6d 61  t in which to ma
16a90 6b 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  ke substitutions
16aa0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
16ab0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  ,          /* Ta
16ac0 62 6c 65 20 74 6f 20 62 65 20 72 65 70 6c 61 63  ble to be replac
16ad0 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ed */.  ExprList
16ae0 20 2a 70 45 4c 69 73 74 20 20 20 20 20 2f 2a 20   *pEList     /* 
16af0 53 75 62 73 74 69 74 75 74 65 20 76 61 6c 75 65  Substitute value
16b00 73 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  s */.){.  SrcLis
16b10 74 20 2a 70 53 72 63 3b 0a 20 20 73 74 72 75 63  t *pSrc;.  struc
16b20 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
16b30 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  pItem;.  int i;.
16b40 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
16b50 6e 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  n;.  substExprLi
16b60 73 74 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74  st(db, p->pEList
16b70 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74  , iTable, pEList
16b80 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72 4c 69  );.  substExprLi
16b90 73 74 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70  st(db, p->pGroup
16ba0 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45 4c 69  By, iTable, pELi
16bb0 73 74 29 3b 0a 20 20 73 75 62 73 74 45 78 70 72  st);.  substExpr
16bc0 4c 69 73 74 28 64 62 2c 20 70 2d 3e 70 4f 72 64  List(db, p->pOrd
16bd0 65 72 42 79 2c 20 69 54 61 62 6c 65 2c 20 70 45  erBy, iTable, pE
16be0 4c 69 73 74 29 3b 0a 20 20 70 2d 3e 70 48 61 76  List);.  p->pHav
16bf0 69 6e 67 20 3d 20 73 75 62 73 74 45 78 70 72 28  ing = substExpr(
16c00 64 62 2c 20 70 2d 3e 70 48 61 76 69 6e 67 2c 20  db, p->pHaving, 
16c10 69 54 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b  iTable, pEList);
16c20 0a 20 20 70 2d 3e 70 57 68 65 72 65 20 3d 20 73  .  p->pWhere = s
16c30 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 2d 3e  ubstExpr(db, p->
16c40 70 57 68 65 72 65 2c 20 69 54 61 62 6c 65 2c 20  pWhere, iTable, 
16c50 70 45 4c 69 73 74 29 3b 0a 20 20 73 75 62 73 74  pEList);.  subst
16c60 53 65 6c 65 63 74 28 64 62 2c 20 70 2d 3e 70 50  Select(db, p->pP
16c70 72 69 6f 72 2c 20 69 54 61 62 6c 65 2c 20 70 45  rior, iTable, pE
16c80 4c 69 73 74 29 3b 0a 20 20 70 53 72 63 20 3d 20  List);.  pSrc = 
16c90 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72  p->pSrc;.  asser
16ca0 74 28 20 70 53 72 63 20 29 3b 20 20 2f 2a 20 45  t( pSrc );  /* E
16cb0 76 65 6e 20 66 6f 72 20 28 53 45 4c 45 43 54 20  ven for (SELECT 
16cc0 31 29 20 77 65 20 68 61 76 65 3a 20 70 53 72 63  1) we have: pSrc
16cd0 21 3d 30 20 62 75 74 20 70 53 72 63 2d 3e 6e 53  !=0 but pSrc->nS
16ce0 72 63 3d 3d 30 20 2a 2f 0a 20 20 69 66 28 20 41  rc==0 */.  if( A
16cf0 4c 57 41 59 53 28 70 53 72 63 29 20 29 7b 0a 20  LWAYS(pSrc) ){. 
16d00 20 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e     for(i=pSrc->n
16d10 53 72 63 2c 20 70 49 74 65 6d 3d 70 53 72 63 2d  Src, pItem=pSrc-
16d20 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49  >a; i>0; i--, pI
16d30 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 73 75  tem++){.      su
16d40 62 73 74 53 65 6c 65 63 74 28 64 62 2c 20 70 49  bstSelect(db, pI
16d50 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 69 54  tem->pSelect, iT
16d60 61 62 6c 65 2c 20 70 45 4c 69 73 74 29 3b 0a 20  able, pEList);. 
16d70 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
16d80 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
16d90 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
16da0 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  RY) || !defined(
16db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
16dc0 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
16dd0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
16de0 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64 65 66  UBQUERY) || !def
16df0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16e00 5f 56 49 45 57 29 0a 2f 2a 0a 2a 2a 20 54 68 69  _VIEW)./*.** Thi
16e10 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70  s routine attemp
16e20 74 73 20 74 6f 20 66 6c 61 74 74 65 6e 20 73 75  ts to flatten su
16e30 62 71 75 65 72 69 65 73 20 61 73 20 61 20 70 65  bqueries as a pe
16e40 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69  rformance optimi
16e50 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  zation..** This 
16e60 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
16e70 31 20 69 66 20 69 74 20 6d 61 6b 65 73 20 63 68  1 if it makes ch
16e80 61 6e 67 65 73 20 61 6e 64 20 30 20 69 66 20 6e  anges and 0 if n
16e90 6f 20 66 6c 61 74 74 65 6e 69 6e 67 20 6f 63 63  o flattening occ
16ea0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 75 6e  urs..**.** To un
16eb0 64 65 72 73 74 61 6e 64 20 74 68 65 20 63 6f 6e  derstand the con
16ec0 63 65 70 74 20 6f 66 20 66 6c 61 74 74 65 6e 69  cept of flatteni
16ed0 6e 67 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65  ng, consider the
16ee0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 71 75   following.** qu
16ef0 65 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ery:.**.**     S
16f00 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 28 53 45  ELECT a FROM (SE
16f10 4c 45 43 54 20 78 2b 79 20 41 53 20 61 20 46 52  LECT x+y AS a FR
16f20 4f 4d 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30  OM t1 WHERE z<10
16f30 30 29 20 57 48 45 52 45 20 61 3e 35 0a 2a 2a 0a  0) WHERE a>5.**.
16f40 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 77  ** The default w
16f50 61 79 20 6f 66 20 69 6d 70 6c 65 6d 65 6e 74 69  ay of implementi
16f60 6e 67 20 74 68 69 73 20 71 75 65 72 79 20 69 73  ng this query is
16f70 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 0a   to execute the.
16f80 2a 2a 20 73 75 62 71 75 65 72 79 20 66 69 72 73  ** subquery firs
16f90 74 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  t and store the 
16fa0 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 65 6d  results in a tem
16fb0 70 6f 72 61 72 79 20 74 61 62 6c 65 2c 20 74 68  porary table, th
16fc0 65 6e 0a 2a 2a 20 72 75 6e 20 74 68 65 20 6f 75  en.** run the ou
16fd0 74 65 72 20 71 75 65 72 79 20 6f 6e 20 74 68 61  ter query on tha
16fe0 74 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  t temporary tabl
16ff0 65 2e 20 20 54 68 69 73 20 72 65 71 75 69 72 65  e.  This require
17000 73 20 74 77 6f 0a 2a 2a 20 70 61 73 73 65 73 20  s two.** passes 
17010 6f 76 65 72 20 74 68 65 20 64 61 74 61 2e 20 20  over the data.  
17020 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 62 65 63  Furthermore, bec
17030 61 75 73 65 20 74 68 65 20 74 65 6d 70 6f 72 61  ause the tempora
17040 72 79 20 74 61 62 6c 65 0a 2a 2a 20 68 61 73 20  ry table.** has 
17050 6e 6f 20 69 6e 64 69 63 65 73 2c 20 74 68 65 20  no indices, the 
17060 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 6e 20  WHERE clause on 
17070 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17080 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6f 70 74  cannot be.** opt
17090 69 6d 69 7a 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  imized..**.** Th
170a0 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
170b0 70 74 73 20 74 6f 20 72 65 77 72 69 74 65 20 71  pts to rewrite q
170c0 75 65 72 69 65 73 20 73 75 63 68 20 61 73 20 74  ueries such as t
170d0 68 65 20 61 62 6f 76 65 20 69 6e 74 6f 0a 2a 2a  he above into.**
170e0 20 61 20 73 69 6e 67 6c 65 20 66 6c 61 74 20 73   a single flat s
170f0 65 6c 65 63 74 2c 20 6c 69 6b 65 20 74 68 69 73  elect, like this
17100 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
17110 43 54 20 78 2b 79 20 41 53 20 61 20 46 52 4f 4d  CT x+y AS a FROM
17120 20 74 31 20 57 48 45 52 45 20 7a 3c 31 30 30 20   t1 WHERE z<100 
17130 41 4e 44 20 61 3e 35 0a 2a 2a 0a 2a 2a 20 54 68  AND a>5.**.** Th
17140 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  e code generated
17150 20 66 6f 72 20 74 68 69 73 20 73 69 6d 70 69 66   for this simpif
17160 69 63 61 74 69 6f 6e 20 67 69 76 65 73 20 74 68  ication gives th
17170 65 20 73 61 6d 65 20 72 65 73 75 6c 74 0a 2a 2a  e same result.**
17180 20 62 75 74 20 6f 6e 6c 79 20 68 61 73 20 74 6f   but only has to
17190 20 73 63 61 6e 20 74 68 65 20 64 61 74 61 20 6f   scan the data o
171a0 6e 63 65 2e 20 20 41 6e 64 20 62 65 63 61 75 73  nce.  And becaus
171b0 65 20 69 6e 64 69 63 65 73 20 6d 69 67 68 74 20  e indices might 
171c0 0a 2a 2a 20 65 78 69 73 74 20 6f 6e 20 74 68 65  .** exist on the
171d0 20 74 61 62 6c 65 20 74 31 2c 20 61 20 63 6f 6d   table t1, a com
171e0 70 6c 65 74 65 20 73 63 61 6e 20 6f 66 20 74 68  plete scan of th
171f0 65 20 64 61 74 61 20 6d 69 67 68 74 20 62 65 0a  e data might be.
17200 2a 2a 20 61 76 6f 69 64 65 64 2e 0a 2a 2a 0a 2a  ** avoided..**.*
17210 2a 20 46 6c 61 74 74 65 6e 69 6e 67 20 69 73 20  * Flattening is 
17220 6f 6e 6c 79 20 61 74 74 65 6d 70 74 65 64 20 69  only attempted i
17230 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
17240 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
17250 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 54 68  .**.**   (1)  Th
17260 65 20 73 75 62 71 75 65 72 79 20 61 6e 64 20 74  e subquery and t
17270 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 64  he outer query d
17280 6f 20 6e 6f 74 20 62 6f 74 68 20 75 73 65 20 61  o not both use a
17290 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
172a0 20 20 20 28 32 29 20 20 54 68 65 20 73 75 62 71     (2)  The subq
172b0 75 65 72 79 20 69 73 20 6e 6f 74 20 61 6e 20 61  uery is not an a
172c0 67 67 72 65 67 61 74 65 20 6f 72 20 74 68 65 20  ggregate or the 
172d0 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20 6e  outer query is n
172e0 6f 74 20 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a  ot a join..**.**
172f0 20 20 20 28 33 29 20 20 54 68 65 20 73 75 62 71     (3)  The subq
17300 75 65 72 79 20 69 73 20 6e 6f 74 20 74 68 65 20  uery is not the 
17310 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 6f 66  right operand of
17320 20 61 20 6c 65 66 74 20 6f 75 74 65 72 20 6a 6f   a left outer jo
17330 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 28 4f 72  in.**        (Or
17340 69 67 69 6e 61 6c 6c 79 20 74 69 63 6b 65 74 20  iginally ticket 
17350 23 33 30 36 2e 20 20 53 74 72 65 6e 67 74 68 65  #306.  Strengthe
17360 6e 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33  ned by ticket #3
17370 33 30 30 29 0a 2a 2a 0a 2a 2a 20 20 20 28 34 29  300).**.**   (4)
17380 20 20 54 68 65 20 73 75 62 71 75 65 72 79 20 69    The subquery i
17390 73 20 6e 6f 74 20 44 49 53 54 49 4e 43 54 2e 0a  s not DISTINCT..
173a0 2a 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 41 74 20  **.**  (**)  At 
173b0 6f 6e 65 20 70 6f 69 6e 74 20 72 65 73 74 72 69  one point restri
173c0 63 74 69 6f 6e 73 20 28 34 29 20 61 6e 64 20 28  ctions (4) and (
173d0 35 29 20 64 65 66 69 6e 65 64 20 61 20 73 75 62  5) defined a sub
173e0 73 65 74 20 6f 66 20 44 49 53 54 49 4e 43 54 0a  set of DISTINCT.
173f0 2a 2a 20 20 20 20 20 20 20 20 73 75 62 2d 71 75  **        sub-qu
17400 65 72 69 65 73 20 74 68 61 74 20 77 65 72 65 20  eries that were 
17410 65 78 63 6c 75 64 65 64 20 66 72 6f 6d 20 74 68  excluded from th
17420 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  is optimization.
17430 20 52 65 73 74 72 69 63 74 69 6f 6e 20 0a 2a 2a   Restriction .**
17440 20 20 20 20 20 20 20 20 28 34 29 20 68 61 73 20          (4) has 
17450 73 69 6e 63 65 20 62 65 65 6e 20 65 78 70 61 6e  since been expan
17460 64 65 64 20 74 6f 20 65 78 63 6c 75 64 65 20 61  ded to exclude a
17470 6c 6c 20 44 49 53 54 49 4e 43 54 20 73 75 62 71  ll DISTINCT subq
17480 75 65 72 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  ueries..**.**   
17490 28 36 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (6)  The subquer
174a0 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61  y does not use a
174b0 67 67 72 65 67 61 74 65 73 20 6f 72 20 74 68 65  ggregates or the
174c0 20 6f 75 74 65 72 20 71 75 65 72 79 20 69 73 20   outer query is 
174d0 6e 6f 74 0a 2a 2a 20 20 20 20 20 20 20 20 44 49  not.**        DI
174e0 53 54 49 4e 43 54 2e 0a 2a 2a 0a 2a 2a 20 20 20  STINCT..**.**   
174f0 28 37 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (7)  The subquer
17500 79 20 68 61 73 20 61 20 46 52 4f 4d 20 63 6c 61  y has a FROM cla
17510 75 73 65 2e 20 20 54 4f 44 4f 3a 20 20 46 6f 72  use.  TODO:  For
17520 20 73 75 62 71 75 65 72 69 65 73 20 77 69 74 68   subqueries with
17530 6f 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 41 20  out.**        A 
17540 46 52 4f 4d 20 63 6c 61 75 73 65 2c 20 63 6f 6e  FROM clause, con
17550 73 69 64 65 72 20 61 64 64 69 6e 67 20 61 20 46  sider adding a F
17560 52 4f 4d 20 63 6c 6f 73 65 20 77 69 74 68 20 74  ROM close with t
17570 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 20 20  he special.**   
17580 20 20 20 20 20 74 61 62 6c 65 20 73 71 6c 69 74       table sqlit
17590 65 5f 6f 6e 63 65 20 74 68 61 74 20 63 6f 6e 73  e_once that cons
175a0 69 73 74 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  ists of a single
175b0 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67 20   row containing 
175c0 61 0a 2a 2a 20 20 20 20 20 20 20 20 73 69 6e 67  a.**        sing
175d0 6c 65 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  le NULL..**.**  
175e0 20 28 38 29 20 20 54 68 65 20 73 75 62 71 75 65   (8)  The subque
175f0 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  ry does not use 
17600 4c 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74  LIMIT or the out
17610 65 72 20 71 75 65 72 79 20 69 73 20 6e 6f 74 20  er query is not 
17620 61 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  a join..**.**   
17630 28 39 29 20 20 54 68 65 20 73 75 62 71 75 65 72  (9)  The subquer
17640 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 4c  y does not use L
17650 49 4d 49 54 20 6f 72 20 74 68 65 20 6f 75 74 65  IMIT or the oute
17660 72 20 71 75 65 72 79 20 64 6f 65 73 20 6e 6f 74  r query does not
17670 20 75 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 61   use.**        a
17680 67 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a  ggregates..**.**
17690 20 20 28 31 30 29 20 20 54 68 65 20 73 75 62 71    (10)  The subq
176a0 75 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73  uery does not us
176b0 65 20 61 67 67 72 65 67 61 74 65 73 20 6f 72 20  e aggregates or 
176c0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
176d0 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
176e0 20 20 20 75 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a     use LIMIT..**
176f0 0a 2a 2a 20 20 28 31 31 29 20 20 54 68 65 20 73  .**  (11)  The s
17700 75 62 71 75 65 72 79 20 61 6e 64 20 74 68 65 20  ubquery and the 
17710 6f 75 74 65 72 20 71 75 65 72 79 20 64 6f 20 6e  outer query do n
17720 6f 74 20 62 6f 74 68 20 68 61 76 65 20 4f 52 44  ot both have ORD
17730 45 52 20 42 59 20 63 6c 61 75 73 65 73 2e 0a 2a  ER BY clauses..*
17740 2a 0a 2a 2a 20 20 28 2a 2a 29 20 20 4e 6f 74 20  *.**  (**)  Not 
17750 69 6d 70 6c 65 6d 65 6e 74 65 64 2e 20 20 53 75  implemented.  Su
17760 62 73 75 6d 65 64 20 69 6e 74 6f 20 72 65 73 74  bsumed into rest
17770 72 69 63 74 69 6f 6e 20 28 33 29 2e 20 20 57 61  riction (3).  Wa
17780 73 20 70 72 65 76 69 6f 75 73 6c 79 0a 2a 2a 20  s previously.** 
17790 20 20 20 20 20 20 20 61 20 73 65 70 61 72 61 74         a separat
177a0 65 20 72 65 73 74 72 69 63 74 69 6f 6e 20 64 65  e restriction de
177b0 72 69 76 69 6e 67 20 66 72 6f 6d 20 74 69 63 6b  riving from tick
177c0 65 74 20 23 33 35 30 2e 0a 2a 2a 0a 2a 2a 20 20  et #350..**.**  
177d0 28 31 33 29 20 20 54 68 65 20 73 75 62 71 75 65  (13)  The subque
177e0 72 79 20 61 6e 64 20 6f 75 74 65 72 20 71 75 65  ry and outer que
177f0 72 79 20 64 6f 20 6e 6f 74 20 62 6f 74 68 20 75  ry do not both u
17800 73 65 20 4c 49 4d 49 54 2e 0a 2a 2a 0a 2a 2a 20  se LIMIT..**.** 
17810 20 28 31 34 29 20 20 54 68 65 20 73 75 62 71 75   (14)  The subqu
17820 65 72 79 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ery does not use
17830 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
17840 28 31 35 29 20 20 54 68 65 20 6f 75 74 65 72 20  (15)  The outer 
17850 71 75 65 72 79 20 69 73 20 6e 6f 74 20 70 61 72  query is not par
17860 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
17870 73 65 6c 65 63 74 20 6f 72 20 74 68 65 0a 2a 2a  select or the.**
17880 20 20 20 20 20 20 20 20 73 75 62 71 75 65 72 79          subquery
17890 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
178a0 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 2a   LIMIT clause..*
178b0 2a 20 20 20 20 20 20 20 20 28 53 65 65 20 74 69  *        (See ti
178c0 63 6b 65 74 20 23 32 33 33 39 20 61 6e 64 20 74  cket #2339 and t
178d0 69 63 6b 65 74 20 5b 30 32 61 38 65 38 31 64 34  icket [02a8e81d4
178e0 34 5d 29 2e 0a 2a 2a 0a 2a 2a 20 20 28 31 36 29  4])..**.**  (16)
178f0 20 20 54 68 65 20 6f 75 74 65 72 20 71 75 65 72    The outer quer
17900 79 20 69 73 20 6e 6f 74 20 61 6e 20 61 67 67 72  y is not an aggr
17910 65 67 61 74 65 20 6f 72 20 74 68 65 20 73 75 62  egate or the sub
17920 71 75 65 72 79 20 64 6f 65 73 0a 2a 2a 20 20 20  query does.**   
17930 20 20 20 20 20 6e 6f 74 20 63 6f 6e 74 61 69 6e       not contain
17940 20 4f 52 44 45 52 20 42 59 2e 20 20 28 54 69 63   ORDER BY.  (Tic
17950 6b 65 74 20 23 32 39 34 32 29 20 20 54 68 69 73  ket #2942)  This
17960 20 75 73 65 64 20 74 6f 20 6e 6f 74 20 6d 61 74   used to not mat
17970 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 75 6e  ter.**        un
17980 74 69 6c 20 77 65 20 69 6e 74 72 6f 64 75 63 65  til we introduce
17990 64 20 74 68 65 20 67 72 6f 75 70 5f 63 6f 6e 63  d the group_conc
179a0 61 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  at() function.  
179b0 0a 2a 2a 0a 2a 2a 20 20 28 31 37 29 20 20 54 68  .**.**  (17)  Th
179c0 65 20 73 75 62 2d 71 75 65 72 79 20 69 73 20 6e  e sub-query is n
179d0 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  ot a compound se
179e0 6c 65 63 74 2c 20 6f 72 20 69 74 20 69 73 20 61  lect, or it is a
179f0 20 55 4e 49 4f 4e 20 41 4c 4c 20 0a 2a 2a 20 20   UNION ALL .**  
17a00 20 20 20 20 20 20 63 6f 6d 70 6f 75 6e 64 20 63        compound c
17a10 6c 61 75 73 65 20 6d 61 64 65 20 75 70 20 65 6e  lause made up en
17a20 74 69 72 65 6c 79 20 6f 66 20 6e 6f 6e 2d 61 67  tirely of non-ag
17a30 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73 2c  gregate queries,
17a40 20 61 6e 64 20 0a 2a 2a 20 20 20 20 20 20 20 20   and .**        
17a50 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72 79  the parent query
17a60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
17a70 20 2a 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66   * is not itself
17a80 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
17a90 75 6e 64 20 73 65 6c 65 63 74 2c 0a 2a 2a 20 20  und select,.**  
17aa0 20 20 20 20 20 20 20 20 2a 20 69 73 20 6e 6f 74          * is not
17ab0 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 6f 72   an aggregate or
17ac0 20 44 49 53 54 49 4e 43 54 20 71 75 65 72 79 2c   DISTINCT query,
17ad0 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
17ae0 20 2a 20 69 73 20 6e 6f 74 20 61 20 6a 6f 69 6e   * is not a join
17af0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 54 68  .**.**        Th
17b00 65 20 70 61 72 65 6e 74 20 61 6e 64 20 73 75 62  e parent and sub
17b10 2d 71 75 65 72 79 20 6d 61 79 20 63 6f 6e 74 61  -query may conta
17b20 69 6e 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  in WHERE clauses
17b30 2e 20 53 75 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  . Subject to.** 
17b40 20 20 20 20 20 20 20 72 75 6c 65 73 20 28 31 31         rules (11
17b50 29 2c 20 28 31 33 29 20 61 6e 64 20 28 31 34 29  ), (13) and (14)
17b60 2c 20 74 68 65 79 20 6d 61 79 20 61 6c 73 6f 20  , they may also 
17b70 63 6f 6e 74 61 69 6e 20 4f 52 44 45 52 20 42 59  contain ORDER BY
17b80 2c 0a 2a 2a 20 20 20 20 20 20 20 20 4c 49 4d 49  ,.**        LIMI
17b90 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
17ba0 75 73 65 73 2e 20 20 54 68 65 20 73 75 62 71 75  uses.  The subqu
17bb0 65 72 79 20 63 61 6e 6e 6f 74 20 75 73 65 20 61  ery cannot use a
17bc0 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a 20 20  ny compound.**  
17bd0 20 20 20 20 20 20 6f 70 65 72 61 74 6f 72 20 6f        operator o
17be0 74 68 65 72 20 74 68 61 6e 20 55 4e 49 4f 4e 20  ther than UNION 
17bf0 41 4c 4c 20 62 65 63 61 75 73 65 20 61 6c 6c 20  ALL because all 
17c00 74 68 65 20 6f 74 68 65 72 20 63 6f 6d 70 6f 75  the other compou
17c10 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 6f 70 65  nd.**        ope
17c20 72 61 74 6f 72 73 20 68 61 76 65 20 61 6e 20 69  rators have an i
17c30 6d 70 6c 69 65 64 20 44 49 53 54 49 4e 43 54 20  mplied DISTINCT 
17c40 77 68 69 63 68 20 69 73 20 64 69 73 61 6c 6c 6f  which is disallo
17c50 77 65 64 20 62 79 0a 2a 2a 20 20 20 20 20 20 20  wed by.**       
17c60 20 72 65 73 74 72 69 63 74 69 6f 6e 20 28 34 29   restriction (4)
17c70 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 41  ..**.**        A
17c80 6c 73 6f 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e  lso, each compon
17c90 65 6e 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  ent of the sub-q
17ca0 75 65 72 79 20 6d 75 73 74 20 72 65 74 75 72 6e  uery must return
17cb0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72   the same number
17cc0 0a 2a 2a 20 20 20 20 20 20 20 20 6f 66 20 72 65  .**        of re
17cd0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2e 20 54 68  sult columns. Th
17ce0 69 73 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  is is actually a
17cf0 20 72 65 71 75 69 72 65 6d 65 6e 74 20 66 6f 72   requirement for
17d00 20 61 6e 79 20 63 6f 6d 70 6f 75 6e 64 0a 2a 2a   any compound.**
17d10 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 73          SELECT s
17d20 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 61 6c  tatement, but al
17d30 6c 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 20  l the code here 
17d40 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 75 72  does is make sur
17d50 65 20 74 68 61 74 20 6e 6f 0a 2a 2a 20 20 20 20  e that no.**    
17d60 20 20 20 20 73 75 63 68 20 28 69 6c 6c 65 67 61      such (illega
17d70 6c 29 20 73 75 62 2d 71 75 65 72 79 20 69 73 20  l) sub-query is 
17d80 66 6c 61 74 74 65 6e 65 64 2e 20 54 68 65 20 63  flattened. The c
17d90 61 6c 6c 65 72 20 77 69 6c 6c 20 64 65 74 65 63  aller will detec
17da0 74 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  t the.**        
17db0 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 6e 64  syntax error and
17dc0 20 72 65 74 75 72 6e 20 61 20 64 65 74 61 69 6c   return a detail
17dd0 65 64 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  ed message..**.*
17de0 2a 20 20 28 31 38 29 20 20 49 66 20 74 68 65 20  *  (18)  If the 
17df0 73 75 62 2d 71 75 65 72 79 20 69 73 20 61 20 63  sub-query is a c
17e00 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 2c 20  ompound select, 
17e10 74 68 65 6e 20 61 6c 6c 20 74 65 72 6d 73 20 6f  then all terms o
17e20 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  f the.**        
17e30 4f 52 44 45 52 20 62 79 20 63 6c 61 75 73 65 20  ORDER by clause 
17e40 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 6d 75  of the parent mu
17e50 73 74 20 62 65 20 73 69 6d 70 6c 65 20 72 65 66  st be simple ref
17e60 65 72 65 6e 63 65 73 20 74 6f 20 0a 2a 2a 20 20  erences to .**  
17e70 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66        columns of
17e80 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e 0a   the sub-query..
17e90 2a 2a 0a 2a 2a 20 20 28 31 39 29 20 20 54 68 65  **.**  (19)  The
17ea0 20 73 75 62 71 75 65 72 79 20 64 6f 65 73 20 6e   subquery does n
17eb0 6f 74 20 75 73 65 20 4c 49 4d 49 54 20 6f 72 20  ot use LIMIT or 
17ec0 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20  the outer query 
17ed0 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 20 20 20 20  does not.**     
17ee0 20 20 20 68 61 76 65 20 61 20 57 48 45 52 45 20     have a WHERE 
17ef0 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 28  clause..**.**  (
17f00 32 30 29 20 20 49 66 20 74 68 65 20 73 75 62 2d  20)  If the sub-
17f10 71 75 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f  query is a compo
17f20 75 6e 64 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  und select, then
17f30 20 69 74 20 6d 75 73 74 20 6e 6f 74 20 75 73 65   it must not use
17f40 0a 2a 2a 20 20 20 20 20 20 20 20 61 6e 20 4f 52  .**        an OR
17f50 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
17f60 54 69 63 6b 65 74 20 23 33 37 37 33 2e 20 20 57  Ticket #3773.  W
17f70 65 20 63 6f 75 6c 64 20 72 65 6c 61 78 20 74 68  e could relax th
17f80 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a  is constraint.**
17f90 20 20 20 20 20 20 20 20 73 6f 6d 65 77 68 61 74          somewhat
17fa0 20 62 79 20 73 61 79 69 6e 67 20 74 68 61 74 20   by saying that 
17fb0 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
17fc0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
17fd0 20 6d 75 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   must.**        
17fe0 61 70 70 65 61 72 20 61 73 20 75 6e 6d 6f 64 69  appear as unmodi
17ff0 66 69 65 64 20 72 65 73 75 6c 74 20 63 6f 6c 75  fied result colu
18000 6d 6e 73 20 69 6e 20 74 68 65 20 6f 75 74 65 72  mns in the outer
18010 20 71 75 65 72 79 2e 20 20 42 75 74 20 77 65 0a   query.  But we.
18020 2a 2a 20 20 20 20 20 20 20 20 68 61 76 65 20 6f  **        have o
18030 74 68 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ther optimizatio
18040 6e 73 20 69 6e 20 6d 69 6e 64 20 74 6f 20 64 65  ns in mind to de
18050 61 6c 20 77 69 74 68 20 74 68 61 74 20 63 61 73  al with that cas
18060 65 2e 0a 2a 2a 0a 2a 2a 20 20 28 32 31 29 20 20  e..**.**  (21)  
18070 54 68 65 20 73 75 62 71 75 65 72 79 20 64 6f 65  The subquery doe
18080 73 20 6e 6f 74 20 75 73 65 20 4c 49 4d 49 54 20  s not use LIMIT 
18090 6f 72 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  or the outer que
180a0 72 79 20 69 73 20 6e 6f 74 0a 2a 2a 20 20 20 20  ry is not.**    
180b0 20 20 20 20 44 49 53 54 49 4e 43 54 2e 20 20 28      DISTINCT.  (
180c0 53 65 65 20 74 69 63 6b 65 74 20 5b 37 35 32 65  See ticket [752e
180d0 31 36 34 36 66 63 5d 29 2e 0a 2a 2a 0a 2a 2a 20  1646fc])..**.** 
180e0 49 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  In this routine,
180f0 20 74 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   the "p" paramet
18100 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
18110 74 6f 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  to the outer que
18120 72 79 2e 0a 2a 2a 20 54 68 65 20 73 75 62 71 75  ry..** The subqu
18130 65 72 79 20 69 73 20 70 2d 3e 70 53 72 63 2d 3e  ery is p->pSrc->
18140 61 5b 69 46 72 6f 6d 5d 2e 20 20 69 73 41 67 67  a[iFrom].  isAgg
18150 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
18160 6f 75 74 65 72 20 71 75 65 72 79 0a 2a 2a 20 75  outer query.** u
18170 73 65 73 20 61 67 67 72 65 67 61 74 65 73 20 61  ses aggregates a
18180 6e 64 20 73 75 62 71 75 65 72 79 49 73 41 67 67  nd subqueryIsAgg
18190 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
181a0 73 75 62 71 75 65 72 79 20 75 73 65 73 20 61 67  subquery uses ag
181b0 67 72 65 67 61 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  gregates..**.** 
181c0 49 66 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  If flattening is
181d0 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64 2c 20   not attempted, 
181e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
181f0 61 20 6e 6f 2d 6f 70 20 61 6e 64 20 72 65 74 75  a no-op and retu
18200 72 6e 73 20 30 2e 0a 2a 2a 20 49 66 20 66 6c 61  rns 0..** If fla
18210 74 74 65 6e 69 6e 67 20 69 73 20 61 74 74 65 6d  ttening is attem
18220 70 74 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  pted this routin
18230 65 20 72 65 74 75 72 6e 73 20 31 2e 0a 2a 2a 0a  e returns 1..**.
18240 2a 2a 20 41 6c 6c 20 6f 66 20 74 68 65 20 65 78  ** All of the ex
18250 70 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69  pression analysi
18260 73 20 6d 75 73 74 20 6f 63 63 75 72 20 6f 6e 20  s must occur on 
18270 62 6f 74 68 20 74 68 65 20 6f 75 74 65 72 20 71  both the outer q
18280 75 65 72 79 20 61 6e 64 0a 2a 2a 20 74 68 65 20  uery and.** the 
18290 73 75 62 71 75 65 72 79 20 62 65 66 6f 72 65 20  subquery before 
182a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  this routine run
182b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
182c0 20 66 6c 61 74 74 65 6e 53 75 62 71 75 65 72 79   flattenSubquery
182d0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
182e0 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
182f0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
18300 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
18310 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
18320 65 6e 74 20 6f 72 20 6f 75 74 65 72 20 53 45 4c  ent or outer SEL
18330 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
18340 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20 20  .  int iFrom,   
18350 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18360 20 69 6e 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 5d   in p->pSrc->a[]
18370 20 6f 66 20 74 68 65 20 69 6e 6e 65 72 20 73 75   of the inner su
18380 62 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20  bquery */.  int 
18390 69 73 41 67 67 2c 20 20 20 20 20 20 20 20 20 20  isAgg,          
183a0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 75 74 65   /* True if oute
183b0 72 20 53 45 4c 45 43 54 20 75 73 65 73 20 61 67  r SELECT uses ag
183c0 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
183d0 73 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 71 75  s */.  int subqu
183e0 65 72 79 49 73 41 67 67 20 20 20 20 2f 2a 20 54  eryIsAgg    /* T
183f0 72 75 65 20 69 66 20 74 68 65 20 73 75 62 71 75  rue if the subqu
18400 65 72 79 20 75 73 65 73 20 61 67 67 72 65 67 61  ery uses aggrega
18410 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
18420 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
18430 2a 7a 53 61 76 65 64 41 75 74 68 43 6f 6e 74 65  *zSavedAuthConte
18440 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75  xt = pParse->zAu
18450 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 53 65 6c  thContext;.  Sel
18460 65 63 74 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  ect *pParent;.  
18470 53 65 6c 65 63 74 20 2a 70 53 75 62 3b 20 20 20  Select *pSub;   
18480 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6e 65 72      /* The inner
18490 20 71 75 65 72 79 20 6f 72 20 22 73 75 62 71 75   query or "subqu
184a0 65 72 79 22 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ery" */.  Select
184b0 20 2a 70 53 75 62 31 3b 20 20 20 20 20 20 2f 2a   *pSub1;      /*
184c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
184d0 72 69 67 68 74 6d 6f 73 74 20 73 65 6c 65 63 74  rightmost select
184e0 20 69 6e 20 73 75 62 2d 71 75 65 72 79 20 2a 2f   in sub-query */
184f0 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
18500 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ;      /* The FR
18510 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
18520 20 6f 75 74 65 72 20 71 75 65 72 79 20 2a 2f 0a   outer query */.
18530 20 20 53 72 63 4c 69 73 74 20 2a 70 53 75 62 53    SrcList *pSubS
18540 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
18550 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
18560 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 45 78  subquery */.  Ex
18570 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20  prList *pList;  
18580 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20    /* The result 
18590 73 65 74 20 6f 66 20 74 68 65 20 6f 75 74 65 72  set of the outer
185a0 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20   query */.  int 
185b0 69 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  iParent;        
185c0 2f 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  /* VDBE cursor n
185d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 53 75  umber of the pSu
185e0 62 20 72 65 73 75 6c 74 20 73 65 74 20 74 65 6d  b result set tem
185f0 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  p table */.  int
18600 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
18610 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
18620 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
18630 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  re;             
18640 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
18650 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
18660 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
18670 74 65 6d 20 2a 70 53 75 62 69 74 65 6d 3b 20 20  tem *pSubitem;  
18680 20 2f 2a 20 54 68 65 20 73 75 62 71 75 65 72 79   /* The subquery
18690 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
186a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
186b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
186c0 65 65 20 69 66 20 66 6c 61 74 74 65 6e 69 6e 67  ee if flattening
186d0 20 69 73 20 70 65 72 6d 69 74 74 65 64 2e 20 20   is permitted.  
186e0 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 2e  Return 0 if not.
186f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18700 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
18710 28 20 70 2d 3e 70 50 72 69 6f 72 3d 3d 30 20 29  ( p->pPrior==0 )
18720 3b 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  ;  /* Unable to 
18730 66 6c 61 74 74 65 6e 20 63 6f 6d 70 6f 75 6e 64  flatten compound
18740 20 71 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 66   queries */.  if
18750 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69  ( OptimizationDi
18760 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54  sabled(db, SQLIT
18770 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
18780 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
18790 70 53 72 63 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  pSrc = p->pSrc;.
187a0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 26    assert( pSrc &
187b0 26 20 69 46 72 6f 6d 3e 3d 30 20 26 26 20 69 46  & iFrom>=0 && iF
187c0 72 6f 6d 3c 70 53 72 63 2d 3e 6e 53 72 63 20 29  rom<pSrc->nSrc )
187d0 3b 0a 20 20 70 53 75 62 69 74 65 6d 20 3d 20 26  ;.  pSubitem = &
187e0 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 3b 0a  pSrc->a[iFrom];.
187f0 20 20 69 50 61 72 65 6e 74 20 3d 20 70 53 75 62    iParent = pSub
18800 69 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  item->iCursor;. 
18810 20 70 53 75 62 20 3d 20 70 53 75 62 69 74 65 6d   pSub = pSubitem
18820 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 61 73 73  ->pSelect;.  ass
18830 65 72 74 28 20 70 53 75 62 21 3d 30 20 29 3b 0a  ert( pSub!=0 );.
18840 20 20 69 66 28 20 69 73 41 67 67 20 26 26 20 73    if( isAgg && s
18850 75 62 71 75 65 72 79 49 73 41 67 67 20 29 20 72  ubqueryIsAgg ) r
18860 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18870 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18880 72 69 63 74 69 6f 6e 20 28 31 29 20 20 2a 2f 0a  riction (1)  */.
18890 20 20 69 66 28 20 73 75 62 71 75 65 72 79 49 73    if( subqueryIs
188a0 41 67 67 20 26 26 20 70 53 72 63 2d 3e 6e 53 72  Agg && pSrc->nSr
188b0 63 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  c>1 ) return 0; 
188c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
188d0 72 69 63 74 69 6f 6e 20 28 32 29 20 20 2a 2f 0a  riction (2)  */.
188e0 20 20 70 53 75 62 53 72 63 20 3d 20 70 53 75 62    pSubSrc = pSub
188f0 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65 72 74  ->pSrc;.  assert
18900 28 20 70 53 75 62 53 72 63 20 29 3b 0a 20 20 2f  ( pSubSrc );.  /
18910 2a 20 50 72 69 6f 72 20 74 6f 20 76 65 72 73 69  * Prior to versi
18920 6f 6e 20 33 2e 31 2e 32 2c 20 77 68 65 6e 20 4c  on 3.1.2, when L
18930 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
18940 68 61 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 65  had to be simple
18950 20 63 6f 6e 73 74 61 6e 74 73 2c 0a 20 20 2a 2a   constants,.  **
18960 20 6e 6f 74 20 61 72 62 69 74 72 61 72 79 20 65   not arbitrary e
18970 78 70 72 65 73 73 73 69 6f 6e 73 2c 20 77 65 20  xpresssions, we 
18980 61 6c 6c 6f 77 65 64 20 73 6f 6d 65 20 63 6f 6d  allowed some com
18990 62 69 6e 69 6e 67 20 6f 66 20 4c 49 4d 49 54 20  bining of LIMIT 
189a0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
189b0 62 65 63 61 75 73 65 20 74 68 65 79 20 63 6f 75  because they cou
189c0 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 20 61  ld be computed a
189d0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20  t compile-time. 
189e0 20 42 75 74 20 77 68 65 6e 20 4c 49 4d 49 54 20   But when LIMIT 
189f0 61 6e 64 20 4f 46 46 53 45 54 0a 20 20 2a 2a 20  and OFFSET.  ** 
18a00 62 65 63 61 6d 65 20 61 72 62 69 74 72 61 72 79  became arbitrary
18a10 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65   expressions, we
18a20 20 77 65 72 65 20 66 6f 72 63 65 64 20 74 6f 20   were forced to 
18a30 61 64 64 20 72 65 73 74 72 69 63 74 69 6f 6e 73  add restrictions
18a40 20 28 31 33 29 0a 20 20 2a 2a 20 61 6e 64 20 28   (13).  ** and (
18a50 31 34 29 2e 20 2a 2f 0a 20 20 69 66 28 20 70 53  14). */.  if( pS
18a60 75 62 2d 3e 70 4c 69 6d 69 74 20 26 26 20 70 2d  ub->pLimit && p-
18a70 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75 72 6e  >pLimit ) return
18a80 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18a90 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18aa0 28 31 33 29 20 2a 2f 0a 20 20 69 66 28 20 70 53  (13) */.  if( pS
18ab0 75 62 2d 3e 70 4f 66 66 73 65 74 20 29 20 72 65  ub->pOffset ) re
18ac0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ae0 20 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20   /* Restriction 
18af0 28 31 34 29 20 2a 2f 0a 20 20 69 66 28 20 70 2d  (14) */.  if( p-
18b00 3e 70 52 69 67 68 74 6d 6f 73 74 20 26 26 20 70  >pRightmost && p
18b10 53 75 62 2d 3e 70 4c 69 6d 69 74 20 29 7b 0a 20  Sub->pLimit ){. 
18b20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
18b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18b60 69 63 74 69 6f 6e 20 28 31 35 29 20 2a 2f 0a 20  iction (15) */. 
18b70 20 7d 0a 20 20 69 66 28 20 70 53 75 62 53 72 63   }.  if( pSubSrc
18b80 2d 3e 6e 53 72 63 3d 3d 30 20 29 20 72 65 74 75  ->nSrc==0 ) retu
18b90 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
18bb0 65 73 74 72 69 63 74 69 6f 6e 20 28 37 29 20 20  estriction (7)  
18bc0 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 73  */.  if( pSub->s
18bd0 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69 73  elFlags & SF_Dis
18be0 74 69 6e 63 74 20 29 20 72 65 74 75 72 6e 20 30  tinct ) return 0
18bf0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
18c00 65 73 74 72 69 63 74 69 6f 6e 20 28 35 29 20 20  estriction (5)  
18c10 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e 70  */.  if( pSub->p
18c20 4c 69 6d 69 74 20 26 26 20 28 70 53 72 63 2d 3e  Limit && (pSrc->
18c30 6e 53 72 63 3e 31 20 7c 7c 20 69 73 41 67 67 29  nSrc>1 || isAgg)
18c40 20 29 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20   ){.     return 
18c50 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  0;         /* Re
18c60 73 74 72 69 63 74 69 6f 6e 73 20 28 38 29 28 39  strictions (8)(9
18c70 29 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  ) */.  }.  if( (
18c80 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
18c90 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20 26 26  _Distinct)!=0 &&
18ca0 20 73 75 62 71 75 65 72 79 49 73 41 67 67 20 29   subqueryIsAgg )
18cb0 7b 0a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  {.     return 0;
18cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
18cd0 72 69 63 74 69 6f 6e 20 28 36 29 20 20 2a 2f 0a  riction (6)  */.
18ce0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72    }.  if( p->pOr
18cf0 64 65 72 42 79 20 26 26 20 70 53 75 62 2d 3e 70  derBy && pSub->p
18d00 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
18d10 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
18d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d40 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 69      /* Restricti
18d50 6f 6e 20 28 31 31 29 20 2a 2f 0a 20 20 7d 0a 20  on (11) */.  }. 
18d60 20 69 66 28 20 69 73 41 67 67 20 26 26 20 70 53   if( isAgg && pS
18d70 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 72  ub->pOrderBy ) r
18d80 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
18d90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18da0 69 63 74 69 6f 6e 20 28 31 36 29 20 2a 2f 0a 20  iction (16) */. 
18db0 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
18dc0 74 20 26 26 20 70 2d 3e 70 57 68 65 72 65 20 29  t && p->pWhere )
18dd0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
18de0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
18df0 69 63 74 69 6f 6e 20 28 31 39 29 20 2a 2f 0a 20  iction (19) */. 
18e00 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69 6d 69   if( pSub->pLimi
18e10 74 20 26 26 20 28 70 2d 3e 73 65 6c 46 6c 61 67  t && (p->selFlag
18e20 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 29  s & SF_Distinct)
18e30 21 3d 30 20 29 7b 0a 20 20 20 20 20 72 65 74 75  !=0 ){.     retu
18e40 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a  rn 0;         /*
18e50 20 52 65 73 74 72 69 63 74 69 6f 6e 20 28 32 31   Restriction (21
18e60 29 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  ) */.  }..  /* O
18e70 42 53 4f 4c 45 54 45 20 43 4f 4d 4d 45 4e 54 20  BSOLETE COMMENT 
18e80 31 3a 0a 20 20 2a 2a 20 52 65 73 74 72 69 63 74  1:.  ** Restrict
18e90 69 6f 6e 20 33 3a 20 20 49 66 20 74 68 65 20 73  ion 3:  If the s
18ea0 75 62 71 75 65 72 79 20 69 73 20 61 20 6a 6f 69  ubquery is a joi
18eb0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  n, make sure the
18ec0 20 73 75 62 71 75 65 72 79 20 69 73 20 0a 20 20   subquery is .  
18ed0 2a 2a 20 6e 6f 74 20 75 73 65 64 20 61 73 20 74  ** not used as t
18ee0 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
18ef0 20 6f 66 20 61 6e 20 6f 75 74 65 72 20 6a 6f 69   of an outer joi
18f00 6e 2e 20 20 45 78 61 6d 70 6c 65 73 20 6f 66 20  n.  Examples of 
18f10 77 68 79 20 74 68 69 73 0a 20 20 2a 2a 20 69 73  why this.  ** is
18f20 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20   not allowed:.  
18f30 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  **.  **         
18f40 74 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f  t1 LEFT OUTER JO
18f50 49 4e 20 28 74 32 20 4a 4f 49 4e 20 74 33 29 0a  IN (t2 JOIN t3).
18f60 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20    **.  ** If we 
18f70 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62 6f 76  flatten the abov
18f80 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65 74 0a  e, we would get.
18f90 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
18fa0 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54 45 52    (t1 LEFT OUTER
18fb0 20 4a 4f 49 4e 20 74 32 29 20 4a 4f 49 4e 20 74   JOIN t2) JOIN t
18fc0 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 77 68 69 63  3.  **.  ** whic
18fd0 68 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  h is not at all 
18fe0 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 2e 0a  the same thing..
18ff0 20 20 2a 2a 0a 20 20 2a 2a 20 4f 42 53 4f 4c 45    **.  ** OBSOLE
19000 54 45 20 43 4f 4d 4d 45 4e 54 20 32 3a 0a 20 20  TE COMMENT 2:.  
19010 2a 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  ** Restriction 1
19020 32 3a 20 20 49 66 20 74 68 65 20 73 75 62 71 75  2:  If the subqu
19030 65 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  ery is the right
19040 20 6f 70 65 72 61 6e 64 20 6f 66 20 61 20 6c 65   operand of a le
19050 66 74 20 6f 75 74 65 72 0a 20 20 2a 2a 20 6a 6f  ft outer.  ** jo
19060 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  in, make sure th
19070 65 20 73 75 62 71 75 65 72 79 20 68 61 73 20 6e  e subquery has n
19080 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 0a  o WHERE clause..
19090 20 20 2a 2a 20 41 6e 20 65 78 61 6d 70 6c 65 73    ** An examples
190a0 20 6f 66 20 77 68 79 20 74 68 69 73 20 69 73 20   of why this is 
190b0 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 0a 20 20 2a  not allowed:.  *
190c0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74  *.  **         t
190d0 31 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  1 LEFT OUTER JOI
190e0 4e 20 28 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N (SELECT * FROM
190f0 20 74 32 20 57 48 45 52 45 20 74 32 2e 78 3e 30   t2 WHERE t2.x>0
19100 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 77  ).  **.  ** If w
19110 65 20 66 6c 61 74 74 65 6e 20 74 68 65 20 61 62  e flatten the ab
19120 6f 76 65 2c 20 77 65 20 77 6f 75 6c 64 20 67 65  ove, we would ge
19130 74 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  t.  **.  **     
19140 20 20 20 20 28 74 31 20 4c 45 46 54 20 4f 55 54      (t1 LEFT OUT
19150 45 52 20 4a 4f 49 4e 20 74 32 29 20 57 48 45 52  ER JOIN t2) WHER
19160 45 20 74 32 2e 78 3e 30 0a 20 20 2a 2a 0a 20 20  E t2.x>0.  **.  
19170 2a 2a 20 42 75 74 20 74 68 65 20 74 32 2e 78 3e  ** But the t2.x>
19180 30 20 74 65 73 74 20 77 69 6c 6c 20 61 6c 77 61  0 test will alwa
19190 79 73 20 66 61 69 6c 20 6f 6e 20 61 20 4e 55 4c  ys fail on a NUL
191a0 4c 20 72 6f 77 20 6f 66 20 74 32 2c 20 77 68 69  L row of t2, whi
191b0 63 68 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76  ch.  ** effectiv
191c0 65 6c 79 20 63 6f 6e 76 65 72 74 73 20 74 68 65  ely converts the
191d0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 69 6e 74 6f   OUTER JOIN into
191e0 20 61 6e 20 49 4e 4e 45 52 20 4a 4f 49 4e 2e 0a   an INNER JOIN..
191f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 48 49 53 20 4f    **.  ** THIS O
19200 56 45 52 52 49 44 45 53 20 4f 42 53 4f 4c 45 54  VERRIDES OBSOLET
19210 45 20 43 4f 4d 4d 45 4e 54 53 20 31 20 41 4e 44  E COMMENTS 1 AND
19220 20 32 20 41 42 4f 56 45 3a 0a 20 20 2a 2a 20 54   2 ABOVE:.  ** T
19230 69 63 6b 65 74 20 23 33 33 30 30 20 73 68 6f 77  icket #3300 show
19240 73 20 74 68 61 74 20 66 6c 61 74 74 65 6e 69 6e  s that flattenin
19250 67 20 74 68 65 20 72 69 67 68 74 20 74 65 72 6d  g the right term
19260 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 0a   of a LEFT JOIN.
19270 20 20 2a 2a 20 69 73 20 66 72 61 75 67 68 74 20    ** is fraught 
19280 77 69 74 68 20 64 61 6e 67 65 72 2e 20 20 42 65  with danger.  Be
19290 73 74 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20  st to avoid the 
192a0 77 68 6f 6c 65 20 74 68 69 6e 67 2e 20 20 49 66  whole thing.  If
192b0 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 71 75 65   the.  ** subque
192c0 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74 20  ry is the right 
192d0 74 65 72 6d 20 6f 66 20 61 20 4c 45 46 54 20 4a  term of a LEFT J
192e0 4f 49 4e 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  OIN, then do not
192f0 20 66 6c 61 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   flatten..  */. 
19300 20 69 66 28 20 28 70 53 75 62 69 74 65 6d 2d 3e   if( (pSubitem->
19310 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4f 55  jointype & JT_OU
19320 54 45 52 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  TER)!=0 ){.    r
19330 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
19340 2f 2a 20 52 65 73 74 72 69 63 74 69 6f 6e 20 31  /* Restriction 1
19350 37 3a 20 49 66 20 74 68 65 20 73 75 62 2d 71 75  7: If the sub-qu
19360 65 72 79 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  ery is a compoun
19370 64 20 53 45 4c 45 43 54 2c 20 74 68 65 6e 20 69  d SELECT, then i
19380 74 20 6d 75 73 74 0a 20 20 2a 2a 20 75 73 65 20  t must.  ** use 
19390 6f 6e 6c 79 20 74 68 65 20 55 4e 49 4f 4e 20 41  only the UNION A
193a0 4c 4c 20 6f 70 65 72 61 74 6f 72 2e 20 41 6e 64  LL operator. And
193b0 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 69 6d   none of the sim
193c0 70 6c 65 20 73 65 6c 65 63 74 20 71 75 65 72 69  ple select queri
193d0 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 6d 61 6b  es.  ** that mak
193e0 65 20 75 70 20 74 68 65 20 63 6f 6d 70 6f 75 6e  e up the compoun
193f0 64 20 53 45 4c 45 43 54 20 61 72 65 20 61 6c 6c  d SELECT are all
19400 6f 77 65 64 20 74 6f 20 62 65 20 61 67 67 72 65  owed to be aggre
19410 67 61 74 65 20 6f 72 20 64 69 73 74 69 6e 63 74  gate or distinct
19420 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 2e 0a 20  .  ** queries.. 
19430 20 2a 2f 0a 20 20 69 66 28 20 70 53 75 62 2d 3e   */.  if( pSub->
19440 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 69 66  pPrior ){.    if
19450 28 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  ( pSub->pOrderBy
19460 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19470 20 30 3b 20 20 2f 2a 20 52 65 73 74 72 69 63 74   0;  /* Restrict
19480 69 6f 6e 20 32 30 20 2a 2f 0a 20 20 20 20 7d 0a  ion 20 */.    }.
19490 20 20 20 20 69 66 28 20 69 73 41 67 67 20 7c 7c      if( isAgg ||
194a0 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
194b0 53 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 20  SF_Distinct)!=0 
194c0 7c 7c 20 70 53 72 63 2d 3e 6e 53 72 63 21 3d 31  || pSrc->nSrc!=1
194d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
194e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
194f0 72 28 70 53 75 62 31 3d 70 53 75 62 3b 20 70 53  r(pSub1=pSub; pS
19500 75 62 31 3b 20 70 53 75 62 31 3d 70 53 75 62 31  ub1; pSub1=pSub1
19510 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20 20 20 20  ->pPrior){.     
19520 20 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62   testcase( (pSub
19530 31 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53  1->selFlags & (S
19540 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67  F_Distinct|SF_Ag
19550 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 44 69  gregate))==SF_Di
19560 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
19570 74 65 73 74 63 61 73 65 28 20 28 70 53 75 62 31  testcase( (pSub1
19580 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46  ->selFlags & (SF
19590 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67  _Distinct|SF_Agg
195a0 72 65 67 61 74 65 29 29 3d 3d 53 46 5f 41 67 67  regate))==SF_Agg
195b0 72 65 67 61 74 65 20 29 3b 0a 20 20 20 20 20 20  regate );.      
195c0 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 53  assert( pSub->pS
195d0 72 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  rc!=0 );.      i
195e0 66 28 20 28 70 53 75 62 31 2d 3e 73 65 6c 46 6c  f( (pSub1->selFl
195f0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
19600 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
19610 29 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28  )!=0.       || (
19620 70 53 75 62 31 2d 3e 70 50 72 69 6f 72 20 26 26  pSub1->pPrior &&
19630 20 70 53 75 62 31 2d 3e 6f 70 21 3d 54 4b 5f 41   pSub1->op!=TK_A
19640 4c 4c 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  LL) .       || p
19650 53 75 62 31 2d 3e 70 53 72 63 2d 3e 6e 53 72 63  Sub1->pSrc->nSrc
19660 3c 31 0a 20 20 20 20 20 20 20 7c 7c 20 70 53 75  <1.       || pSu
19670 62 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  b->pEList->nExpr
19680 21 3d 70 53 75 62 31 2d 3e 70 45 4c 69 73 74 2d  !=pSub1->pEList-
19690 3e 6e 45 78 70 72 0a 20 20 20 20 20 20 29 7b 0a  >nExpr.      ){.
196a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
196b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
196c0 74 65 73 74 63 61 73 65 28 20 70 53 75 62 31 2d  testcase( pSub1-
196d0 3e 70 53 72 63 2d 3e 6e 53 72 63 3e 31 20 29 3b  >pSrc->nSrc>1 );
196e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
196f0 65 73 74 72 69 63 74 69 6f 6e 20 31 38 2e 20 2a  estriction 18. *
19700 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4f 72  /.    if( p->pOr
19710 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69  derBy ){.      i
19720 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f 72  nt ii;.      for
19730 28 69 69 3d 30 3b 20 69 69 3c 70 2d 3e 70 4f 72  (ii=0; ii<p->pOr
19740 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 69  derBy->nExpr; ii
19750 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
19760 20 70 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 61 5b   p->pOrderBy->a[
19770 69 69 5d 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3d  ii].iOrderByCol=
19780 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
19790 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
197a0 0a 0a 20 20 2f 2a 2a 2a 2a 2a 20 49 66 20 77 65  ..  /***** If we
197b0 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
197c0 74 2c 20 66 6c 61 74 74 65 6e 69 6e 67 20 69 73  t, flattening is
197d0 20 70 65 72 6d 69 74 74 65 64 2e 20 2a 2a 2a 2a   permitted. ****
197e0 2a 2f 0a 0a 20 20 2f 2a 20 41 75 74 68 6f 72 69  */..  /* Authori
197f0 7a 65 20 74 68 65 20 73 75 62 71 75 65 72 79 20  ze the subquery 
19800 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 7a 41 75  */.  pParse->zAu
19810 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 53 75 62  thContext = pSub
19820 69 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 54  item->zName;.  T
19830 45 53 54 4f 4e 4c 59 28 69 20 3d 29 20 73 71 6c  ESTONLY(i =) sql
19840 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
19850 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
19860 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ECT, 0, 0, 0);. 
19870 20 74 65 73 74 63 61 73 65 28 20 69 3d 3d 53 51   testcase( i==SQ
19880 4c 49 54 45 5f 44 45 4e 59 20 29 3b 0a 20 20 70  LITE_DENY );.  p
19890 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
198a0 65 78 74 20 3d 20 7a 53 61 76 65 64 41 75 74 68  ext = zSavedAuth
198b0 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 2f 2a 20 49  Context;..  /* I
198c0 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  f the sub-query 
198d0 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  is a compound SE
198e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  LECT statement, 
198f0 74 68 65 6e 20 28 62 79 20 72 65 73 74 72 69 63  then (by restric
19900 74 69 6f 6e 73 0a 20 20 2a 2a 20 31 37 20 61 6e  tions.  ** 17 an
19910 64 20 31 38 20 61 62 6f 76 65 29 20 69 74 20 6d  d 18 above) it m
19920 75 73 74 20 62 65 20 61 20 55 4e 49 4f 4e 20 41  ust be a UNION A
19930 4c 4c 20 61 6e 64 20 74 68 65 20 70 61 72 65 6e  LL and the paren
19940 74 20 71 75 65 72 79 20 6d 75 73 74 20 0a 20 20  t query must .  
19950 2a 2a 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72  ** be of the for
19960 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  m:.  **.  **    
19970 20 53 45 4c 45 43 54 20 3c 65 78 70 72 2d 6c 69   SELECT <expr-li
19980 73 74 3e 20 46 52 4f 4d 20 28 3c 73 75 62 2d 71  st> FROM (<sub-q
19990 75 65 72 79 3e 29 20 3c 77 68 65 72 65 2d 63 6c  uery>) <where-cl
199a0 61 75 73 65 3e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ause> .  **.  **
199b0 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 6e 79   followed by any
199c0 20 4f 52 44 45 52 20 42 59 2c 20 4c 49 4d 49 54   ORDER BY, LIMIT
199d0 20 61 6e 64 2f 6f 72 20 4f 46 46 53 45 54 20 63   and/or OFFSET c
199e0 6c 61 75 73 65 73 2e 20 54 68 69 73 20 62 6c 6f  lauses. This blo
199f0 63 6b 0a 20 20 2a 2a 20 63 72 65 61 74 65 73 20  ck.  ** creates 
19a00 4e 2d 31 20 63 6f 70 69 65 73 20 6f 66 20 74 68  N-1 copies of th
19a10 65 20 70 61 72 65 6e 74 20 71 75 65 72 79 20 77  e parent query w
19a20 69 74 68 6f 75 74 20 61 6e 79 20 4f 52 44 45 52  ithout any ORDER
19a30 20 42 59 2c 20 4c 49 4d 49 54 20 6f 72 20 0a 20   BY, LIMIT or . 
19a40 20 2a 2a 20 4f 46 46 53 45 54 20 63 6c 61 75 73   ** OFFSET claus
19a50 65 73 20 61 6e 64 20 6a 6f 69 6e 73 20 74 68 65  es and joins the
19a60 6d 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 68 61  m to the left-ha
19a70 6e 64 2d 73 69 64 65 20 6f 66 20 74 68 65 20 6f  nd-side of the o
19a80 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 75 73 69  riginal.  ** usi
19a90 6e 67 20 55 4e 49 4f 4e 20 41 4c 4c 20 6f 70 65  ng UNION ALL ope
19aa0 72 61 74 6f 72 73 2e 20 49 6e 20 74 68 69 73 20  rators. In this 
19ab0 63 61 73 65 20 4e 20 69 73 20 74 68 65 20 6e 75  case N is the nu
19ac0 6d 62 65 72 20 6f 66 20 73 69 6d 70 6c 65 0a 20  mber of simple. 
19ad0 20 2a 2a 20 73 65 6c 65 63 74 20 73 74 61 74 65   ** select state
19ae0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 6d  ments in the com
19af0 70 6f 75 6e 64 20 73 75 62 2d 71 75 65 72 79 2e  pound sub-query.
19b00 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 61 6d 70  .  **.  ** Examp
19b10 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  le:.  **.  **   
19b20 20 20 53 45 4c 45 43 54 20 61 2b 31 20 46 52 4f    SELECT a+1 FRO
19b30 4d 20 28 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  M (.  **        
19b40 53 45 4c 45 43 54 20 78 20 46 52 4f 4d 20 74 61  SELECT x FROM ta
19b50 62 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 55 4e  b.  **        UN
19b60 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a 20 20 20 20  ION ALL.  **    
19b70 20 20 20 20 53 45 4c 45 43 54 20 79 20 46 52 4f      SELECT y FRO
19b80 4d 20 74 61 62 0a 20 20 2a 2a 20 20 20 20 20 20  M tab.  **      
19b90 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20 2a 2a    UNION ALL.  **
19ba0 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
19bb0 62 73 28 7a 2a 32 29 20 46 52 4f 4d 20 74 61 62  bs(z*2) FROM tab
19bc0 32 0a 20 20 2a 2a 20 20 20 20 20 29 20 57 48 45  2.  **     ) WHE
19bd0 52 45 20 61 21 3d 35 20 4f 52 44 45 52 20 42 59  RE a!=5 ORDER BY
19be0 20 31 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 72 61   1.  **.  ** Tra
19bf0 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 20  nsformed into:. 
19c00 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
19c10 45 43 54 20 78 2b 31 20 46 52 4f 4d 20 74 61 62  ECT x+1 FROM tab
19c20 20 57 48 45 52 45 20 78 2b 31 21 3d 35 0a 20 20   WHERE x+1!=5.  
19c30 2a 2a 20 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c  **     UNION ALL
19c40 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
19c50 20 79 2b 31 20 46 52 4f 4d 20 74 61 62 20 57 48   y+1 FROM tab WH
19c60 45 52 45 20 79 2b 31 21 3d 35 0a 20 20 2a 2a 20  ERE y+1!=5.  ** 
19c70 20 20 20 20 55 4e 49 4f 4e 20 41 4c 4c 0a 20 20      UNION ALL.  
19c80 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 62  **     SELECT ab
19c90 73 28 7a 2a 32 29 2b 31 20 46 52 4f 4d 20 74 61  s(z*2)+1 FROM ta
19ca0 62 32 20 57 48 45 52 45 20 61 62 73 28 7a 2a 32  b2 WHERE abs(z*2
19cb0 29 2b 31 21 3d 35 0a 20 20 2a 2a 20 20 20 20 20  )+1!=5.  **     
19cc0 4f 52 44 45 52 20 42 59 20 31 0a 20 20 2a 2a 0a  ORDER BY 1.  **.
19cd0 20 20 2a 2a 20 57 65 20 63 61 6c 6c 20 74 68 69    ** We call thi
19ce0 73 20 74 68 65 20 22 63 6f 6d 70 6f 75 6e 64 2d  s the "compound-
19cf0 73 75 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e  subquery flatten
19d00 69 6e 67 22 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ing"..  */.  for
19d10 28 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69  (pSub=pSub->pPri
19d20 6f 72 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  or; pSub; pSub=p
19d30 53 75 62 2d 3e 70 50 72 69 6f 72 29 7b 0a 20 20  Sub->pPrior){.  
19d40 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
19d50 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
19d60 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
19d70 65 72 42 79 3b 0a 20 20 20 20 45 78 70 72 20 2a  erBy;.    Expr *
19d80 70 4c 69 6d 69 74 20 3d 20 70 2d 3e 70 4c 69 6d  pLimit = p->pLim
19d90 69 74 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a  it;.    Select *
19da0 70 50 72 69 6f 72 20 3d 20 70 2d 3e 70 50 72 69  pPrior = p->pPri
19db0 6f 72 3b 0a 20 20 20 20 70 2d 3e 70 4f 72 64 65  or;.    p->pOrde
19dc0 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  rBy = 0;.    p->
19dd0 70 53 72 63 20 3d 20 30 3b 0a 20 20 20 20 70 2d  pSrc = 0;.    p-
19de0 3e 70 50 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20  >pPrior = 0;.   
19df0 20 70 2d 3e 70 4c 69 6d 69 74 20 3d 20 30 3b 0a   p->pLimit = 0;.
19e00 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
19e10 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
19e20 70 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 70 4c  p, 0);.    p->pL
19e30 69 6d 69 74 20 3d 20 70 4c 69 6d 69 74 3b 0a 20  imit = pLimit;. 
19e40 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
19e50 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 70   pOrderBy;.    p
19e60 2d 3e 70 53 72 63 20 3d 20 70 53 72 63 3b 0a 20  ->pSrc = pSrc;. 
19e70 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c     p->op = TK_AL
19e80 4c 3b 0a 20 20 20 20 70 2d 3e 70 52 69 67 68 74  L;.    p->pRight
19e90 6d 6f 73 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  most = 0;.    if
19ea0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
19eb0 20 20 20 70 4e 65 77 20 3d 20 70 50 72 69 6f 72     pNew = pPrior
19ec0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19ed0 20 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20     pNew->pPrior 
19ee0 3d 20 70 50 72 69 6f 72 3b 0a 20 20 20 20 20 20  = pPrior;.      
19ef0 70 4e 65 77 2d 3e 70 52 69 67 68 74 6d 6f 73 74  pNew->pRightmost
19f00 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
19f10 70 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4e 65 77  p->pPrior = pNew
19f20 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  ;.    if( db->ma
19f30 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
19f40 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 1;.  }..  /*
19f50 20 42 65 67 69 6e 20 66 6c 61 74 74 65 6e 69 6e   Begin flattenin
19f60 67 20 74 68 65 20 69 46 72 6f 6d 2d 74 68 20 65  g the iFrom-th e
19f70 6e 74 72 79 20 6f 66 20 74 68 65 20 46 52 4f 4d  ntry of the FROM
19f80 20 63 6c 61 75 73 65 20 0a 20 20 2a 2a 20 69 6e   clause .  ** in
19f90 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
19fa0 2e 0a 20 20 2a 2f 0a 20 20 70 53 75 62 20 3d 20  ..  */.  pSub = 
19fb0 70 53 75 62 31 20 3d 20 70 53 75 62 69 74 65 6d  pSub1 = pSubitem
19fc0 2d 3e 70 53 65 6c 65 63 74 3b 0a 0a 20 20 2f 2a  ->pSelect;..  /*
19fd0 20 44 65 6c 65 74 65 20 74 68 65 20 74 72 61 6e   Delete the tran
19fe0 73 69 65 6e 74 20 74 61 62 6c 65 20 73 74 72 75  sient table stru
19ff0 63 74 75 72 65 20 61 73 73 6f 63 69 61 74 65 64  cture associated
1a000 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73   with the.  ** s
1a010 75 62 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  ubquery.  */.  s
1a020 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a030 20 70 53 75 62 69 74 65 6d 2d 3e 7a 44 61 74 61   pSubitem->zData
1a040 62 61 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  base);.  sqlite3
1a050 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 69  DbFree(db, pSubi
1a060 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  tem->zName);.  s
1a070 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1a080 20 70 53 75 62 69 74 65 6d 2d 3e 7a 41 6c 69 61   pSubitem->zAlia
1a090 73 29 3b 0a 20 20 70 53 75 62 69 74 65 6d 2d 3e  s);.  pSubitem->
1a0a0 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  zDatabase = 0;. 
1a0b0 20 70 53 75 62 69 74 65 6d 2d 3e 7a 4e 61 6d 65   pSubitem->zName
1a0c0 20 3d 20 30 3b 0a 20 20 70 53 75 62 69 74 65 6d   = 0;.  pSubitem
1a0d0 2d 3e 7a 41 6c 69 61 73 20 3d 20 30 3b 0a 20 20  ->zAlias = 0;.  
1a0e0 70 53 75 62 69 74 65 6d 2d 3e 70 53 65 6c 65 63  pSubitem->pSelec
1a0f0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 65 66  t = 0;..  /* Def
1a100 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  er deleting the 
1a110 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 61 73 73  Table object ass
1a120 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1a130 0a 20 20 2a 2a 20 73 75 62 71 75 65 72 79 20 75  .  ** subquery u
1a140 6e 74 69 6c 20 63 6f 64 65 20 67 65 6e 65 72 61  ntil code genera
1a150 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d  tion is.  ** com
1a160 70 6c 65 74 65 2c 20 73 69 6e 63 65 20 74 68 65  plete, since the
1a170 72 65 20 6d 61 79 20 73 74 69 6c 6c 20 65 78 69  re may still exi
1a180 73 74 20 45 78 70 72 2e 70 54 61 62 20 65 6e 74  st Expr.pTab ent
1a190 72 69 65 73 20 74 68 61 74 0a 20 20 2a 2a 20 72  ries that.  ** r
1a1a0 65 66 65 72 20 74 6f 20 74 68 65 20 73 75 62 71  efer to the subq
1a1b0 75 65 72 79 20 65 76 65 6e 20 61 66 74 65 72 20  uery even after 
1a1c0 66 6c 61 74 74 65 6e 69 6e 67 2e 20 20 54 69 63  flattening.  Tic
1a1d0 6b 65 74 20 23 33 33 34 36 2e 0a 20 20 2a 2a 0a  ket #3346..  **.
1a1e0 20 20 2a 2a 20 70 53 75 62 69 74 65 6d 2d 3e 70    ** pSubitem->p
1a1f0 54 61 62 20 69 73 20 61 6c 77 61 79 73 20 6e 6f  Tab is always no
1a200 6e 2d 4e 55 4c 4c 20 62 79 20 74 65 73 74 20 72  n-NULL by test r
1a210 65 73 74 72 69 63 74 69 6f 6e 73 20 61 6e 64 20  estrictions and 
1a220 74 65 73 74 73 20 61 62 6f 76 65 2e 0a 20 20 2a  tests above..  *
1a230 2f 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  /.  if( ALWAYS(p
1a240 53 75 62 69 74 65 6d 2d 3e 70 54 61 62 21 3d 30  Subitem->pTab!=0
1a250 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  ) ){.    Table *
1a260 70 54 61 62 54 6f 44 65 6c 20 3d 20 70 53 75 62  pTabToDel = pSub
1a270 69 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  item->pTab;.    
1a280 69 66 28 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e  if( pTabToDel->n
1a290 52 65 66 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Ref==1 ){.      
1a2a0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1a2b0 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1a2c0 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1a2d0 0a 20 20 20 20 20 20 70 54 61 62 54 6f 44 65 6c  .      pTabToDel
1a2e0 2d 3e 70 4e 65 78 74 5a 6f 6d 62 69 65 20 3d 20  ->pNextZombie = 
1a2f0 70 54 6f 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62  pToplevel->pZomb
1a300 69 65 54 61 62 3b 0a 20 20 20 20 20 20 70 54 6f  ieTab;.      pTo
1a310 70 6c 65 76 65 6c 2d 3e 70 5a 6f 6d 62 69 65 54  plevel->pZombieT
1a320 61 62 20 3d 20 70 54 61 62 54 6f 44 65 6c 3b 0a  ab = pTabToDel;.
1a330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a340 20 70 54 61 62 54 6f 44 65 6c 2d 3e 6e 52 65 66   pTabToDel->nRef
1a350 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  --;.    }.    pS
1a360 75 62 69 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ubitem->pTab = 0
1a370 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1a380 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
1a390 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1a3a0 68 20 74 65 72 6d 20 69 6e 20 61 20 63 6f 6d 70  h term in a comp
1a3b0 6f 75 6e 64 2d 73 75 62 71 75 65 72 79 0a 20 20  ound-subquery.  
1a3c0 2a 2a 20 66 6c 61 74 74 65 6e 69 6e 67 20 28 61  ** flattening (a
1a3d0 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76  s described abov
1a3e0 65 29 2e 20 20 49 66 20 77 65 20 61 72 65 20 64  e).  If we are d
1a3f0 6f 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  oing a different
1a400 20 6b 69 6e 64 0a 20 20 2a 2a 20 6f 66 20 66 6c   kind.  ** of fl
1a410 61 74 74 65 6e 69 6e 67 20 2d 20 61 20 66 6c 61  attening - a fla
1a420 74 74 65 6e 69 6e 67 20 6f 74 68 65 72 20 74 68  ttening other th
1a430 61 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 75  an a compound-su
1a440 62 71 75 65 72 79 20 66 6c 61 74 74 65 6e 69 6e  bquery flattenin
1a450 67 20 2d 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  g -.  ** then th
1a460 69 73 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  is loop only run
1a470 73 20 6f 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s once..  **.  *
1a480 2a 20 54 68 69 73 20 6c 6f 6f 70 20 6d 6f 76 65  * This loop move
1a490 73 20 61 6c 6c 20 6f 66 20 74 68 65 20 46 52 4f  s all of the FRO
1a4a0 4d 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  M elements of th
1a4b0 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f 20  e subquery into 
1a4c0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 46 52 4f  the.  ** the FRO
1a4d0 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  M clause of the 
1a4e0 6f 75 74 65 72 20 71 75 65 72 79 2e 20 20 42 65  outer query.  Be
1a4f0 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 2c  fore doing this,
1a500 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74   remember.  ** t
1a510 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1a520 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61   for the origina
1a530 6c 20 6f 75 74 65 72 20 71 75 65 72 79 20 46 52  l outer query FR
1a540 4f 4d 20 65 6c 65 6d 65 6e 74 20 69 6e 0a 20 20  OM element in.  
1a550 2a 2a 20 69 50 61 72 65 6e 74 2e 20 20 54 68 65  ** iParent.  The
1a560 20 69 50 61 72 65 6e 74 20 63 75 72 73 6f 72 20   iParent cursor 
1a570 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73  will never be us
1a580 65 64 2e 20 20 53 75 62 73 65 71 75 65 6e 74 20  ed.  Subsequent 
1a590 63 6f 64 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 73  code.  ** will s
1a5a0 63 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20  can expressions 
1a5b0 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 50 61 72  looking for iPar
1a5c0 65 6e 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  ent references a
1a5d0 6e 64 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20  nd replace.  ** 
1a5e0 74 68 6f 73 65 20 72 65 66 65 72 65 6e 63 65 73  those references
1a5f0 20 77 69 74 68 20 65 78 70 72 65 73 73 69 6f 6e   with expression
1a600 73 20 74 68 61 74 20 72 65 73 6f 6c 76 65 20 74  s that resolve t
1a610 6f 20 74 68 65 20 73 75 62 71 75 65 72 79 20 46  o the subquery F
1a620 52 4f 4d 0a 20 20 2a 2a 20 65 6c 65 6d 65 6e 74  ROM.  ** element
1a630 73 20 77 65 20 61 72 65 20 6e 6f 77 20 63 6f 70  s we are now cop
1a640 79 69 6e 67 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ying in..  */.  
1a650 66 6f 72 28 70 50 61 72 65 6e 74 3d 70 3b 20 70  for(pParent=p; p
1a660 50 61 72 65 6e 74 3b 20 70 50 61 72 65 6e 74 3d  Parent; pParent=
1a670 70 50 61 72 65 6e 74 2d 3e 70 50 72 69 6f 72 2c  pParent->pPrior,
1a680 20 70 53 75 62 3d 70 53 75 62 2d 3e 70 50 72 69   pSub=pSub->pPri
1a690 6f 72 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 75  or){.    int nSu
1a6a0 62 53 72 63 3b 0a 20 20 20 20 75 38 20 6a 6f 69  bSrc;.    u8 joi
1a6b0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  ntype = 0;.    p
1a6c0 53 75 62 53 72 63 20 3d 20 70 53 75 62 2d 3e 70  SubSrc = pSub->p
1a6d0 53 72 63 3b 20 20 20 20 20 2f 2a 20 46 52 4f 4d  Src;     /* FROM
1a6e0 20 63 6c 61 75 73 65 20 6f 66 20 73 75 62 71 75   clause of subqu
1a6f0 65 72 79 20 2a 2f 0a 20 20 20 20 6e 53 75 62 53  ery */.    nSubS
1a700 72 63 20 3d 20 70 53 75 62 53 72 63 2d 3e 6e 53  rc = pSubSrc->nS
1a710 72 63 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  rc;  /* Number o
1a720 66 20 74 65 72 6d 73 20 69 6e 20 73 75 62 71 75  f terms in subqu
1a730 65 72 79 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  ery FROM clause 
1a740 2a 2f 0a 20 20 20 20 70 53 72 63 20 3d 20 70 50  */.    pSrc = pP
1a750 61 72 65 6e 74 2d 3e 70 53 72 63 3b 20 20 20 20  arent->pSrc;    
1a760 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
1a770 6f 66 20 74 68 65 20 6f 75 74 65 72 20 71 75 65  of the outer que
1a780 72 79 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70  ry */..    if( p
1a790 53 72 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Src ){.      ass
1a7a0 65 72 74 28 20 70 50 61 72 65 6e 74 3d 3d 70 20  ert( pParent==p 
1a7b0 29 3b 20 20 2f 2a 20 46 69 72 73 74 20 74 69 6d  );  /* First tim
1a7c0 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 6f  e through the lo
1a7d0 6f 70 20 2a 2f 0a 20 20 20 20 20 20 6a 6f 69 6e  op */.      join
1a7e0 74 79 70 65 20 3d 20 70 53 75 62 69 74 65 6d 2d  type = pSubitem-
1a7f0 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d  >jointype;.    }
1a800 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1a810 72 74 28 20 70 50 61 72 65 6e 74 21 3d 70 20 29  rt( pParent!=p )
1a820 3b 20 20 2f 2a 20 32 6e 64 20 61 6e 64 20 73 75  ;  /* 2nd and su
1a830 62 73 65 71 75 65 6e 74 20 74 69 6d 65 73 20 74  bsequent times t
1a840 68 72 6f 75 67 68 20 74 68 65 20 6c 6f 6f 70 20  hrough the loop 
1a850 2a 2f 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  */.      pSrc = 
1a860 70 50 61 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20  pParent->pSrc = 
1a870 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1a880 70 65 6e 64 28 64 62 2c 20 30 2c 20 30 2c 20 30  pend(db, 0, 0, 0
1a890 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 72  );.      if( pSr
1a8a0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1a8b0 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1a8c0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1a8d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a8e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1a8f0 20 54 68 65 20 73 75 62 71 75 65 72 79 20 75 73   The subquery us
1a900 65 73 20 61 20 73 69 6e 67 6c 65 20 73 6c 6f 74  es a single slot
1a910 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1a920 75 73 65 20 6f 66 20 74 68 65 20 6f 75 74 65 72  use of the outer
1a930 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2e 20 20  .    ** query.  
1a940 49 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  If the subquery 
1a950 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
1a960 65 20 65 6c 65 6d 65 6e 74 20 69 6e 20 69 74 73  e element in its
1a970 20 46 52 4f 4d 20 63 6c 61 75 73 65 2c 0a 20 20   FROM clause,.  
1a980 20 20 2a 2a 20 74 68 65 6e 20 65 78 70 61 6e 64    ** then expand
1a990 20 74 68 65 20 6f 75 74 65 72 20 71 75 65 72 79   the outer query
1a9a0 20 74 6f 20 6d 61 6b 65 20 73 70 61 63 65 20 66   to make space f
1a9b0 6f 72 20 69 74 20 74 6f 20 68 6f 6c 64 20 61 6c  or it to hold al
1a9c0 6c 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20 2a  l elements.    *
1a9d0 2a 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72  * of the subquer
1a9e0 79 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  y..    **.    **
1a9f0 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a   Example:.    **
1aa00 0a 20 20 20 20 2a 2a 20 20 20 20 53 45 4c 45 43  .    **    SELEC
1aa10 54 20 2a 20 46 52 4f 4d 20 74 61 62 41 2c 20 28  T * FROM tabA, (
1aa20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 75  SELECT * FROM su
1aa30 62 31 2c 20 73 75 62 32 29 2c 20 74 61 62 42 3b  b1, sub2), tabB;
1aa40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1aa50 68 65 20 6f 75 74 65 72 20 71 75 65 72 79 20 68  he outer query h
1aa60 61 73 20 33 20 73 6c 6f 74 73 20 69 6e 20 69 74  as 3 slots in it
1aa70 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1aa80 4f 6e 65 20 73 6c 6f 74 20 6f 66 20 74 68 65 0a  One slot of the.
1aa90 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65      ** outer que
1aaa0 72 79 20 28 74 68 65 20 6d 69 64 64 6c 65 20 73  ry (the middle s
1aab0 6c 6f 74 29 20 69 73 20 75 73 65 64 20 62 79 20  lot) is used by 
1aac0 74 68 65 20 73 75 62 71 75 65 72 79 2e 20 20 54  the subquery.  T
1aad0 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62  he next.    ** b
1aae0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 77 69 6c  lock of code wil
1aaf0 6c 20 65 78 70 61 6e 64 20 74 68 65 20 6f 75 74  l expand the out
1ab00 20 71 75 65 72 79 20 74 6f 20 34 20 73 6c 6f 74   query to 4 slot
1ab10 73 2e 20 20 54 68 65 20 6d 69 64 64 6c 65 0a 20  s.  The middle. 
1ab20 20 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 65 78     ** slot is ex
1ab30 70 61 6e 64 65 64 20 74 6f 20 74 77 6f 20 73 6c  panded to two sl
1ab40 6f 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ots in order to 
1ab50 6d 61 6b 65 20 73 70 61 63 65 20 66 6f 72 20 74  make space for t
1ab60 68 65 0a 20 20 20 20 2a 2a 20 74 77 6f 20 65 6c  he.    ** two el
1ab70 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 46 52  ements in the FR
1ab80 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  OM clause of the
1ab90 20 73 75 62 71 75 65 72 79 2e 0a 20 20 20 20 2a   subquery..    *
1aba0 2f 0a 20 20 20 20 69 66 28 20 6e 53 75 62 53 72  /.    if( nSubSr
1abb0 63 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 50 61  c>1 ){.      pPa
1abc0 72 65 6e 74 2d 3e 70 53 72 63 20 3d 20 70 53 72  rent->pSrc = pSr
1abd0 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
1abe0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1abf0 72 63 2c 20 6e 53 75 62 53 72 63 2d 31 2c 69 46  rc, nSubSrc-1,iF
1ac00 72 6f 6d 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  rom+1);.      if
1ac10 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1ac20 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ed ){.        br
1ac30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1ac40 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 72 61 6e 73   }..    /* Trans
1ac50 66 65 72 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  fer the FROM cla
1ac60 75 73 65 20 74 65 72 6d 73 20 66 72 6f 6d 20 74  use terms from t
1ac70 68 65 20 73 75 62 71 75 65 72 79 20 69 6e 74 6f  he subquery into
1ac80 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65   the.    ** oute
1ac90 72 20 71 75 65 72 79 2e 0a 20 20 20 20 2a 2f 0a  r query..    */.
1aca0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1acb0 53 75 62 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  SubSrc; i++){.  
1acc0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1acd0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63  tDelete(db, pSrc
1ace0 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 2e 70 55 73  ->a[i+iFrom].pUs
1acf0 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 53 72 63  ing);.      pSrc
1ad00 2d 3e 61 5b 69 2b 69 46 72 6f 6d 5d 20 3d 20 70  ->a[i+iFrom] = p
1ad10 53 75 62 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  SubSrc->a[i];.  
1ad20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 53 75 62      memset(&pSub
1ad30 53 72 63 2d 3e 61 5b 69 5d 2c 20 30 2c 20 73 69  Src->a[i], 0, si
1ad40 7a 65 6f 66 28 70 53 75 62 53 72 63 2d 3e 61 5b  zeof(pSubSrc->a[
1ad50 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i]));.    }.    
1ad60 70 53 72 63 2d 3e 61 5b 69 46 72 6f 6d 5d 2e 6a  pSrc->a[iFrom].j
1ad70 6f 69 6e 74 79 70 65 20 3d 20 6a 6f 69 6e 74 79  ointype = jointy
1ad80 70 65 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 4e 6f  pe;.  .    /* No
1ad90 77 20 62 65 67 69 6e 20 73 75 62 73 74 69 74 75  w begin substitu
1ada0 74 69 6e 67 20 73 75 62 71 75 65 72 79 20 72 65  ting subquery re
1adb0 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
1adc0 69 6f 6e 73 20 66 6f 72 20 0a 20 20 20 20 2a 2a  ions for .    **
1add0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1ade0 68 65 20 69 50 61 72 65 6e 74 20 69 6e 20 74 68  he iParent in th
1adf0 65 20 6f 75 74 65 72 20 71 75 65 72 79 2e 0a 20  e outer query.. 
1ae00 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 45 78     ** .    ** Ex
1ae10 61 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20  ample:.    **.  
1ae20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 61 2b    **   SELECT a+
1ae30 35 2c 20 62 2a 31 30 20 46 52 4f 4d 20 28 53 45  5, b*10 FROM (SE
1ae40 4c 45 43 54 20 78 2a 33 20 41 53 20 61 2c 20 79  LECT x*3 AS a, y
1ae50 2b 31 30 20 41 53 20 62 20 46 52 4f 4d 20 74 31  +10 AS b FROM t1
1ae60 29 20 57 48 45 52 45 20 61 3e 62 3b 0a 20 20 20  ) WHERE a>b;.   
1ae70 20 2a 2a 20 20 20 5c 20 20 20 20 20 20 20 20 20   **   \         
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f 5f              \___
1ae90 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 73 75 62 71 75  __________ subqu
1aea0 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ery __________/ 
1aeb0 20 20 20 20 20 20 20 20 20 2f 0a 20 20 20 20 2a           /.    *
1aec0 2a 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  *    \__________
1aed0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 20 6f 75 74 65  ___________ oute
1aee0 72 20 71 75 65 72 79 20 5f 5f 5f 5f 5f 5f 5f 5f  r query ________
1aef0 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1af00 5f 5f 5f 5f 5f 5f 2f 0a 20 20 20 20 2a 2a 0a 20  ______/.    **. 
1af10 20 20 20 2a 2a 20 57 65 20 6c 6f 6f 6b 20 61 74     ** We look at
1af20 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
1af30 6e 20 69 6e 20 74 68 65 20 6f 75 74 65 72 20 71  n in the outer q
1af40 75 65 72 79 20 61 6e 64 20 65 76 65 72 79 20 70  uery and every p
1af50 6c 61 63 65 20 77 65 20 73 65 65 0a 20 20 20 20  lace we see.    
1af60 2a 2a 20 22 61 22 20 77 65 20 73 75 62 73 74 69  ** "a" we substi
1af70 74 75 74 65 20 22 78 2a 33 22 20 61 6e 64 20 65  tute "x*3" and e
1af80 76 65 72 79 20 70 6c 61 63 65 20 77 65 20 73 65  very place we se
1af90 65 20 22 62 22 20 77 65 20 73 75 62 73 74 69 74  e "b" we substit
1afa0 75 74 65 20 22 79 2b 31 30 22 2e 0a 20 20 20 20  ute "y+10"..    
1afb0 2a 2f 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70  */.    pList = p
1afc0 50 61 72 65 6e 74 2d 3e 70 45 4c 69 73 74 3b 0a  Parent->pEList;.
1afd0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1afe0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
1aff0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69  ){.      if( pLi
1b000 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3d 3d  st->a[i].zName==
1b010 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  0 ){.        cha
1b020 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1b030 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
1b040 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 53 70 61 6e  List->a[i].zSpan
1b050 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1b060 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
1b070 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  ;.        pList-
1b080 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  >a[i].zName = zN
1b090 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ame;.      }.   
1b0a0 20 7d 0a 20 20 20 20 73 75 62 73 74 45 78 70 72   }.    substExpr
1b0b0 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65 6e 74  List(db, pParent
1b0c0 2d 3e 70 45 4c 69 73 74 2c 20 69 50 61 72 65 6e  ->pEList, iParen
1b0d0 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1b0e0 3b 0a 20 20 20 20 69 66 28 20 69 73 41 67 67 20  ;.    if( isAgg 
1b0f0 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45 78  ){.      substEx
1b100 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72 65  prList(db, pPare
1b110 6e 74 2d 3e 70 47 72 6f 75 70 42 79 2c 20 69 50  nt->pGroupBy, iP
1b120 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c  arent, pSub->pEL
1b130 69 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ist);.      pPar
1b140 65 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73  ent->pHaving = s
1b150 75 62 73 74 45 78 70 72 28 64 62 2c 20 70 50 61  ubstExpr(db, pPa
1b160 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69  rent->pHaving, i
1b170 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1b180 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1b190 20 69 66 28 20 70 53 75 62 2d 3e 70 4f 72 64 65   if( pSub->pOrde
1b1a0 72 42 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73  rBy ){.      ass
1b1b0 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4f  ert( pParent->pO
1b1c0 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
1b1d0 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4f 72 64     pParent->pOrd
1b1e0 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72  erBy = pSub->pOr
1b1f0 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75  derBy;.      pSu
1b200 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  b->pOrderBy = 0;
1b210 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1b220 50 61 72 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79  Parent->pOrderBy
1b230 20 29 7b 0a 20 20 20 20 20 20 73 75 62 73 74 45   ){.      substE
1b240 78 70 72 4c 69 73 74 28 64 62 2c 20 70 50 61 72  xprList(db, pPar
1b250 65 6e 74 2d 3e 70 4f 72 64 65 72 42 79 2c 20 69  ent->pOrderBy, i
1b260 50 61 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45  Parent, pSub->pE
1b270 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
1b280 20 69 66 28 20 70 53 75 62 2d 3e 70 57 68 65 72   if( pSub->pWher
1b290 65 20 29 7b 0a 20 20 20 20 20 20 70 57 68 65 72  e ){.      pWher
1b2a0 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  e = sqlite3ExprD
1b2b0 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70 57 68  up(db, pSub->pWh
1b2c0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  ere, 0);.    }el
1b2d0 73 65 7b 0a 20 20 20 20 20 20 70 57 68 65 72 65  se{.      pWhere
1b2e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1b2f0 69 66 28 20 73 75 62 71 75 65 72 79 49 73 41 67  if( subqueryIsAg
1b300 67 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  g ){.      asser
1b310 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76  t( pParent->pHav
1b320 69 6e 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ing==0 );.      
1b330 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e 67  pParent->pHaving
1b340 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 57 68 65   = pParent->pWhe
1b350 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1b360 74 2d 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65  t->pWhere = pWhe
1b370 72 65 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e  re;.      pParen
1b380 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 75 62  t->pHaving = sub
1b390 73 74 45 78 70 72 28 64 62 2c 20 70 50 61 72 65  stExpr(db, pPare
1b3a0 6e 74 2d 3e 70 48 61 76 69 6e 67 2c 20 69 50 61  nt->pHaving, iPa
1b3b0 72 65 6e 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69  rent, pSub->pELi
1b3c0 73 74 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65  st);.      pPare
1b3d0 6e 74 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71  nt->pHaving = sq
1b3e0 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62 2c  lite3ExprAnd(db,
1b3f0 20 70 50 61 72 65 6e 74 2d 3e 70 48 61 76 69 6e   pParent->pHavin
1b400 67 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  g, .            
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b420 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1b430 72 44 75 70 28 64 62 2c 20 70 53 75 62 2d 3e 70  rDup(db, pSub->p
1b440 48 61 76 69 6e 67 2c 20 30 29 29 3b 0a 20 20 20  Having, 0));.   
1b450 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
1b460 6e 74 2d 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20  nt->pGroupBy==0 
1b470 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
1b480 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
1b490 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1b4a0 64 62 2c 20 70 53 75 62 2d 3e 70 47 72 6f 75 70  db, pSub->pGroup
1b4b0 42 79 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  By, 0);.    }els
1b4c0 65 7b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  e{.      pParent
1b4d0 2d 3e 70 57 68 65 72 65 20 3d 20 73 75 62 73 74  ->pWhere = subst
1b4e0 45 78 70 72 28 64 62 2c 20 70 50 61 72 65 6e 74  Expr(db, pParent
1b4f0 2d 3e 70 57 68 65 72 65 2c 20 69 50 61 72 65 6e  ->pWhere, iParen
1b500 74 2c 20 70 53 75 62 2d 3e 70 45 4c 69 73 74 29  t, pSub->pEList)
1b510 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  ;.      pParent-
1b520 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
1b530 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 50 61  3ExprAnd(db, pPa
1b540 72 65 6e 74 2d 3e 70 57 68 65 72 65 2c 20 70 57  rent->pWhere, pW
1b550 68 65 72 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  here);.    }.  .
1b560 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 74 74      /* The flatt
1b570 65 6e 65 64 20 71 75 65 72 79 20 69 73 20 64 69  ened query is di
1b580 73 74 69 6e 63 74 20 69 66 20 65 69 74 68 65 72  stinct if either
1b590 20 74 68 65 20 69 6e 6e 65 72 20 6f 72 20 74 68   the inner or th
1b5a0 65 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  e.    ** outer q
1b5b0 75 65 72 79 20 69 73 20 64 69 73 74 69 6e 63 74  uery is distinct
1b5c0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  . .    */.    pP
1b5d0 61 72 65 6e 74 2d 3e 73 65 6c 46 6c 61 67 73 20  arent->selFlags 
1b5e0 7c 3d 20 70 53 75 62 2d 3e 73 65 6c 46 6c 61 67  |= pSub->selFlag
1b5f0 73 20 26 20 53 46 5f 44 69 73 74 69 6e 63 74 3b  s & SF_Distinct;
1b600 0a 20 20 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  .  .    /*.    *
1b610 2a 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f  * SELECT ... FRO
1b620 4d 20 28 53 45 4c 45 43 54 20 2e 2e 2e 20 4c 49  M (SELECT ... LI
1b630 4d 49 54 20 61 20 4f 46 46 53 45 54 20 62 29 20  MIT a OFFSET b) 
1b640 4c 49 4d 49 54 20 78 20 4f 46 46 53 45 54 20 79  LIMIT x OFFSET y
1b650 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1b660 4f 6e 65 20 69 73 20 74 65 6d 70 74 65 64 20 74  One is tempted t
1b670 6f 20 74 72 79 20 74 6f 20 61 64 64 20 61 20 61  o try to add a a
1b680 6e 64 20 62 20 74 6f 20 63 6f 6d 62 69 6e 65 20  nd b to combine 
1b690 74 68 65 20 6c 69 6d 69 74 73 2e 20 20 42 75 74  the limits.  But
1b6a0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 64 6f 65   this.    ** doe
1b6b0 73 20 6e 6f 74 20 77 6f 72 6b 20 69 66 20 65 69  s not work if ei
1b6c0 74 68 65 72 20 6c 69 6d 69 74 20 69 73 20 6e 65  ther limit is ne
1b6d0 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  gative..    */. 
1b6e0 20 20 20 69 66 28 20 70 53 75 62 2d 3e 70 4c 69     if( pSub->pLi
1b6f0 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 70 50 61  mit ){.      pPa
1b700 72 65 6e 74 2d 3e 70 4c 69 6d 69 74 20 3d 20 70  rent->pLimit = p
1b710 53 75 62 2d 3e 70 4c 69 6d 69 74 3b 0a 20 20 20  Sub->pLimit;.   
1b720 20 20 20 70 53 75 62 2d 3e 70 4c 69 6d 69 74 20     pSub->pLimit 
1b730 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
1b740 20 20 2f 2a 20 46 69 6e 69 61 6c 6c 79 2c 20 64    /* Finially, d
1b750 65 6c 65 74 65 20 77 68 61 74 20 69 73 20 6c 65  elete what is le
1b760 66 74 20 6f 66 20 74 68 65 20 73 75 62 71 75 65  ft of the subque
1b770 72 79 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ry and return.  
1b780 2a 2a 20 73 75 63 63 65 73 73 2e 0a 20 20 2a 2f  ** success..  */
1b790 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1b7a0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 31  Delete(db, pSub1
1b7b0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
1b7c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
1b7d0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1b7e0 5f 53 55 42 51 55 45 52 59 29 20 7c 7c 20 21 64  _SUBQUERY) || !d
1b7f0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1b800 49 54 5f 56 49 45 57 29 20 2a 2f 0a 0a 2f 2a 0a  IT_VIEW) */../*.
1b810 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 53  ** Analyze the S
1b820 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1b830 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
1b840 75 6d 65 6e 74 20 74 6f 20 73 65 65 20 69 66 20  ument to see if 
1b850 69 74 0a 2a 2a 20 69 73 20 61 20 6d 69 6e 28 29  it.** is a min()
1b860 20 6f 72 20 6d 61 78 28 29 20 71 75 65 72 79 2e   or max() query.
1b870 20 52 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52   Return WHERE_OR
1b880 44 45 52 42 59 5f 4d 49 4e 20 6f 72 20 57 48 45  DERBY_MIN or WHE
1b890 52 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 20 69  RE_ORDERBY_MAX i
1b8a0 66 20 0a 2a 2a 20 69 74 20 69 73 2c 20 6f 72 20  f .** it is, or 
1b8b0 30 20 6f 74 68 65 72 77 69 73 65 2e 20 41 74 20  0 otherwise. At 
1b8c0 70 72 65 73 65 6e 74 2c 20 61 20 71 75 65 72 79  present, a query
1b8d0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
1b8e0 6f 20 62 65 0a 2a 2a 20 61 20 6d 69 6e 28 29 2f  o be.** a min()/
1b8f0 6d 61 78 28 29 20 71 75 65 72 79 20 69 66 3a 0a  max() query if:.
1b900 2a 2a 0a 2a 2a 20 20 20 31 2e 20 54 68 65 72 65  **.**   1. There
1b910 20 69 73 20 61 20 73 69 6e 67 6c 65 20 6f 62 6a   is a single obj
1b920 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ect in the FROM 
1b930 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  clause..**.**   
1b940 32 2e 20 54 68 65 72 65 20 69 73 20 61 20 73 69  2. There is a si
1b950 6e 67 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 20  ngle expression 
1b960 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
1b970 74 2c 20 61 6e 64 20 69 74 20 69 73 0a 2a 2a 20  t, and it is.** 
1b980 20 20 20 20 20 65 69 74 68 65 72 20 6d 69 6e 28       either min(
1b990 78 29 20 6f 72 20 6d 61 78 28 78 29 2c 20 77 68  x) or max(x), wh
1b9a0 65 72 65 20 78 20 69 73 20 61 20 63 6f 6c 75 6d  ere x is a colum
1b9b0 6e 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2f 0a  n reference..*/.
1b9c0 73 74 61 74 69 63 20 75 38 20 6d 69 6e 4d 61 78  static u8 minMax
1b9d0 51 75 65 72 79 28 53 65 6c 65 63 74 20 2a 70 29  Query(Select *p)
1b9e0 7b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b  {.  Expr *pExpr;
1b9f0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
1ba00 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
1ba10 0a 0a 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e  ..  if( pEList->
1ba20 6e 45 78 70 72 21 3d 31 20 29 20 72 65 74 75 72  nExpr!=1 ) retur
1ba30 6e 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  n WHERE_ORDERBY_
1ba40 4e 4f 52 4d 41 4c 3b 0a 20 20 70 45 78 70 72 20  NORMAL;.  pExpr 
1ba50 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  = pEList->a[0].p
1ba60 45 78 70 72 3b 0a 20 20 69 66 28 20 70 45 78 70  Expr;.  if( pExp
1ba70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47 5f 46 55  r->op!=TK_AGG_FU
1ba80 4e 43 54 49 4f 4e 20 29 20 72 65 74 75 72 6e 20  NCTION ) return 
1ba90 30 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 45  0;.  if( NEVER(E
1baa0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1bab0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1bac0 63 74 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ct)) ) return 0;
1bad0 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70  .  pEList = pExp
1bae0 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 69 66  r->x.pList;.  if
1baf0 28 20 70 45 4c 69 73 74 3d 3d 30 20 7c 7c 20 70  ( pEList==0 || p
1bb00 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20  EList->nExpr!=1 
1bb10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
1bb20 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
1bb30 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 47 47  Expr->op!=TK_AGG
1bb40 5f 43 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e  _COLUMN ) return
1bb50 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4e   WHERE_ORDERBY_N
1bb60 4f 52 4d 41 4c 3b 0a 20 20 61 73 73 65 72 74 28  ORMAL;.  assert(
1bb70 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1bb80 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
1bb90 61 6c 75 65 29 20 29 3b 0a 20 20 69 66 28 20 73  alue) );.  if( s
1bba0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 45  qlite3StrICmp(pE
1bbb0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d  xpr->u.zToken,"m
1bbc0 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  in")==0 ){.    r
1bbd0 65 74 75 72 6e 20 57 48 45 52 45 5f 4f 52 44 45  eturn WHERE_ORDE
1bbe0 52 42 59 5f 4d 49 4e 3b 0a 20 20 7d 65 6c 73 65  RBY_MIN;.  }else
1bbf0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1bc00 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
1bc10 6b 65 6e 2c 22 6d 61 78 22 29 3d 3d 30 20 29 7b  ken,"max")==0 ){
1bc20 0a 20 20 20 20 72 65 74 75 72 6e 20 57 48 45 52  .    return WHER
1bc30 45 5f 4f 52 44 45 52 42 59 5f 4d 41 58 3b 0a 20  E_ORDERBY_MAX;. 
1bc40 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 48 45 52   }.  return WHER
1bc50 45 5f 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  E_ORDERBY_NORMAL
1bc60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1bc70 65 6c 65 63 74 20 73 74 61 74 65 6d 65 6e 74 20  elect statement 
1bc80 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1bc90 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1bca0 61 6e 20 61 67 67 72 65 67 61 74 65 20 71 75 65  an aggregate que
1bcb0 72 79 2e 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ry..** The secon
1bcc0 64 20 61 72 67 6d 65 6e 74 20 69 73 20 74 68 65  d argment is the
1bcd0 20 61 73 73 6f 63 69 61 74 65 64 20 61 67 67 72   associated aggr
1bce0 65 67 61 74 65 2d 69 6e 66 6f 20 6f 62 6a 65 63  egate-info objec
1bcf0 74 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e 63  t. This .** func
1bd00 74 69 6f 6e 20 74 65 73 74 73 20 69 66 20 74 68  tion tests if th
1bd10 65 20 53 45 4c 45 43 54 20 69 73 20 6f 66 20 74  e SELECT is of t
1bd20 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
1bd30 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1bd40 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 2a 2a 0a 2a   FROM <tbl>.**.*
1bd50 2a 20 77 68 65 72 65 20 74 61 62 6c 65 20 69 73  * where table is
1bd60 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62 6c   a database tabl
1bd70 65 2c 20 6e 6f 74 20 61 20 73 75 62 2d 73 65 6c  e, not a sub-sel
1bd80 65 63 74 20 6f 72 20 76 69 65 77 2e 20 49 66 20  ect or view. If 
1bd90 74 68 65 20 71 75 65 72 79 0a 2a 2a 20 64 6f 65  the query.** doe
1bda0 73 20 6d 61 74 63 68 20 74 68 69 73 20 70 61 74  s match this pat
1bdb0 74 65 72 6e 2c 20 74 68 65 6e 20 61 20 70 6f 69  tern, then a poi
1bdc0 6e 74 65 72 20 74 6f 20 74 68 65 20 54 61 62 6c  nter to the Tabl
1bdd0 65 20 6f 62 6a 65 63 74 20 72 65 70 72 65 73 65  e object represe
1bde0 6e 74 69 6e 67 0a 2a 2a 20 3c 74 62 6c 3e 20 69  nting.** <tbl> i
1bdf0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1be00 72 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75  rwise, 0 is retu
1be10 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1be20 54 61 62 6c 65 20 2a 69 73 53 69 6d 70 6c 65 43  Table *isSimpleC
1be30 6f 75 6e 74 28 53 65 6c 65 63 74 20 2a 70 2c 20  ount(Select *p, 
1be40 41 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66  AggInfo *pAggInf
1be50 6f 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  o){.  Table *pTa
1be60 62 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  b;.  Expr *pExpr
1be70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 2d  ;..  assert( !p-
1be80 3e 70 47 72 6f 75 70 42 79 20 29 3b 0a 0a 20 20  >pGroupBy );..  
1be90 69 66 28 20 70 2d 3e 70 57 68 65 72 65 20 7c 7c  if( p->pWhere ||
1bea0 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
1beb0 72 21 3d 31 20 0a 20 20 20 7c 7c 20 70 2d 3e 70  r!=1 .   || p->p
1bec0 53 72 63 2d 3e 6e 53 72 63 21 3d 31 20 7c 7c 20  Src->nSrc!=1 || 
1bed0 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
1bee0 65 6c 65 63 74 0a 20 20 29 7b 0a 20 20 20 20 72  elect.  ){.    r
1bef0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1bf00 54 61 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Tab = p->pSrc->a
1bf10 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 70 45 78 70  [0].pTab;.  pExp
1bf20 72 20 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61  r = p->pEList->a
1bf30 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  [0].pExpr;.  ass
1bf40 65 72 74 28 20 70 54 61 62 20 26 26 20 21 70 54  ert( pTab && !pT
1bf50 61 62 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 70  ab->pSelect && p
1bf60 45 78 70 72 20 29 3b 0a 0a 20 20 69 66 28 20 49  Expr );..  if( I
1bf70 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
1bf80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1bf90 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
1bfa0 47 47 5f 46 55 4e 43 54 49 4f 4e 20 29 20 72 65  GG_FUNCTION ) re
1bfb0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 4e 45  turn 0;.  if( NE
1bfc0 56 45 52 28 70 41 67 67 49 6e 66 6f 2d 3e 6e 46  VER(pAggInfo->nF
1bfd0 75 6e 63 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  unc==0) ) return
1bfe0 20 30 3b 0a 20 20 69 66 28 20 28 70 41 67 67 49   0;.  if( (pAggI
1bff0 6e 66 6f 2d 3e 61 46 75 6e 63 5b 30 5d 2e 70 46  nfo->aFunc[0].pF
1c000 75 6e 63 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  unc->flags&SQLIT
1c010 45 5f 46 55 4e 43 5f 43 4f 55 4e 54 29 3d 3d 30  E_FUNC_COUNT)==0
1c020 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
1c030 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 26  f( pExpr->flags&
1c040 45 50 5f 44 69 73 74 69 6e 63 74 20 29 20 72 65  EP_Distinct ) re
1c050 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74 75 72  turn 0;..  retur
1c060 6e 20 70 54 61 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pTab;.}../*.**
1c070 20 49 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c   If the source-l
1c080 69 73 74 20 69 74 65 6d 20 70 61 73 73 65 64 20  ist item passed 
1c090 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 77  as an argument w
1c0a0 61 73 20 61 75 67 6d 65 6e 74 65 64 20 77 69 74  as augmented wit
1c0b0 68 20 61 6e 0a 2a 2a 20 49 4e 44 45 58 45 44 20  h an.** INDEXED 
1c0c0 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
1c0d0 74 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  try to locate th
1c0e0 65 20 73 70 65 63 69 66 69 65 64 20 69 6e 64 65  e specified inde
1c0f0 78 2e 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 77  x. If there.** w
1c100 61 73 20 73 75 63 68 20 61 20 63 6c 61 75 73 65  as such a clause
1c110 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 64 20 69   and the named i
1c120 6e 64 65 78 20 63 61 6e 6e 6f 74 20 62 65 20 66  ndex cannot be f
1c130 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  ound, return .**
1c140 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 61 6e   SQLITE_ERROR an
1c150 64 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  d leave an error
1c160 20 69 6e 20 70 50 61 72 73 65 2e 20 4f 74 68 65   in pParse. Othe
1c170 72 77 69 73 65 2c 20 70 6f 70 75 6c 61 74 65 20  rwise, populate 
1c180 0a 2a 2a 20 70 46 72 6f 6d 2d 3e 70 49 6e 64 65  .** pFrom->pInde
1c190 78 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  x and return SQL
1c1a0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
1c1b0 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42 79 4c  qlite3IndexedByL
1c1c0 6f 6f 6b 75 70 28 50 61 72 73 65 20 2a 70 50 61  ookup(Parse *pPa
1c1d0 72 73 65 2c 20 73 74 72 75 63 74 20 53 72 63 4c  rse, struct SrcL
1c1e0 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 29  ist_item *pFrom)
1c1f0 7b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 70  {.  if( pFrom->p
1c200 54 61 62 20 26 26 20 70 46 72 6f 6d 2d 3e 7a 49  Tab && pFrom->zI
1c210 6e 64 65 78 20 29 7b 0a 20 20 20 20 54 61 62 6c  ndex ){.    Tabl
1c220 65 20 2a 70 54 61 62 20 3d 20 70 46 72 6f 6d 2d  e *pTab = pFrom-
1c230 3e 70 54 61 62 3b 0a 20 20 20 20 63 68 61 72 20  >pTab;.    char 
1c240 2a 7a 49 6e 64 65 78 20 3d 20 70 46 72 6f 6d 2d  *zIndex = pFrom-
1c250 3e 7a 49 6e 64 65 78 3b 0a 20 20 20 20 49 6e 64  >zIndex;.    Ind
1c260 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
1c270 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
1c280 64 65 78 3b 20 0a 20 20 20 20 20 20 20 20 70 49  dex; .        pI
1c290 64 78 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  dx && sqlite3Str
1c2a0 49 43 6d 70 28 70 49 64 78 2d 3e 7a 4e 61 6d 65  ICmp(pIdx->zName
1c2b0 2c 20 7a 49 6e 64 65 78 29 3b 20 0a 20 20 20 20  , zIndex); .    
1c2c0 20 20 20 20 70 49 64 78 3d 70 49 64 78 2d 3e 70      pIdx=pIdx->p
1c2d0 4e 65 78 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Next.    );.    
1c2e0 69 66 28 20 21 70 49 64 78 20 29 7b 0a 20 20 20  if( !pIdx ){.   
1c2f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c300 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1c310 75 63 68 20 69 6e 64 65 78 3a 20 25 73 22 2c 20  uch index: %s", 
1c320 7a 49 6e 64 65 78 2c 20 30 29 3b 0a 20 20 20 20  zIndex, 0);.    
1c330 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1c340 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
1c350 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1c360 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
1c370 70 46 72 6f 6d 2d 3e 70 49 6e 64 65 78 20 3d 20  pFrom->pIndex = 
1c380 70 49 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pIdx;.  }.  retu
1c390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1c3a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1c3b0 69 6e 65 20 69 73 20 61 20 57 61 6c 6b 65 72 20  ine is a Walker 
1c3c0 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 22 65 78  callback for "ex
1c3d0 70 61 6e 64 69 6e 67 22 20 61 20 53 45 4c 45 43  panding" a SELEC
1c3e0 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  T statement..** 
1c3f0 22 45 78 70 61 6e 64 69 6e 67 22 20 6d 65 61 6e  "Expanding" mean
1c400 73 20 74 6f 20 64 6f 20 74 68 65 20 66 6f 6c 6c  s to do the foll
1c410 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
1c420 28 31 29 20 20 4d 61 6b 65 20 73 75 72 65 20 56  (1)  Make sure V
1c430 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1c440 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
1c450 69 67 6e 65 64 20 74 6f 20 65 76 65 72 79 0a 2a  igned to every.*
1c460 2a 20 20 20 20 20 20 20 20 20 65 6c 65 6d 65 6e  *         elemen
1c470 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
1c480 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ause..**.**    (
1c490 32 29 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  2)  Fill in the 
1c4a0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 5d 2e 70 54  pTabList->a[].pT
1c4b0 61 62 20 66 69 65 6c 64 73 20 69 6e 20 74 68 65  ab fields in the
1c4c0 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 0a 2a   SrcList that .*
1c4d0 2a 20 20 20 20 20 20 20 20 20 64 65 66 69 6e 65  *         define
1c4e0 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  s FROM clause.  
1c4f0 57 68 65 6e 20 76 69 65 77 73 20 61 70 70 65 61  When views appea
1c500 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  r in the FROM cl
1c510 61 75 73 65 2c 0a 2a 2a 20 20 20 20 20 20 20 20  ause,.**        
1c520 20 66 69 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e   fill pTabList->
1c530 61 5b 5d 2e 70 53 65 6c 65 63 74 20 77 69 74 68  a[].pSelect with
1c540 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
1c550 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 0a  ELECT statement.
1c560 2a 2a 20 20 20 20 20 20 20 20 20 74 68 61 74 20  **         that 
1c570 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
1c580 69 65 77 2e 20 20 41 20 63 6f 70 79 20 69 73 20  iew.  A copy is 
1c590 6d 61 64 65 20 6f 66 20 74 68 65 20 76 69 65 77  made of the view
1c5a0 27 73 20 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20  's SELECT.**    
1c5b0 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74 20 73       statement s
1c5c0 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 66 72  o that we can fr
1c5d0 65 65 6c 79 20 6d 6f 64 69 66 79 20 6f 72 20 64  eely modify or d
1c5e0 65 6c 65 74 65 20 74 68 61 74 20 73 74 61 74 65  elete that state
1c5f0 6d 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ment.**         
1c600 77 69 74 68 6f 75 74 20 77 6f 72 72 79 69 6e 67  without worrying
1c610 20 61 62 6f 75 74 20 6d 65 73 73 69 6e 67 20 75   about messing u
1c620 70 20 74 68 65 20 70 72 65 73 69 73 74 65 6e 74  p the presistent
1c630 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 0a   representation.
1c640 2a 2a 20 20 20 20 20 20 20 20 20 6f 66 20 74 68  **         of th
1c650 65 20 76 69 65 77 2e 0a 2a 2a 0a 2a 2a 20 20 20  e view..**.**   
1c660 20 28 33 29 20 20 41 64 64 20 74 65 72 6d 73 20   (3)  Add terms 
1c670 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  to the WHERE cla
1c680 75 73 65 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  use to accomodat
1c690 65 20 74 68 65 20 4e 41 54 55 52 41 4c 20 6b 65  e the NATURAL ke
1c6a0 79 77 6f 72 64 0a 2a 2a 20 20 20 20 20 20 20 20  yword.**        
1c6b0 20 6f 6e 20 6a 6f 69 6e 73 20 61 6e 64 20 74 68   on joins and th
1c6c0 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63  e ON and USING c
1c6d0 6c 61 75 73 65 20 6f 66 20 6a 6f 69 6e 73 2e 0a  lause of joins..
1c6e0 2a 2a 0a 2a 2a 20 20 20 20 28 34 29 20 20 53 63  **.**    (4)  Sc
1c6f0 61 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63  an the list of c
1c700 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
1c710 73 75 6c 74 20 73 65 74 20 28 70 45 4c 69 73 74  sult set (pEList
1c720 29 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 20 20 20  ) looking.**    
1c730 20 20 20 20 20 66 6f 72 20 69 6e 73 74 61 6e 63       for instanc
1c740 65 73 20 6f 66 20 74 68 65 20 22 2a 22 20 6f 70  es of the "*" op
1c750 65 72 61 74 6f 72 20 6f 72 20 74 68 65 20 54 41  erator or the TA
1c760 42 4c 45 2e 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  BLE.* operator..
1c770 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 66 6f  **         If fo
1c780 75 6e 64 2c 20 65 78 70 61 6e 64 20 65 61 63 68  und, expand each
1c790 20 22 2a 22 20 74 6f 20 62 65 20 65 76 65 72 79   "*" to be every
1c7a0 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 76 65 72 79   column in every
1c7b0 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20   table.**       
1c7c0 20 20 61 6e 64 20 54 41 42 4c 45 2e 2a 20 74 6f    and TABLE.* to
1c7d0 20 62 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e   be every column
1c7e0 20 69 6e 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2f   in TABLE..**.*/
1c7f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c 65  .static int sele
1c800 63 74 45 78 70 61 6e 64 65 72 28 57 61 6c 6b 65  ctExpander(Walke
1c810 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
1c820 63 74 20 2a 70 29 7b 0a 20 20 50 61 72 73 65 20  ct *p){.  Parse 
1c830 2a 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65  *pParse = pWalke
1c840 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  r->pParse;.  int
1c850 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 53 72 63 4c   i, j, k;.  SrcL
1c860 69 73 74 20 2a 70 54 61 62 4c 69 73 74 3b 0a 20  ist *pTabList;. 
1c870 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
1c880 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  t;.  struct SrcL
1c890 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d 3b  ist_item *pFrom;
1c8a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1c8b0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
1c8c0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1c8d0 69 6c 65 64 20 20 29 7b 0a 20 20 20 20 72 65 74  iled  ){.    ret
1c8e0 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
1c8f0 20 7d 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70   }.  if( NEVER(p
1c900 2d 3e 70 53 72 63 3d 3d 30 29 20 7c 7c 20 28 70  ->pSrc==0) || (p
1c910 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
1c920 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 7b 0a  Expanded)!=0 ){.
1c930 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
1c940 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 2d 3e 73  rune;.  }.  p->s
1c950 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 45 78  elFlags |= SF_Ex
1c960 70 61 6e 64 65 64 3b 0a 20 20 70 54 61 62 4c 69  panded;.  pTabLi
1c970 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1c980 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
1c990 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  st;..  /* Make s
1c9a0 75 72 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  ure cursor numbe
1c9b0 72 73 20 68 61 76 65 20 62 65 65 6e 20 61 73 73  rs have been ass
1c9c0 69 67 6e 65 64 20 74 6f 20 61 6c 6c 20 65 6e 74  igned to all ent
1c9d0 72 69 65 73 20 69 6e 0a 20 20 2a 2a 20 74 68 65  ries in.  ** the
1c9e0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1c9f0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
1ca00 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ment..  */.  sql
1ca10 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1ca20 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
1ca30 20 70 54 61 62 4c 69 73 74 29 3b 0a 0a 20 20 2f   pTabList);..  /
1ca40 2a 20 4c 6f 6f 6b 20 75 70 20 65 76 65 72 79 20  * Look up every 
1ca50 74 61 62 6c 65 20 6e 61 6d 65 64 20 69 6e 20 74  table named in t
1ca60 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
1ca70 66 20 74 68 65 20 73 65 6c 65 63 74 2e 20 20 49  f the select.  I
1ca80 66 0a 20 20 2a 2a 20 61 6e 20 65 6e 74 72 79 20  f.  ** an entry 
1ca90 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1caa0 73 65 20 69 73 20 61 20 73 75 62 71 75 65 72 79  se is a subquery
1cab0 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 74 61   instead of a ta
1cac0 62 6c 65 20 6f 72 20 76 69 65 77 2c 0a 20 20 2a  ble or view,.  *
1cad0 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  * then create a 
1cae0 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
1caf0 73 74 72 75 63 74 75 72 65 20 74 6f 20 64 65 73  structure to des
1cb00 63 72 69 62 65 20 74 68 65 20 73 75 62 71 75 65  cribe the subque
1cb10 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
1cb20 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1cb30 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1cb40 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1cb50 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  rom++){.    Tabl
1cb60 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 69 66 28  e *pTab;.    if(
1cb70 20 70 46 72 6f 6d 2d 3e 70 54 61 62 21 3d 30 20   pFrom->pTab!=0 
1cb80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1cb90 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 61   statement has a
1cba0 6c 72 65 61 64 79 20 62 65 65 6e 20 70 72 65 70  lready been prep
1cbb0 61 72 65 64 2e 20 20 54 68 65 72 65 20 69 73 20  ared.  There is 
1cbc0 6e 6f 20 6e 65 65 64 0a 20 20 20 20 20 20 2a 2a  no need.      **
1cbd0 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
1cbe0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1cbf0 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72   i==0 );.      r
1cc00 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
1cc10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1cc20 46 72 6f 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29  From->zName==0 )
1cc30 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1cc40 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
1cc50 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65       Select *pSe
1cc60 6c 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65  l = pFrom->pSele
1cc70 63 74 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 73  ct;.      /* A s
1cc80 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65 20  ub-query in the 
1cc90 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1cca0 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20 20   SELECT */.     
1ccb0 20 61 73 73 65 72 74 28 20 70 53 65 6c 21 3d 30   assert( pSel!=0
1ccc0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1ccd0 28 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3d 3d 30  ( pFrom->pTab==0
1cce0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1ccf0 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
1cd00 6b 65 72 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  ker, pSel);.    
1cd10 20 20 70 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20    pFrom->pTab = 
1cd20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pTab = sqlite3Db
1cd30 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1cd40 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
1cd50 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
1cd60 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
1cd70 6f 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d  ort;.      pTab-
1cd80 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
1cd90 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pTab->zName = s
1cda0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1cdb0 2c 20 22 73 71 6c 69 74 65 5f 73 75 62 71 75 65  , "sqlite_subque
1cdc0 72 79 5f 25 70 5f 22 2c 20 28 76 6f 69 64 2a 29  ry_%p_", (void*)
1cdd0 70 54 61 62 29 3b 0a 20 20 20 20 20 20 77 68 69  pTab);.      whi
1cde0 6c 65 28 20 70 53 65 6c 2d 3e 70 50 72 69 6f 72  le( pSel->pPrior
1cdf0 20 29 7b 20 70 53 65 6c 20 3d 20 70 53 65 6c 2d   ){ pSel = pSel-
1ce00 3e 70 50 72 69 6f 72 3b 20 7d 0a 20 20 20 20 20  >pPrior; }.     
1ce10 20 73 65 6c 65 63 74 43 6f 6c 75 6d 6e 73 46 72   selectColumnsFr
1ce20 6f 6d 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  omExprList(pPars
1ce30 65 2c 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74 2c  e, pSel->pEList,
1ce40 20 26 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 26 70   &pTab->nCol, &p
1ce50 54 61 62 2d 3e 61 43 6f 6c 29 3b 0a 20 20 20 20  Tab->aCol);.    
1ce60 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
1ce70 2d 31 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  -1;.      pTab->
1ce80 6e 52 6f 77 45 73 74 20 3d 20 31 30 30 30 30 30  nRowEst = 100000
1ce90 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  0;.      pTab->t
1cea0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 45 70  abFlags |= TF_Ep
1ceb0 68 65 6d 65 72 61 6c 3b 0a 23 65 6e 64 69 66 0a  hemeral;.#endif.
1cec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ced0 20 2f 2a 20 41 6e 20 6f 72 64 69 6e 61 72 79 20   /* An ordinary 
1cee0 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
1cef0 6d 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  me in the FROM c
1cf00 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 61  lause */.      a
1cf10 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 54  ssert( pFrom->pT
1cf20 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ab==0 );.      p
1cf30 46 72 6f 6d 2d 3e 70 54 61 62 20 3d 20 70 54 61  From->pTab = pTa
1cf40 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
1cf50 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
1cf60 65 2c 20 30 2c 20 70 46 72 6f 6d 29 3b 0a 20 20  e, 0, pFrom);.  
1cf70 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
1cf80 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
1cf90 72 74 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  rt;.      pTab->
1cfa0 6e 52 65 66 2b 2b 3b 0a 23 69 66 20 21 64 65 66  nRef++;.#if !def
1cfb0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1cfc0 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
1cfd0 65 64 20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ed (SQLITE_OMIT_
1cfe0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
1cff0 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
1d000 65 6c 65 63 74 20 7c 7c 20 49 73 56 69 72 74 75  elect || IsVirtu
1d010 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
1d020 20 20 20 20 2f 2a 20 57 65 20 72 65 61 63 68 20      /* We reach 
1d030 68 65 72 65 20 69 66 20 74 68 65 20 6e 61 6d 65  here if the name
1d040 64 20 74 61 62 6c 65 20 69 73 20 61 20 72 65 61  d table is a rea
1d050 6c 6c 79 20 61 20 76 69 65 77 20 2a 2f 0a 20 20  lly a view */.  
1d060 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1d070 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61  3ViewGetColumnNa
1d080 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  mes(pParse, pTab
1d090 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
1d0a0 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 61 73  bort;.        as
1d0b0 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 70 53 65  sert( pFrom->pSe
1d0c0 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
1d0d0 20 20 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63     pFrom->pSelec
1d0e0 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
1d0f0 74 44 75 70 28 64 62 2c 20 70 54 61 62 2d 3e 70  tDup(db, pTab->p
1d100 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
1d110 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
1d120 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
1d130 46 72 6f 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  From->pSelect);.
1d140 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1d150 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63     }..    /* Loc
1d160 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6e 61  ate the index na
1d170 6d 65 64 20 62 79 20 74 68 65 20 49 4e 44 45 58  med by the INDEX
1d180 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 69 66  ED BY clause, if
1d190 20 61 6e 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28   any. */.    if(
1d1a0 20 73 71 6c 69 74 65 33 49 6e 64 65 78 65 64 42   sqlite3IndexedB
1d1b0 79 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  yLookup(pParse, 
1d1c0 70 46 72 6f 6d 29 20 29 7b 0a 20 20 20 20 20 20  pFrom) ){.      
1d1d0 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1d1e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1d1f0 2a 20 50 72 6f 63 65 73 73 20 4e 41 54 55 52 41  * Process NATURA
1d200 4c 20 6b 65 79 77 6f 72 64 73 2c 20 61 6e 64 20  L keywords, and 
1d210 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61  ON and USING cla
1d220 75 73 65 73 20 6f 66 20 6a 6f 69 6e 73 2e 0a 20  uses of joins.. 
1d230 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
1d240 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 73 71  llocFailed || sq
1d250 6c 69 74 65 50 72 6f 63 65 73 73 4a 6f 69 6e 28  liteProcessJoin(
1d260 70 50 61 72 73 65 2c 20 70 29 20 29 7b 0a 20 20  pParse, p) ){.  
1d270 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
1d280 72 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  rt;.  }..  /* Fo
1d290 72 20 65 76 65 72 79 20 22 2a 22 20 74 68 61 74  r every "*" that
1d2a0 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 63   occurs in the c
1d2b0 6f 6c 75 6d 6e 20 6c 69 73 74 2c 20 69 6e 73 65  olumn list, inse
1d2c0 72 74 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  rt the names of.
1d2d0 20 20 2a 2a 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73    ** all columns
1d2e0 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73 2e 20   in all tables. 
1d2f0 20 41 6e 64 20 66 6f 72 20 65 76 65 72 79 20 54   And for every T
1d300 41 42 4c 45 2e 2a 20 69 6e 73 65 72 74 20 74 68  ABLE.* insert th
1d310 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20  e names.  ** of 
1d320 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 54  all columns in T
1d330 41 42 4c 45 2e 20 20 54 68 65 20 70 61 72 73 65  ABLE.  The parse
1d340 72 20 69 6e 73 65 72 74 65 64 20 61 20 73 70 65  r inserted a spe
1d350 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 0a  cial expression.
1d360 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 54 4b    ** with the TK
1d370 5f 41 4c 4c 20 6f 70 65 72 61 74 6f 72 20 66 6f  _ALL operator fo
1d380 72 20 65 61 63 68 20 22 2a 22 20 74 68 61 74 20  r each "*" that 
1d390 69 74 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  it found in the 
1d3a0 63 6f 6c 75 6d 6e 20 6c 69 73 74 2e 0a 20 20 2a  column list..  *
1d3b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1d3c0 63 6f 64 65 20 6a 75 73 74 20 68 61 73 20 74 6f  code just has to
1d3d0 20 6c 6f 63 61 74 65 20 74 68 65 20 54 4b 5f 41   locate the TK_A
1d3e0 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  LL expressions a
1d3f0 6e 64 20 65 78 70 61 6e 64 0a 20 20 2a 2a 20 65  nd expand.  ** e
1d400 61 63 68 20 6f 6e 65 20 74 6f 20 74 68 65 20 6c  ach one to the l
1d410 69 73 74 20 6f 66 20 61 6c 6c 20 63 6f 6c 75 6d  ist of all colum
1d420 6e 73 20 69 6e 20 61 6c 6c 20 74 61 62 6c 65 73  ns in all tables
1d430 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1d440 66 69 72 73 74 20 6c 6f 6f 70 20 6a 75 73 74 20  first loop just 
1d450 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
1d460 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 22   there are any "
1d470 2a 22 20 6f 70 65 72 61 74 6f 72 73 0a 20 20 2a  *" operators.  *
1d480 2a 20 74 68 61 74 20 6e 65 65 64 20 65 78 70 61  * that need expa
1d490 6e 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  nding..  */.  fo
1d4a0 72 28 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d  r(k=0; k<pEList-
1d4b0 3e 6e 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20  >nExpr; k++){.  
1d4c0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 45 4c    Expr *pE = pEL
1d4d0 69 73 74 2d 3e 61 5b 6b 5d 2e 70 45 78 70 72 3b  ist->a[k].pExpr;
1d4e0 0a 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  .    if( pE->op=
1d4f0 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b 3b  =TK_ALL ) break;
1d500 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d  .    assert( pE-
1d510 3e 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 70  >op!=TK_DOT || p
1d520 45 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  E->pRight!=0 );.
1d530 20 20 20 20 61 73 73 65 72 74 28 20 70 45 2d 3e      assert( pE->
1d540 6f 70 21 3d 54 4b 5f 44 4f 54 20 7c 7c 20 28 70  op!=TK_DOT || (p
1d550 45 2d 3e 70 4c 65 66 74 21 3d 30 20 26 26 20 70  E->pLeft!=0 && p
1d560 45 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  E->pLeft->op==TK
1d570 5f 49 44 29 20 29 3b 0a 20 20 20 20 69 66 28 20  _ID) );.    if( 
1d580 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 26  pE->op==TK_DOT &
1d590 26 20 70 45 2d 3e 70 52 69 67 68 74 2d 3e 6f 70  & pE->pRight->op
1d5a0 3d 3d 54 4b 5f 41 4c 4c 20 29 20 62 72 65 61 6b  ==TK_ALL ) break
1d5b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6b 3c 70 45  ;.  }.  if( k<pE
1d5c0 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
1d5d0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
1d5e0 77 65 20 67 65 74 20 68 65 72 65 20 69 74 20 6d  we get here it m
1d5f0 65 61 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  eans the result 
1d600 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  set contains one
1d610 20 6f 72 20 6d 6f 72 65 20 22 2a 22 0a 20 20 20   or more "*".   
1d620 20 2a 2a 20 6f 70 65 72 61 74 6f 72 73 20 74 68   ** operators th
1d630 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  at need to be ex
1d640 70 61 6e 64 65 64 2e 20 20 4c 6f 6f 70 20 74 68  panded.  Loop th
1d650 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
1d660 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 6e 20  ssion.    ** in 
1d670 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 61  the result set a
1d680 6e 64 20 65 78 70 61 6e 64 20 74 68 65 6d 20 6f  nd expand them o
1d690 6e 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ne by one..    *
1d6a0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  /.    struct Exp
1d6b0 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 20 3d 20  rList_item *a = 
1d6c0 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 45  pEList->a;.    E
1d6d0 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 20 3d 20  xprList *pNew = 
1d6e0 30 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  0;.    int flags
1d6f0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66   = pParse->db->f
1d700 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 6c 6f  lags;.    int lo
1d710 6e 67 4e 61 6d 65 73 20 3d 20 28 66 6c 61 67 73  ngNames = (flags
1d720 20 26 20 53 51 4c 49 54 45 5f 46 75 6c 6c 43 6f   & SQLITE_FullCo
1d730 6c 4e 61 6d 65 73 29 21 3d 30 0a 20 20 20 20 20  lNames)!=0.     
1d740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d750 20 26 26 20 28 66 6c 61 67 73 20 26 20 53 51 4c   && (flags & SQL
1d760 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
1d770 73 29 3d 3d 30 3b 0a 0a 20 20 20 20 66 6f 72 28  s)==0;..    for(
1d780 6b 3d 30 3b 20 6b 3c 70 45 4c 69 73 74 2d 3e 6e  k=0; k<pEList->n
1d790 45 78 70 72 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  Expr; k++){.    
1d7a0 20 20 45 78 70 72 20 2a 70 45 20 3d 20 61 5b 6b    Expr *pE = a[k
1d7b0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ].pExpr;.      a
1d7c0 73 73 65 72 74 28 20 70 45 2d 3e 6f 70 21 3d 54  ssert( pE->op!=T
1d7d0 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
1d7e0 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght!=0 );.      
1d7f0 69 66 28 20 70 45 2d 3e 6f 70 21 3d 54 4b 5f 41  if( pE->op!=TK_A
1d800 4c 4c 20 26 26 20 28 70 45 2d 3e 6f 70 21 3d 54  LL && (pE->op!=T
1d810 4b 5f 44 4f 54 20 7c 7c 20 70 45 2d 3e 70 52 69  K_DOT || pE->pRi
1d820 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4c 4c 29  ght->op!=TK_ALL)
1d830 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1d840 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20 65  his particular e
1d850 78 70 72 65 73 73 69 6f 6e 20 64 6f 65 73 20 6e  xpression does n
1d860 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 65 78  ot need to be ex
1d870 70 61 6e 64 65 64 2e 0a 20 20 20 20 20 20 20 20  panded..        
1d880 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
1d890 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1d8a0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
1d8b0 70 4e 65 77 2c 20 61 5b 6b 5d 2e 70 45 78 70 72  pNew, a[k].pExpr
1d8c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1d8d0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
1d8e0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
1d8f0 45 78 70 72 2d 31 5d 2e 7a 4e 61 6d 65 20 3d 20  Expr-1].zName = 
1d900 61 5b 6b 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[k].zName;.    
1d910 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e        pNew->a[pN
1d920 65 77 2d 3e 6e 45 78 70 72 2d 31 5d 2e 7a 53 70  ew->nExpr-1].zSp
1d930 61 6e 20 3d 20 61 5b 6b 5d 2e 7a 53 70 61 6e 3b  an = a[k].zSpan;
1d940 0a 20 20 20 20 20 20 20 20 20 20 61 5b 6b 5d 2e  .          a[k].
1d950 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
1d960 20 20 20 20 20 61 5b 6b 5d 2e 7a 53 70 61 6e 20       a[k].zSpan 
1d970 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
1d980 20 20 20 20 20 20 20 61 5b 6b 5d 2e 70 45 78 70         a[k].pExp
1d990 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  r = 0;.      }el
1d9a0 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
1d9b0 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69  his expression i
1d9c0 73 20 61 20 22 2a 22 20 6f 72 20 61 20 22 54 41  s a "*" or a "TA
1d9d0 42 4c 45 2e 2a 22 20 61 6e 64 20 6e 65 65 64 73  BLE.*" and needs
1d9e0 20 74 6f 20 62 65 0a 20 20 20 20 20 20 20 20 2a   to be.        *
1d9f0 2a 20 65 78 70 61 6e 64 65 64 2e 20 2a 2f 0a 20  * expanded. */. 
1da00 20 20 20 20 20 20 20 69 6e 74 20 74 61 62 6c 65         int table
1da10 53 65 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 2f  Seen = 0;      /
1da20 2a 20 53 65 74 20 74 6f 20 31 20 77 68 65 6e 20  * Set to 1 when 
1da30 54 41 42 4c 45 20 6d 61 74 63 68 65 73 20 2a 2f  TABLE matches */
1da40 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
1da50 54 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  TName;          
1da60 20 20 2f 2a 20 74 65 78 74 20 6f 66 20 6e 61 6d    /* text of nam
1da70 65 20 6f 66 20 54 41 42 4c 45 20 2a 2f 0a 20 20  e of TABLE */.  
1da80 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f 70        if( pE->op
1da90 3d 3d 54 4b 5f 44 4f 54 20 29 7b 0a 20 20 20 20  ==TK_DOT ){.    
1daa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1dab0 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ->pLeft!=0 );.  
1dac0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1dad0 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1dae0 28 70 45 2d 3e 70 4c 65 66 74 2c 20 45 50 5f 49  (pE->pLeft, EP_I
1daf0 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
1db00 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 70        zTName = p
1db10 45 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  E->pLeft->u.zTok
1db20 65 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  en;.        }els
1db30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 4e  e{.          zTN
1db40 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ame = 0;.       
1db50 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69   }.        for(i
1db60 3d 30 2c 20 70 46 72 6f 6d 3d 70 54 61 62 4c 69  =0, pFrom=pTabLi
1db70 73 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  st->a; i<pTabLis
1db80 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 46  t->nSrc; i++, pF
1db90 72 6f 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  rom++){.        
1dba0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1dbb0 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pFrom->pTab;.   
1dbc0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
1dbd0 62 4e 61 6d 65 20 3d 20 70 46 72 6f 6d 2d 3e 7a  bName = pFrom->z
1dbe0 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20  Alias;.         
1dbf0 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
1dc00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1dc10 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
1dc20 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
1dc30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1dc40 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1dc50 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ed ) break;.    
1dc60 20 20 20 20 20 20 69 66 28 20 7a 54 4e 61 6d 65        if( zTName
1dc70 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1dc80 6d 70 28 7a 54 4e 61 6d 65 2c 20 7a 54 61 62 4e  mp(zTName, zTabN
1dc90 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ame)!=0 ){.     
1dca0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1dcb0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1dcc0 20 20 20 20 20 20 20 74 61 62 6c 65 53 65 65 6e         tableSeen
1dcd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1dce0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
1dcf0 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
1dd00 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
1dd10 45 78 70 72 2c 20 2a 70 52 69 67 68 74 3b 0a 20  Expr, *pRight;. 
1dd20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
1dd30 2a 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 61  *zName = pTab->a
1dd40 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col[j].zName;.  
1dd50 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
1dd60 7a 43 6f 6c 6e 61 6d 65 3b 20 20 2f 2a 20 54 68  zColname;  /* Th
1dd70 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 6c 75 6d  e computed colum
1dd80 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
1dd90 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 46        char *zToF
1dda0 72 65 65 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ree;   /* Malloc
1ddb0 65 64 20 73 74 72 69 6e 67 20 74 68 61 74 20 6e  ed string that n
1ddc0 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
1ddd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1dde0 54 6f 6b 65 6e 20 73 43 6f 6c 6e 61 6d 65 3b 20  Token sColname; 
1ddf0 20 2f 2a 20 43 6f 6d 70 75 74 65 64 20 63 6f 6c   /* Computed col
1de00 75 6d 6e 20 6e 61 6d 65 20 61 73 20 61 20 74 6f  umn name as a to
1de10 6b 65 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  ken */..        
1de20 20 20 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75      /* If a colu
1de30 6d 6e 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  mn is marked as 
1de40 27 68 69 64 64 65 6e 27 20 28 63 75 72 72 65 6e  'hidden' (curren
1de50 74 6c 79 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c  tly only possibl
1de60 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1de70 20 66 6f 72 20 76 69 72 74 75 61 6c 20 74 61 62   for virtual tab
1de80 6c 65 73 29 2c 20 64 6f 20 6e 6f 74 20 69 6e 63  les), do not inc
1de90 6c 75 64 65 20 69 74 20 69 6e 20 74 68 65 20 65  lude it in the e
1dea0 78 70 61 6e 64 65 64 0a 20 20 20 20 20 20 20 20  xpanded.        
1deb0 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65      ** result-se
1dec0 74 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 20 20  t list..        
1ded0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
1dee0 20 20 20 69 66 28 20 49 73 48 69 64 64 65 6e 43     if( IsHiddenC
1def0 6f 6c 75 6d 6e 28 26 70 54 61 62 2d 3e 61 43 6f  olumn(&pTab->aCo
1df00 6c 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  l[j]) ){.       
1df10 20 20 20 20 20 20 20 61 73 73 65 72 74 28 49 73         assert(Is
1df20 56 69 72 74 75 61 6c 28 70 54 61 62 29 29 3b 0a  Virtual(pTab));.
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1df40 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1df50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
1df60 20 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 54     if( i>0 && zT
1df70 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
1df80 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 46           if( (pF
1df90 72 6f 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  rom->jointype & 
1dfa0 4a 54 5f 4e 41 54 55 52 41 4c 29 21 3d 30 0a 20  JT_NATURAL)!=0. 
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1dfc0 26 20 74 61 62 6c 65 41 6e 64 43 6f 6c 75 6d 6e  & tableAndColumn
1dfd0 49 6e 64 65 78 28 70 54 61 62 4c 69 73 74 2c 20  Index(pTabList, 
1dfe0 69 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 30 29 0a  i, zName, 0, 0).
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 7b                ){
1e000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e010 20 2f 2a 20 49 6e 20 61 20 4e 41 54 55 52 41 4c   /* In a NATURAL
1e020 20 6a 6f 69 6e 2c 20 6f 6d 69 74 20 74 68 65 20   join, omit the 
1e030 6a 6f 69 6e 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  join columns fro
1e040 6d 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  m the .         
1e050 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20         ** table 
1e060 74 6f 20 74 68 65 20 72 69 67 68 74 20 6f 66 20  to the right of 
1e070 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20 20 20 20  the join */.    
1e080 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
1e090 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
1e0a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e0b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
1e0c0 64 4c 69 73 74 49 6e 64 65 78 28 70 46 72 6f 6d  dListIndex(pFrom
1e0d0 2d 3e 70 55 73 69 6e 67 2c 20 7a 4e 61 6d 65 29  ->pUsing, zName)
1e0e0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
1e0f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 61 20 6a         /* In a j
1e100 6f 69 6e 20 77 69 74 68 20 61 20 55 53 49 4e 47  oin with a USING
1e110 20 63 6c 61 75 73 65 2c 20 6f 6d 69 74 20 63 6f   clause, omit co
1e120 6c 75 6d 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  lumns in the.   
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1e140 75 73 69 6e 67 20 63 6c 61 75 73 65 20 66 72 6f  using clause fro
1e150 6d 20 74 68 65 20 74 61 62 6c 65 20 6f 6e 20 74  m the table on t
1e160 68 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  he right. */.   
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1e180 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1e190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e1a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e1b0 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   pRight = sqlite
1e1c0 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 44 2c  3Expr(db, TK_ID,
1e1d0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
1e1e0 20 20 20 20 20 7a 43 6f 6c 6e 61 6d 65 20 3d 20       zColname = 
1e1f0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  zName;.         
1e200 20 20 20 7a 54 6f 46 72 65 65 20 3d 20 30 3b 0a     zToFree = 0;.
1e210 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e220 6c 6f 6e 67 4e 61 6d 65 73 20 7c 7c 20 70 54 61  longNames || pTa
1e230 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 31 20 29 7b  bList->nSrc>1 ){
1e240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  .              E
1e250 78 70 72 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  xpr *pLeft;.    
1e260 20 20 20 20 20 20 20 20 20 20 70 4c 65 66 74 20            pLeft 
1e270 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
1e280 2c 20 54 4b 5f 49 44 2c 20 7a 54 61 62 4e 61 6d  , TK_ID, zTabNam
1e290 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1e2a0 20 20 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65    pExpr = sqlite
1e2b0 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1e2c0 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
1e2d0 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
1e2e0 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 6e 67          if( long
1e2f0 4e 61 6d 65 73 20 29 7b 0a 20 20 20 20 20 20 20  Names ){.       
1e300 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 6e 61 6d           zColnam
1e310 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
1e320 74 66 28 64 62 2c 20 22 25 73 2e 25 73 22 2c 20  tf(db, "%s.%s", 
1e330 7a 54 61 62 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  zTabName, zName)
1e340 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e350 20 20 7a 54 6f 46 72 65 65 20 3d 20 7a 43 6f 6c    zToFree = zCol
1e360 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  name;.          
1e370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e390 20 20 20 20 20 20 20 70 45 78 70 72 20 3d 20 70         pExpr = p
1e3a0 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
1e3b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e3c0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45   pNew = sqlite3E
1e3d0 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
1e3e0 61 72 73 65 2c 20 70 4e 65 77 2c 20 70 45 78 70  arse, pNew, pExp
1e3f0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
1e400 73 43 6f 6c 6e 61 6d 65 2e 7a 20 3d 20 7a 43 6f  sColname.z = zCo
1e410 6c 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  lname;.         
1e420 20 20 20 73 43 6f 6c 6e 61 6d 65 2e 6e 20 3d 20     sColname.n = 
1e430 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1e440 7a 43 6f 6c 6e 61 6d 65 29 3b 0a 20 20 20 20 20  zColname);.     
1e450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1e460 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
1e470 61 72 73 65 2c 20 70 4e 65 77 2c 20 26 73 43 6f  arse, pNew, &sCo
1e480 6c 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  lname, 0);.     
1e490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
1e4a0 46 72 65 65 28 64 62 2c 20 7a 54 6f 46 72 65 65  Free(db, zToFree
1e4b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1e4c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e4d0 20 69 66 28 20 21 74 61 62 6c 65 53 65 65 6e 20   if( !tableSeen 
1e4e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1e4f0 20 7a 54 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20   zTName ){.     
1e500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1e510 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1e520 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 3a 20 25  no such table: %
1e530 73 22 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20  s", zTName);.   
1e540 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e550 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e560 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1e570 2c 20 22 6e 6f 20 74 61 62 6c 65 73 20 73 70 65  , "no tables spe
1e580 63 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 20  cified");.      
1e590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1e5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e5b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1e5c0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 45 4c 69  tDelete(db, pELi
1e5d0 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 45 4c 69  st);.    p->pELi
1e5e0 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 23  st = pNew;.  }.#
1e5f0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
1e600 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 70 45  LUMN.  if( p->pE
1e610 4c 69 73 74 20 26 26 20 70 2d 3e 70 45 4c 69 73  List && p->pELis
1e620 74 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  t->nExpr>db->aLi
1e630 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
1e640 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
1e650 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1e660 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
1e670 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 72 65 73  y columns in res
1e680 75 6c 74 20 73 65 74 22 29 3b 0a 20 20 7d 0a 23  ult set");.  }.#
1e690 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 57  endif.  return W
1e6a0 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
1e6b0 2f 2a 0a 2a 2a 20 4e 6f 2d 6f 70 20 72 6f 75 74  /*.** No-op rout
1e6c0 69 6e 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ine for the pars
1e6d0 65 2d 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a  e-tree walker..*
1e6e0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
1e6f0 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 57 61  outine is the Wa
1e700 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61  lker.xExprCallba
1e710 63 6b 20 74 68 65 6e 20 65 78 70 72 65 73 73 69  ck then expressi
1e720 6f 6e 20 74 72 65 65 73 0a 2a 2a 20 61 72 65 20  on trees.** are 
1e730 77 61 6c 6b 65 64 20 77 69 74 68 6f 75 74 20 61  walked without a
1e740 6e 79 20 61 63 74 69 6f 6e 73 20 62 65 69 6e 67  ny actions being
1e750 20 74 61 6b 65 6e 20 61 74 20 65 61 63 68 20 6e   taken at each n
1e760 6f 64 65 2e 20 20 50 72 65 73 75 6d 61 62 6c 79  ode.  Presumably
1e770 2c 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  ,.** when this r
1e780 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1e790 6f 72 20 57 61 6c 6b 65 72 2e 78 45 78 70 72 43  or Walker.xExprC
1e7a0 61 6c 6c 62 61 63 6b 20 74 68 65 6e 20 0a 2a 2a  allback then .**
1e7b0 20 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43   Walker.xSelectC
1e7c0 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 74 20 74  allback is set t
1e7d0 6f 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 75  o do something u
1e7e0 73 65 66 75 6c 20 66 6f 72 20 65 76 65 72 79 20  seful for every 
1e7f0 0a 2a 2a 20 73 75 62 71 75 65 72 79 20 69 6e 20  .** subquery in 
1e800 74 68 65 20 70 61 72 73 65 72 20 74 72 65 65 2e  the parser tree.
1e810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
1e820 78 70 72 57 61 6c 6b 4e 6f 6f 70 28 57 61 6c 6b  xprWalkNoop(Walk
1e830 65 72 20 2a 4e 6f 74 55 73 65 64 2c 20 45 78 70  er *NotUsed, Exp
1e840 72 20 2a 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  r *NotUsed2){.  
1e850 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1e860 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
1e870 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ed2);.  return W
1e880 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
1e890 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1e8a0 6e 65 20 22 65 78 70 61 6e 64 73 22 20 61 20 53  ne "expands" a S
1e8b0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1e8c0 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 73  and all of its s
1e8d0 75 62 71 75 65 72 69 65 73 2e 0a 2a 2a 20 46 6f  ubqueries..** Fo
1e8e0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
1e8f0 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 77 68 61 74  ormation on what
1e900 20 69 74 20 6d 65 61 6e 73 20 74 6f 20 22 65 78   it means to "ex
1e910 70 61 6e 64 22 20 61 20 53 45 4c 45 43 54 0a 2a  pand" a SELECT.*
1e920 2a 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 65  * statement, see
1e930 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
1e940 74 68 65 20 73 65 6c 65 63 74 45 78 70 61 6e 64  the selectExpand
1e950 20 77 6f 72 6b 65 72 20 63 61 6c 6c 62 61 63 6b   worker callback
1e960 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 45 78   above..**.** Ex
1e970 70 61 6e 64 69 6e 67 20 61 20 53 45 4c 45 43 54  panding a SELECT
1e980 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 74 68   statement is th
1e990 65 20 66 69 72 73 74 20 73 74 65 70 20 69 6e 20  e first step in 
1e9a0 70 72 6f 63 65 73 73 69 6e 67 20 61 0a 2a 2a 20  processing a.** 
1e9b0 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1e9c0 2e 20 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  .  The SELECT st
1e9d0 61 74 65 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  atement must be 
1e9e0 65 78 70 61 6e 64 65 64 20 62 65 66 6f 72 65 0a  expanded before.
1e9f0 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69  ** name resoluti
1ea00 6f 6e 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  on is performed.
1ea10 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69  .**.** If anythi
1ea20 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 61  ng goes wrong, a
1ea30 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
1ea40 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1ea50 70 50 61 72 73 65 2e 0a 2a 2a 20 54 68 65 20 63  pParse..** The c
1ea60 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  alling function 
1ea70 63 61 6e 20 64 65 74 65 63 74 20 74 68 65 20 70  can detect the p
1ea80 72 6f 62 6c 65 6d 20 62 79 20 6c 6f 6f 6b 69 6e  roblem by lookin
1ea90 67 20 61 74 20 70 50 61 72 73 65 2d 3e 6e 45 72  g at pParse->nEr
1eaa0 72 0a 2a 2a 20 61 6e 64 2f 6f 72 20 70 50 61 72  r.** and/or pPar
1eab0 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1eac0 69 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iled..*/.static 
1ead0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1eae0 63 74 45 78 70 61 6e 64 28 50 61 72 73 65 20 2a  ctExpand(Parse *
1eaf0 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a  pParse, Select *
1eb00 70 53 65 6c 65 63 74 29 7b 0a 20 20 57 61 6c 6b  pSelect){.  Walk
1eb10 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c 65 63  er w;.  w.xSelec
1eb20 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65 6c 65  tCallback = sele
1eb30 63 74 45 78 70 61 6e 64 65 72 3b 0a 20 20 77 2e  ctExpander;.  w.
1eb40 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
1eb50 65 78 70 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20  exprWalkNoop;.  
1eb60 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
1eb70 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  e;.  sqlite3Walk
1eb80 53 65 6c 65 63 74 28 26 77 2c 20 70 53 65 6c 65  Select(&w, pSele
1eb90 63 74 29 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  ct);.}...#ifndef
1eba0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
1ebb0 51 55 45 52 59 0a 2f 2a 0a 2a 2a 20 54 68 69 73  QUERY./*.** This
1ebc0 20 69 73 20 61 20 57 61 6c 6b 65 72 2e 78 53 65   is a Walker.xSe
1ebd0 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 63 61 6c  lectCallback cal
1ebe0 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
1ebf0 6c 69 74 65 33 53 65 6c 65 63 74 54 79 70 65 49  lite3SelectTypeI
1ec00 6e 66 6f 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  nfo().** interfa
1ec10 63 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 61  ce..**.** For ea
1ec20 63 68 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 73  ch FROM-clause s
1ec30 75 62 71 75 65 72 79 2c 20 61 64 64 20 43 6f 6c  ubquery, add Col
1ec40 75 6d 6e 2e 7a 54 79 70 65 20 61 6e 64 20 43 6f  umn.zType and Co
1ec50 6c 75 6d 6e 2e 7a 43 6f 6c 6c 0a 2a 2a 20 69 6e  lumn.zColl.** in
1ec60 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 65  formation to the
1ec70 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
1ec80 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 73   that represents
1ec90 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 0a   the result set.
1eca0 2a 2a 20 6f 66 20 74 68 61 74 20 73 75 62 71 75  ** of that subqu
1ecb0 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54  ery..**.** The T
1ecc0 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74  able structure t
1ecd0 68 61 74 20 72 65 70 72 65 73 65 6e 74 73 20 74  hat represents t
1ece0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 77 61  he result set wa
1ecf0 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 2a 2a  s constructed.**
1ed00 20 62 79 20 73 65 6c 65 63 74 45 78 70 61 6e 64   by selectExpand
1ed10 65 72 28 29 20 62 75 74 20 74 68 65 20 74 79 70  er() but the typ
1ed20 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  e and collation 
1ed30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 61 73 20  information was 
1ed40 6f 6d 69 74 74 65 64 0a 2a 2a 20 61 74 20 74 68  omitted.** at th
1ed50 61 74 20 70 6f 69 6e 74 20 62 65 63 61 75 73 65  at point because
1ed60 20 69 64 65 6e 74 69 66 69 65 72 73 20 68 61 64   identifiers had
1ed70 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 72 65   not yet been re
1ed80 73 6f 6c 76 65 64 2e 20 20 54 68 69 73 0a 2a 2a  solved.  This.**
1ed90 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1eda0 65 64 20 61 66 74 65 72 20 69 64 65 6e 74 69 66  ed after identif
1edb0 69 65 72 20 72 65 73 6f 6c 75 74 69 6f 6e 2e 0a  ier resolution..
1edc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1edd0 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
1ede0 79 70 65 49 6e 66 6f 28 57 61 6c 6b 65 72 20 2a  ypeInfo(Walker *
1edf0 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
1ee00 2a 70 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  *p){.  Parse *pP
1ee10 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  arse;.  int i;. 
1ee20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1ee30 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  st;.  struct Src
1ee40 4c 69 73 74 5f 69 74 65 6d 20 2a 70 46 72 6f 6d  List_item *pFrom
1ee50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
1ee60 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
1ee70 73 6f 6c 76 65 64 20 29 3b 0a 20 20 69 66 28 20  solved );.  if( 
1ee80 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
1ee90 46 5f 48 61 73 54 79 70 65 49 6e 66 6f 29 3d 3d  F_HasTypeInfo)==
1eea0 30 20 29 7b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  0 ){.    p->selF
1eeb0 6c 61 67 73 20 7c 3d 20 53 46 5f 48 61 73 54 79  lags |= SF_HasTy
1eec0 70 65 49 6e 66 6f 3b 0a 20 20 20 20 70 50 61 72  peInfo;.    pPar
1eed0 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
1eee0 61 72 73 65 3b 0a 20 20 20 20 70 54 61 62 4c 69  arse;.    pTabLi
1eef0 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
1ef00 20 20 66 6f 72 28 69 3d 30 2c 20 70 46 72 6f 6d    for(i=0, pFrom
1ef10 3d 70 54 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pTabList->a; i<
1ef20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1ef30 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b 0a 20  i++, pFrom++){. 
1ef40 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
1ef50 20 3d 20 70 46 72 6f 6d 2d 3e 70 54 61 62 3b 0a   = pFrom->pTab;.
1ef60 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
1ef70 28 70 54 61 62 21 3d 30 29 20 26 26 20 28 70 54  (pTab!=0) && (pT
1ef80 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
1ef90 46 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20  F_Ephemeral)!=0 
1efa0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ){.        /* A 
1efb0 73 75 62 2d 71 75 65 72 79 20 69 6e 20 74 68 65  sub-query in the
1efc0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
1efd0 61 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 20 20  a SELECT */.    
1efe0 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
1eff0 20 3d 20 70 46 72 6f 6d 2d 3e 70 53 65 6c 65 63   = pFrom->pSelec
1f000 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  t;.        asser
1f010 74 28 20 70 53 65 6c 20 29 3b 0a 20 20 20 20 20  t( pSel );.     
1f020 20 20 20 77 68 69 6c 65 28 20 70 53 65 6c 2d 3e     while( pSel->
1f030 70 50 72 69 6f 72 20 29 20 70 53 65 6c 20 3d 20  pPrior ) pSel = 
1f040 70 53 65 6c 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  pSel->pPrior;.  
1f050 20 20 20 20 20 20 73 65 6c 65 63 74 41 64 64 43        selectAddC
1f060 6f 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c  olumnTypeAndColl
1f070 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54  ation(pParse, pT
1f080 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 2d 3e  ab->nCol, pTab->
1f090 61 43 6f 6c 2c 20 70 53 65 6c 29 3b 0a 20 20 20  aCol, pSel);.   
1f0a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1f0b0 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
1f0c0 69 6e 75 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  inue;.}.#endif..
1f0d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f0e0 69 6e 65 20 61 64 64 73 20 64 61 74 61 74 79 70  ine adds datatyp
1f0f0 65 20 61 6e 64 20 63 6f 6c 6c 61 74 69 6e 67 20  e and collating 
1f100 73 65 71 75 65 6e 63 65 20 69 6e 66 6f 72 6d 61  sequence informa
1f110 74 69 6f 6e 20 74 6f 0a 2a 2a 20 74 68 65 20 54  tion to.** the T
1f120 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 73 20  able structures 
1f130 6f 66 20 61 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75  of all FROM-clau
1f140 73 65 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  se subqueries in
1f150 20 61 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61   a.** SELECT sta
1f160 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 55 73  tement..**.** Us
1f170 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  e this routine a
1f180 66 74 65 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75  fter name resolu
1f190 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1f1a0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65  void sqlite3Sele
1f1b0 63 74 41 64 64 54 79 70 65 49 6e 66 6f 28 50 61  ctAddTypeInfo(Pa
1f1c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
1f1d0 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 23  ect *pSelect){.#
1f1e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f1f0 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 57 61  IT_SUBQUERY.  Wa
1f200 6c 6b 65 72 20 77 3b 0a 20 20 77 2e 78 53 65 6c  lker w;.  w.xSel
1f210 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 73 65  ectCallback = se
1f220 6c 65 63 74 41 64 64 53 75 62 71 75 65 72 79 54  lectAddSubqueryT
1f230 79 70 65 49 6e 66 6f 3b 0a 20 20 77 2e 78 45 78  ypeInfo;.  w.xEx
1f240 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70  prCallback = exp
1f250 72 57 61 6c 6b 4e 6f 6f 70 3b 0a 20 20 77 2e 70  rWalkNoop;.  w.p
1f260 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
1f270 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
1f280 65 63 74 28 26 77 2c 20 70 53 65 6c 65 63 74 29  ect(&w, pSelect)
1f290 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
1f2a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f2b0 73 65 74 73 20 75 70 20 61 20 53 45 4c 45 43 54  sets up a SELECT
1f2c0 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 70   statement for p
1f2d0 72 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 0a  rocessing.  The.
1f2e0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  ** following is 
1f2f0 61 63 63 6f 6d 70 6c 69 73 68 65 64 3a 0a 2a 2a  accomplished:.**
1f300 0a 2a 2a 20 20 20 20 20 2a 20 20 56 44 42 45 20  .**     *  VDBE 
1f310 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61  Cursor numbers a
1f320 72 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  re assigned to a
1f330 6c 6c 20 46 52 4f 4d 2d 63 6c 61 75 73 65 20 74  ll FROM-clause t
1f340 65 72 6d 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20  erms..**     *  
1f350 45 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  Ephemeral Table 
1f360 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
1f370 74 65 64 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d  ted for all FROM
1f380 2d 63 6c 61 75 73 65 20 73 75 62 71 75 65 72 69  -clause subqueri
1f390 65 73 2e 0a 2a 2a 20 20 20 20 20 2a 20 20 4f 4e  es..**     *  ON
1f3a0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1f3b0 65 73 20 61 72 65 20 73 68 69 66 74 65 64 20 69  es are shifted i
1f3c0 6e 74 6f 20 57 48 45 52 45 20 73 74 61 74 65 6d  nto WHERE statem
1f3d0 65 6e 74 73 0a 2a 2a 20 20 20 20 20 2a 20 20 57  ents.**     *  W
1f3e0 69 6c 64 63 61 72 64 73 20 22 2a 22 20 61 6e 64  ildcards "*" and
1f3f0 20 22 54 41 42 4c 45 2e 2a 22 20 69 6e 20 72 65   "TABLE.*" in re
1f400 73 75 6c 74 20 73 65 74 73 20 61 72 65 20 65 78  sult sets are ex
1f410 70 61 6e 64 65 64 2e 0a 2a 2a 20 20 20 20 20 2a  panded..**     *
1f420 20 20 49 64 65 6e 74 69 66 69 65 72 73 20 69 6e    Identifiers in
1f430 20 65 78 70 72 65 73 73 69 6f 6e 20 61 72 65 20   expression are 
1f440 6d 61 74 63 68 65 64 20 74 6f 20 74 61 62 6c 65  matched to table
1f450 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1f460 75 74 69 6e 65 20 61 63 74 73 20 72 65 63 75 72  utine acts recur
1f470 73 69 76 65 6c 79 20 6f 6e 20 61 6c 6c 20 73 75  sively on all su
1f480 62 71 75 65 72 69 65 73 20 77 69 74 68 69 6e 20  bqueries within 
1f490 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
1f4a0 6f 69 64 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oid sqlite3Selec
1f4b0 74 50 72 65 70 28 0a 20 20 50 61 72 73 65 20 2a  tPrep(.  Parse *
1f4c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1f4d0 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
1f4e0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ntext */.  Selec
1f4f0 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
1f500 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
1f510 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
1f520 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65  coded. */.  Name
1f530 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
1f540 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65  C  /* Name conte
1f550 78 74 20 66 6f 72 20 63 6f 6e 74 61 69 6e 65 72  xt for container
1f560 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
1f570 20 2a 64 62 3b 0a 20 20 69 66 28 20 4e 45 56 45   *db;.  if( NEVE
1f580 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(p==0) ) return
1f590 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1f5a0 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65  >db;.  if( p->se
1f5b0 6c 46 6c 61 67 73 20 26 20 53 46 5f 48 61 73 54  lFlags & SF_HasT
1f5c0 79 70 65 49 6e 66 6f 20 29 20 72 65 74 75 72 6e  ypeInfo ) return
1f5d0 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
1f5e0 74 45 78 70 61 6e 64 28 70 50 61 72 73 65 2c 20  tExpand(pParse, 
1f5f0 70 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  p);.  if( pParse
1f600 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1f610 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1f620 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  urn;.  sqlite3Re
1f630 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
1f640 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74  (pParse, p, pOut
1f650 65 72 4e 43 29 3b 0a 20 20 69 66 28 20 70 50 61  erNC);.  if( pPa
1f660 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1f670 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1f680 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65  return;.  sqlite
1f690 33 53 65 6c 65 63 74 41 64 64 54 79 70 65 49 6e  3SelectAddTypeIn
1f6a0 66 6f 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 7d  fo(pParse, p);.}
1f6b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
1f6c0 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63 75  e aggregate accu
1f6d0 6d 75 6c 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  mulator..**.** T
1f6e0 68 65 20 61 67 67 72 65 67 61 74 65 20 61 63 63  he aggregate acc
1f6f0 75 6d 75 6c 61 74 6f 72 20 69 73 20 61 20 73 65  umulator is a se
1f700 74 20 6f 66 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  t of memory cell
1f710 73 20 74 68 61 74 20 68 6f 6c 64 0a 2a 2a 20 69  s that hold.** i
1f720 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
1f730 6c 74 73 20 77 68 69 6c 65 20 63 61 6c 63 75 6c  lts while calcul
1f740 61 74 69 6e 67 20 61 6e 20 61 67 67 72 65 67 61  ating an aggrega
1f750 74 65 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75  te.  This.** rou
1f760 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63  tine generates c
1f770 6f 64 65 20 74 68 61 74 20 73 74 6f 72 65 73 20  ode that stores 
1f780 4e 55 4c 4c 73 20 69 6e 20 61 6c 6c 20 6f 66 20  NULLs in all of 
1f790 74 68 6f 73 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  those memory.** 
1f7a0 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cells..*/.static
1f7b0 20 76 6f 69 64 20 72 65 73 65 74 41 63 63 75 6d   void resetAccum
1f7c0 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a 70 50  ulator(Parse *pP
1f7d0 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a 70  arse, AggInfo *p
1f7e0 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65  AggInfo){.  Vdbe
1f7f0 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1f800 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
1f810 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f 66  struct AggInfo_f
1f820 75 6e 63 20 2a 70 46 75 6e 63 3b 0a 20 20 69 66  unc *pFunc;.  if
1f830 28 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e  ( pAggInfo->nFun
1f840 63 2b 70 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c  c+pAggInfo->nCol
1f850 75 6d 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  umn==0 ){.    re
1f860 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  turn;.  }.  for(
1f870 69 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d  i=0; i<pAggInfo-
1f880 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
1f890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f8a0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
1f8b0 2c 20 30 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 61  , 0, pAggInfo->a
1f8c0 43 6f 6c 5b 69 5d 2e 69 4d 65 6d 29 3b 0a 20 20  Col[i].iMem);.  
1f8d0 7d 0a 20 20 66 6f 72 28 70 46 75 6e 63 3d 70 41  }.  for(pFunc=pA
1f8e0 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 2c 20 69  ggInfo->aFunc, i
1f8f0 3d 30 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e  =0; i<pAggInfo->
1f900 6e 46 75 6e 63 3b 20 69 2b 2b 2c 20 70 46 75 6e  nFunc; i++, pFun
1f910 63 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  c++){.    sqlite
1f920 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1f930 50 5f 4e 75 6c 6c 2c 20 30 2c 20 70 46 75 6e 63  P_Null, 0, pFunc
1f940 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 69 66 28  ->iMem);.    if(
1f950 20 70 46 75 6e 63 2d 3e 69 44 69 73 74 69 6e 63   pFunc->iDistinc
1f960 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  t>=0 ){.      Ex
1f970 70 72 20 2a 70 45 20 3d 20 70 46 75 6e 63 2d 3e  pr *pE = pFunc->
1f980 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
1f990 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1f9a0 70 65 72 74 79 28 70 45 2c 20 45 50 5f 78 49 73  perty(pE, EP_xIs
1f9b0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
1f9c0 20 69 66 28 20 70 45 2d 3e 78 2e 70 4c 69 73 74   if( pE->x.pList
1f9d0 3d 3d 30 20 7c 7c 20 70 45 2d 3e 78 2e 70 4c 69  ==0 || pE->x.pLi
1f9e0 73 74 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  st->nExpr!=1 ){.
1f9f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1fa00 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1fa10 22 44 49 53 54 49 4e 43 54 20 61 67 67 72 65 67  "DISTINCT aggreg
1fa20 61 74 65 73 20 6d 75 73 74 20 68 61 76 65 20 65  ates must have e
1fa30 78 61 63 74 6c 79 20 6f 6e 65 20 22 0a 20 20 20  xactly one ".   
1fa40 20 20 20 20 20 20 20 20 22 61 72 67 75 6d 65 6e          "argumen
1fa50 74 22 29 3b 0a 20 20 20 20 20 20 20 20 70 46 75  t");.        pFu
1fa60 6e 63 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d 20  nc->iDistinct = 
1fa70 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1fa80 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  .        KeyInfo
1fa90 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79   *pKeyInfo = key
1faa0 49 6e 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74  InfoFromExprList
1fab0 28 70 50 61 72 73 65 2c 20 70 45 2d 3e 78 2e 70  (pParse, pE->x.p
1fac0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 73  List);.        s
1fad0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1fae0 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  (v, OP_OpenEphem
1faf0 65 72 61 6c 2c 20 70 46 75 6e 63 2d 3e 69 44 69  eral, pFunc->iDi
1fb00 73 74 69 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20  stinct, 0, 0,.  
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
1fb30 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49  KeyInfo, P4_KEYI
1fb40 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20  NFO_HANDOFF);.  
1fb50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1fb60 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
1fb70 74 68 65 20 4f 50 5f 41 67 67 46 69 6e 61 6c 69  the OP_AggFinali
1fb80 7a 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 65 76  ze opcode for ev
1fb90 65 72 79 20 61 67 67 72 65 67 61 74 65 20 66 75  ery aggregate fu
1fba0 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  nction.** in the
1fbb0 20 41 67 67 49 6e 66 6f 20 73 74 72 75 63 74 75   AggInfo structu
1fbc0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  re..*/.static vo
1fbd0 69 64 20 66 69 6e 61 6c 69 7a 65 41 67 67 46 75  id finalizeAggFu
1fbe0 6e 63 74 69 6f 6e 73 28 50 61 72 73 65 20 2a 70  nctions(Parse *p
1fbf0 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20 2a  Parse, AggInfo *
1fc00 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64 62  pAggInfo){.  Vdb
1fc10 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1fc20 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Vdbe;.  int i;. 
1fc30 20 73 74 72 75 63 74 20 41 67 67 49 6e 66 6f 5f   struct AggInfo_
1fc40 66 75 6e 63 20 2a 70 46 3b 0a 20 20 66 6f 72 28  func *pF;.  for(
1fc50 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e 66 6f  i=0, pF=pAggInfo
1fc60 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67 67 49  ->aFunc; i<pAggI
1fc70 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b 2b 2c  nfo->nFunc; i++,
1fc80 20 70 46 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72   pF++){.    Expr
1fc90 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 46  List *pList = pF
1fca0 2d 3e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ->pExpr->x.pList
1fcb0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
1fcc0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1fcd0 46 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  F->pExpr, EP_xIs
1fce0 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 73  Select) );.    s
1fcf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1fd00 28 76 2c 20 4f 50 5f 41 67 67 46 69 6e 61 6c 2c  (v, OP_AggFinal,
1fd10 20 70 46 2d 3e 69 4d 65 6d 2c 20 70 4c 69 73 74   pF->iMem, pList
1fd20 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
1fd30 3a 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  : 0, 0,.        
1fd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
1fd50 6f 69 64 2a 29 70 46 2d 3e 70 46 75 6e 63 2c 20  oid*)pF->pFunc, 
1fd60 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 7d  P4_FUNCDEF);.  }
1fd70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 70 64 61 74 65  .}../*.** Update
1fd80 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72   the accumulator
1fd90 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f   memory cells fo
1fda0 72 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 62  r an aggregate b
1fdb0 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  ased on.** the c
1fdc0 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f  urrent cursor po
1fdd0 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  sition..*/.stati
1fde0 63 20 76 6f 69 64 20 75 70 64 61 74 65 41 63 63  c void updateAcc
1fdf0 75 6d 75 6c 61 74 6f 72 28 50 61 72 73 65 20 2a  umulator(Parse *
1fe00 70 50 61 72 73 65 2c 20 41 67 67 49 6e 66 6f 20  pParse, AggInfo 
1fe10 2a 70 41 67 67 49 6e 66 6f 29 7b 0a 20 20 56 64  *pAggInfo){.  Vd
1fe20 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1fe30 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVdbe;.  int i;.
1fe40 20 20 69 6e 74 20 72 65 67 48 69 74 20 3d 20 30    int regHit = 0
1fe50 3b 0a 20 20 69 6e 74 20 61 64 64 72 48 69 74 54  ;.  int addrHitT
1fe60 65 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63  est = 0;.  struc
1fe70 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63 20 2a  t AggInfo_func *
1fe80 70 46 3b 0a 20 20 73 74 72 75 63 74 20 41 67 67  pF;.  struct Agg
1fe90 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 3b 0a 0a 20  Info_col *pC;.. 
1fea0 20 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63   pAggInfo->direc
1feb0 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 73 71 6c  tMode = 1;.  sql
1fec0 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65  ite3ExprCacheCle
1fed0 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 66 6f  ar(pParse);.  fo
1fee0 72 28 69 3d 30 2c 20 70 46 3d 70 41 67 67 49 6e  r(i=0, pF=pAggIn
1fef0 66 6f 2d 3e 61 46 75 6e 63 3b 20 69 3c 70 41 67  fo->aFunc; i<pAg
1ff00 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69 2b  gInfo->nFunc; i+
1ff10 2b 2c 20 70 46 2b 2b 29 7b 0a 20 20 20 20 69 6e  +, pF++){.    in
1ff20 74 20 6e 41 72 67 3b 0a 20 20 20 20 69 6e 74 20  t nArg;.    int 
1ff30 61 64 64 72 4e 65 78 74 20 3d 20 30 3b 0a 20 20  addrNext = 0;.  
1ff40 20 20 69 6e 74 20 72 65 67 41 67 67 3b 0a 20 20    int regAgg;.  
1ff50 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
1ff60 74 20 3d 20 70 46 2d 3e 70 45 78 70 72 2d 3e 78  t = pF->pExpr->x
1ff70 2e 70 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  .pList;.    asse
1ff80 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
1ff90 65 72 74 79 28 70 46 2d 3e 70 45 78 70 72 2c 20  erty(pF->pExpr, 
1ffa0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
1ffb0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
1ffc0 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 70  {.      nArg = p
1ffd0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
1ffe0 20 20 20 72 65 67 41 67 67 20 3d 20 73 71 6c 69     regAgg = sqli
1fff0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
20000 70 50 61 72 73 65 2c 20 6e 41 72 67 29 3b 0a 20  pParse, nArg);. 
20010 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
20020 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
20030 72 73 65 2c 20 70 4c 69 73 74 2c 20 72 65 67 41  rse, pList, regA
20040 67 67 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73  gg, 1);.    }els
20050 65 7b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20  e{.      nArg = 
20060 30 3b 0a 20 20 20 20 20 20 72 65 67 41 67 67 20  0;.      regAgg 
20070 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
20080 66 28 20 70 46 2d 3e 69 44 69 73 74 69 6e 63 74  f( pF->iDistinct
20090 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 64 64  >=0 ){.      add
200a0 72 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33 56  rNext = sqlite3V
200b0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
200c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
200d0 41 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Arg==1 );.      
200e0 63 6f 64 65 44 69 73 74 69 6e 63 74 28 70 50 61  codeDistinct(pPa
200f0 72 73 65 2c 20 70 46 2d 3e 69 44 69 73 74 69 6e  rse, pF->iDistin
20100 63 74 2c 20 61 64 64 72 4e 65 78 74 2c 20 31 2c  ct, addrNext, 1,
20110 20 72 65 67 41 67 67 29 3b 0a 20 20 20 20 7d 0a   regAgg);.    }.
20120 20 20 20 20 69 66 28 20 70 46 2d 3e 70 46 75 6e      if( pF->pFun
20130 63 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  c->flags & SQLIT
20140 45 5f 46 55 4e 43 5f 4e 45 45 44 43 4f 4c 4c 20  E_FUNC_NEEDCOLL 
20150 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  ){.      CollSeq
20160 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
20170 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
20180 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
20190 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
201a0 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
201b0 21 3d 30 20 29 3b 20 20 2f 2a 20 70 4c 69 73 74  !=0 );  /* pList
201c0 21 3d 30 20 69 66 20 70 46 2d 3e 70 46 75 6e 63  !=0 if pF->pFunc
201d0 20 68 61 73 20 4e 45 45 44 43 4f 4c 4c 20 2a 2f   has NEEDCOLL */
201e0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
201f0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
20200 21 70 43 6f 6c 6c 20 26 26 20 6a 3c 6e 41 72 67  !pColl && j<nArg
20210 3b 20 6a 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; j++, pItem++){
20220 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  .        pColl =
20230 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
20240 53 65 71 28 70 50 61 72 73 65 2c 20 70 49 74 65  Seq(pParse, pIte
20250 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
20260 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 43   }.      if( !pC
20270 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  oll ){.        p
20280 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
20290 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
202a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
202b0 72 65 67 48 69 74 3d 3d 30 20 26 26 20 70 41 67  regHit==0 && pAg
202c0 67 49 6e 66 6f 2d 3e 6e 41 63 63 75 6d 75 6c 61  gInfo->nAccumula
202d0 74 6f 72 20 29 20 72 65 67 48 69 74 20 3d 20 2b  tor ) regHit = +
202e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
202f0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
20300 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 43 6f 6c  AddOp4(v, OP_Col
20310 6c 53 65 71 2c 20 72 65 67 48 69 74 2c 20 30 2c  lSeq, regHit, 0,
20320 20 30 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c   0, (char *)pCol
20330 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 29 3b 0a  l, P4_COLLSEQ);.
20340 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
20350 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
20360 50 5f 41 67 67 53 74 65 70 2c 20 30 2c 20 72 65  P_AggStep, 0, re
20370 67 41 67 67 2c 20 70 46 2d 3e 69 4d 65 6d 2c 0a  gAgg, pF->iMem,.
20380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20390 20 20 20 20 20 20 28 76 6f 69 64 2a 29 70 46 2d        (void*)pF-
203a0 3e 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  >pFunc, P4_FUNCD
203b0 45 46 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EF);.    sqlite3
203c0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
203d0 28 75 38 29 6e 41 72 67 29 3b 0a 20 20 20 20 73  (u8)nArg);.    s
203e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41  qlite3ExprCacheA
203f0 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50  ffinityChange(pP
20400 61 72 73 65 2c 20 72 65 67 41 67 67 2c 20 6e 41  arse, regAgg, nA
20410 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rg);.    sqlite3
20420 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65  ReleaseTempRange
20430 28 70 50 61 72 73 65 2c 20 72 65 67 41 67 67 2c  (pParse, regAgg,
20440 20 6e 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20   nArg);.    if( 
20450 61 64 64 72 4e 65 78 74 20 29 7b 0a 20 20 20 20  addrNext ){.    
20460 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
20470 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64  olveLabel(v, add
20480 72 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 73 71  rNext);.      sq
20490 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43 6c  lite3ExprCacheCl
204a0 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
204b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66   }.  }..  /* Bef
204c0 6f 72 65 20 70 6f 70 75 6c 61 74 69 6e 67 20 74  ore populating t
204d0 68 65 20 61 63 63 75 6d 75 6c 61 74 6f 72 20 72  he accumulator r
204e0 65 67 69 73 74 65 72 73 2c 20 63 6c 65 61 72 20  egisters, clear 
204f0 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
20500 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
20510 2c 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  , if any of the 
20520 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20  required column 
20530 76 61 6c 75 65 73 20 61 72 65 20 61 6c 72 65 61  values are alrea
20540 64 79 20 70 72 65 73 65 6e 74 20 0a 20 20 2a 2a  dy present .  **
20550 20 69 6e 20 72 65 67 69 73 74 65 72 73 2c 20 73   in registers, s
20560 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
20570 20 6d 61 79 20 75 73 65 20 4f 50 5f 53 43 6f 70   may use OP_SCop
20580 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 76 61  y to copy the va
20590 6c 75 65 0a 20 20 2a 2a 20 74 6f 20 70 43 2d 3e  lue.  ** to pC->
205a0 69 4d 65 6d 2e 20 42 75 74 20 62 79 20 74 68 65  iMem. But by the
205b0 20 74 69 6d 65 20 74 68 65 20 76 61 6c 75 65 20   time the value 
205c0 69 73 20 75 73 65 64 2c 20 74 68 65 20 6f 72 69  is used, the ori
205d0 67 69 6e 61 6c 20 72 65 67 69 73 74 65 72 0a 20  ginal register. 
205e0 20 2a 2a 20 6d 61 79 20 68 61 76 65 20 62 65 65   ** may have bee
205f0 6e 20 75 73 65 64 2c 20 69 6e 76 61 6c 69 64 61  n used, invalida
20600 74 69 6e 67 20 74 68 65 20 75 6e 64 65 72 6c 79  ting the underly
20610 69 6e 67 20 62 75 66 66 65 72 20 68 6f 6c 64 69  ing buffer holdi
20620 6e 67 20 74 68 65 0a 20 20 2a 2a 20 74 65 78 74  ng the.  ** text
20630 20 6f 72 20 62 6c 6f 62 20 76 61 6c 75 65 2e 20   or blob value. 
20640 53 65 65 20 74 69 63 6b 65 74 20 5b 38 38 33 30  See ticket [8830
20650 33 34 64 63 62 35 5d 2e 0a 20 20 2a 2a 0a 20 20  34dcb5]..  **.  
20660 2a 2a 20 41 6e 6f 74 68 65 72 20 73 6f 6c 75 74  ** Another solut
20670 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ion would be to 
20680 63 68 61 6e 67 65 20 74 68 65 20 4f 50 5f 53 43  change the OP_SC
20690 6f 70 79 20 75 73 65 64 20 74 6f 20 63 6f 70 79  opy used to copy
206a0 20 63 61 63 68 65 64 0a 20 20 2a 2a 20 76 61 6c   cached.  ** val
206b0 75 65 73 20 74 6f 20 61 6e 20 4f 50 5f 43 6f 70  ues to an OP_Cop
206c0 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65  y..  */.  if( re
206d0 67 48 69 74 20 29 7b 0a 20 20 20 20 61 64 64 72  gHit ){.    addr
206e0 48 69 74 54 65 73 74 20 3d 20 73 71 6c 69 74 65  HitTest = sqlite
206f0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
20700 50 5f 49 66 2c 20 72 65 67 48 69 74 29 3b 0a 20  P_If, regHit);. 
20710 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
20720 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73  CacheClear(pPars
20730 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  e);.  for(i=0, p
20740 43 3d 70 41 67 67 49 6e 66 6f 2d 3e 61 43 6f 6c  C=pAggInfo->aCol
20750 3b 20 69 3c 70 41 67 67 49 6e 66 6f 2d 3e 6e 41  ; i<pAggInfo->nA
20760 63 63 75 6d 75 6c 61 74 6f 72 3b 20 69 2b 2b 2c  ccumulator; i++,
20770 20 70 43 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69   pC++){.    sqli
20780 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
20790 73 65 2c 20 70 43 2d 3e 70 45 78 70 72 2c 20 70  se, pC->pExpr, p
207a0 43 2d 3e 69 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20  C->iMem);.  }.  
207b0 70 41 67 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74  pAggInfo->direct
207c0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Mode = 0;.  sqli
207d0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
207e0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  r(pParse);.  if(
207f0 20 61 64 64 72 48 69 74 54 65 73 74 20 29 7b 0a   addrHitTest ){.
20800 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
20810 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 48  umpHere(v, addrH
20820 69 74 54 65 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  itTest);.  }.}..
20830 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
20840 6c 65 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  le OP_Explain in
20850 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
20860 20 56 44 42 45 20 74 6f 20 65 78 70 6c 61 69 6e   VDBE to explain
20870 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 75   a simple.** cou
20880 6e 74 28 2a 29 20 71 75 65 72 79 20 28 22 53 45  nt(*) query ("SE
20890 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
208a0 4f 4d 20 70 54 61 62 22 29 2e 0a 2a 2f 0a 23 69  OM pTab")..*/.#i
208b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
208c0 54 5f 45 58 50 4c 41 49 4e 0a 73 74 61 74 69 63  T_EXPLAIN.static
208d0 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 53 69 6d   void explainSim
208e0 70 6c 65 43 6f 75 6e 74 28 0a 20 20 50 61 72 73  pleCount(.  Pars
208f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
20900 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
20910 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
20920 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67    /* Table being
20950 20 71 75 65 72 69 65 64 20 2a 2f 0a 20 20 49 6e   queried */.  In
20960 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20980 20 49 6e 64 65 78 20 75 73 65 64 20 74 6f 20 6f   Index used to o
20990 70 74 69 6d 69 7a 65 20 73 63 61 6e 2c 20 6f 72  ptimize scan, or
209a0 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66   NULL */.){.  if
209b0 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
209c0 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72  n==2 ){.    char
209d0 20 2a 7a 45 71 70 20 3d 20 73 71 6c 69 74 65 33   *zEqp = sqlite3
209e0 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
209f0 64 62 2c 20 22 53 43 41 4e 20 54 41 42 4c 45 20  db, "SCAN TABLE 
20a00 25 73 20 25 73 25 73 28 7e 25 64 20 72 6f 77 73  %s %s%s(~%d rows
20a10 29 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  )",.        pTab
20a20 2d 3e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ->zName, .      
20a30 20 20 70 49 64 78 20 3f 20 22 55 53 49 4e 47 20    pIdx ? "USING 
20a40 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 20 22  COVERING INDEX "
20a50 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 70   : "",.        p
20a60 49 64 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d  Idx ? pIdx->zNam
20a70 65 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20  e : "",.        
20a80 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 0a 20 20  pTab->nRowEst.  
20a90 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
20aa0 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20  VdbeAddOp4(.    
20ab0 20 20 20 20 70 50 61 72 73 65 2d 3e 70 56 64 62      pParse->pVdb
20ac0 65 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 70  e, OP_Explain, p
20ad0 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49 64  Parse->iSelectId
20ae0 2c 20 30 2c 20 30 2c 20 7a 45 71 70 2c 20 50 34  , 0, 0, zEqp, P4
20af0 5f 44 59 4e 41 4d 49 43 0a 20 20 20 20 29 3b 0a  _DYNAMIC.    );.
20b00 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
20b10 66 69 6e 65 20 65 78 70 6c 61 69 6e 53 69 6d 70  fine explainSimp
20b20 6c 65 43 6f 75 6e 74 28 61 2c 62 2c 63 29 0a 23  leCount(a,b,c).#
20b30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
20b40 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74  erate code for t
20b50 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
20b60 65 6e 74 20 67 69 76 65 6e 20 69 6e 20 74 68 65  ent given in the
20b70 20 70 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 2a   p argument.  .*
20b80 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 73  *.** The results
20b90 20 61 72 65 20 64 69 73 74 72 69 62 75 74 65 64   are distributed
20ba0 20 69 6e 20 76 61 72 69 6f 75 73 20 77 61 79 73   in various ways
20bb0 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
20bc0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
20bd0 20 74 68 65 20 53 65 6c 65 63 74 44 65 73 74 20   the SelectDest 
20be0 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65  structure pointe
20bf0 64 20 74 6f 20 62 79 20 61 72 67 75 6d 65 6e 74  d to by argument
20c00 20 70 44 65 73 74 0a 2a 2a 20 61 73 20 66 6f 6c   pDest.** as fol
20c10 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
20c20 70 44 65 73 74 2d 3e 65 44 65 73 74 20 20 20 20  pDest->eDest    
20c30 52 65 73 75 6c 74 0a 2a 2a 20 20 20 20 20 2d 2d  Result.**     --
20c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
20c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
20c80 20 53 52 54 5f 4f 75 74 70 75 74 20 20 20 20 20   SRT_Output     
20c90 20 47 65 6e 65 72 61 74 65 20 61 20 72 6f 77 20   Generate a row 
20ca0 6f 66 20 6f 75 74 70 75 74 20 28 75 73 69 6e 67  of output (using
20cb0 20 74 68 65 20 4f 50 5f 52 65 73 75 6c 74 52 6f   the OP_ResultRo
20cc0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
20cd0 20 20 20 20 20 20 20 20 20 6f 70 63 6f 64 65 29           opcode)
20ce0 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 69 6e   for each row in
20cf0 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
20d00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 4d  .**.**     SRT_M
20d10 65 6d 20 20 20 20 20 20 20 20 20 4f 6e 6c 79 20  em         Only 
20d20 76 61 6c 69 64 20 69 66 20 74 68 65 20 72 65 73  valid if the res
20d30 75 6c 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ult is a single 
20d40 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 20 20 20 20 20  column..**      
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
20d60 74 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  tore the first c
20d70 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72  olumn of the fir
20d80 73 74 20 72 65 73 75 6c 74 20 72 6f 77 0a 2a 2a  st result row.**
20d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20da0 20 20 20 20 20 69 6e 20 72 65 67 69 73 74 65 72       in register
20db0 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 20   pDest->iSDParm 
20dc0 74 68 65 6e 20 61 62 61 6e 64 6f 6e 20 74 68 65  then abandon the
20dd0 20 72 65 73 74 0a 2a 2a 20 20 20 20 20 20 20 20   rest.**        
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
20df0 74 68 65 20 71 75 65 72 79 2e 20 20 54 68 69 73  the query.  This
20e00 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69 6d 70   destination imp
20e10 6c 69 65 73 20 22 4c 49 4d 49 54 20 31 22 2e 0a  lies "LIMIT 1"..
20e20 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 53 65  **.**     SRT_Se
20e30 74 20 20 20 20 20 20 20 20 20 54 68 65 20 72 65  t         The re
20e40 73 75 6c 74 20 6d 75 73 74 20 62 65 20 61 20 73  sult must be a s
20e50 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 2e 20 20 53  ingle column.  S
20e60 74 6f 72 65 20 65 61 63 68 0a 2a 2a 20 20 20 20  tore each.**    
20e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e80 20 72 6f 77 20 6f 66 20 72 65 73 75 6c 74 20 61   row of result a
20e90 73 20 74 68 65 20 6b 65 79 20 69 6e 20 74 61 62  s the key in tab
20ea0 6c 65 20 70 44 65 73 74 2d 3e 69 53 44 50 61 72  le pDest->iSDPar
20eb0 6d 2e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  m. .**          
20ec0 20 20 20 20 20 20 20 20 20 20 20 41 70 70 6c 79             Apply
20ed0 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 70 44   the affinity pD
20ee0 65 73 74 2d 3e 61 66 66 53 64 73 74 20 62 65 66  est->affSdst bef
20ef0 6f 72 65 20 73 74 6f 72 69 6e 67 0a 2a 2a 20 20  ore storing.**  
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f10 20 20 20 72 65 73 75 6c 74 73 2e 20 20 55 73 65     results.  Use
20f20 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
20f30 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22  IN (SELECT ...)"
20f40 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
20f50 55 6e 69 6f 6e 20 20 20 20 20 20 20 53 74 6f 72  Union       Stor
20f60 65 20 72 65 73 75 6c 74 73 20 61 73 20 61 20 6b  e results as a k
20f70 65 79 20 69 6e 20 61 20 74 65 6d 70 6f 72 61 72  ey in a temporar
20f80 79 20 74 61 62 6c 65 20 0a 2a 2a 20 20 20 20 20  y table .**     
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fa0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44  identified by pD
20fb0 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a  est->iSDParm..**
20fc0 0a 2a 2a 20 20 20 20 20 53 52 54 5f 45 78 63 65  .**     SRT_Exce
20fd0 70 74 20 20 20 20 20 20 52 65 6d 6f 76 65 20 72  pt      Remove r
20fe0 65 73 75 6c 74 73 20 66 72 6f 6d 20 74 68 65 20  esults from the 
20ff0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
21000 70 44 65 73 74 2d 3e 69 53 44 50 61 72 6d 2e 0a  pDest->iSDParm..
21010 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f 54 61  **.**     SRT_Ta
21020 62 6c 65 20 20 20 20 20 20 20 53 74 6f 72 65 20  ble       Store 
21030 72 65 73 75 6c 74 73 20 69 6e 20 74 65 6d 70 6f  results in tempo
21040 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73 74  rary table pDest
21050 2d 3e 69 53 44 50 61 72 6d 2e 0a 2a 2a 20 20 20  ->iSDParm..**   
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 53    This is like S
21080 52 54 5f 45 70 68 65 6d 54 61 62 20 65 78 63 65  RT_EphemTab exce
21090 70 74 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  pt that the tabl
210a0 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
210b0 20 20 20 20 20 20 20 20 20 69 73 20 61 73 73 75           is assu
210c0 6d 65 64 20 74 6f 20 61 6c 72 65 61 64 79 20 62  med to already b
210d0 65 20 6f 70 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  e open..**.**   
210e0 20 20 53 52 54 5f 45 70 68 65 6d 54 61 62 20 20    SRT_EphemTab  
210f0 20 20 43 72 65 61 74 65 20 61 6e 20 74 65 6d 70    Create an temp
21100 6f 72 61 72 79 20 74 61 62 6c 65 20 70 44 65 73  orary table pDes
21110 74 2d 3e 69 53 44 50 61 72 6d 20 61 6e 64 20 73  t->iSDParm and s
21120 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  tore.**         
21130 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
21140 72 65 73 75 6c 74 20 74 68 65 72 65 2e 20 54 68  result there. Th
21150 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
21160 20 6f 70 65 6e 20 61 66 74 65 72 0a 2a 2a 20 20   open after.**  
21170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21180 20 20 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 54     returning.  T
21190 68 69 73 20 69 73 20 6c 69 6b 65 20 53 52 54 5f  his is like SRT_
211a0 54 61 62 6c 65 20 65 78 63 65 70 74 20 74 68 61  Table except tha
211b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
211c0 20 20 20 20 20 20 20 20 20 74 68 69 73 20 64 65           this de
211d0 73 74 69 6e 61 74 69 6f 6e 20 75 73 65 73 20 4f  stination uses O
211e0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20  P_OpenEphemeral 
211f0 74 6f 20 63 72 65 61 74 65 0a 2a 2a 20 20 20 20  to create.**    
21200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21210 20 74 68 65 20 74 61 62 6c 65 20 66 69 72 73 74   the table first
21220 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52 54 5f  ..**.**     SRT_
21230 43 6f 72 6f 75 74 69 6e 65 20 20 20 47 65 6e 65  Coroutine   Gene
21240 72 61 74 65 20 61 20 63 6f 2d 72 6f 75 74 69 6e  rate a co-routin
21250 65 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 61  e that returns a
21260 20 6e 65 77 20 72 6f 77 20 6f 66 0a 2a 2a 20 20   new row of.**  
21270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21280 20 20 20 72 65 73 75 6c 74 73 20 65 61 63 68 20     results each 
21290 74 69 6d 65 20 69 74 20 69 73 20 69 6e 76 6f 6b  time it is invok
212a0 65 64 2e 20 20 54 68 65 20 65 6e 74 72 79 20 70  ed.  The entry p
212b0 6f 69 6e 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  oint.**         
212c0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
212d0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 69 73  he co-routine is
212e0 20 73 74 6f 72 65 64 20 69 6e 20 72 65 67 69 73   stored in regis
212f0 74 65 72 20 70 44 65 73 74 2d 3e 69 53 44 50 61  ter pDest->iSDPa
21300 72 6d 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 52  rm..**.**     SR
21310 54 5f 45 78 69 73 74 73 20 20 20 20 20 20 53 74  T_Exists      St
21320 6f 72 65 20 61 20 31 20 69 6e 20 6d 65 6d 6f 72  ore a 1 in memor
21330 79 20 63 65 6c 6c 20 70 44 65 73 74 2d 3e 69 53  y cell pDest->iS
21340 44 50 61 72 6d 20 69 66 20 74 68 65 20 72 65 73  DParm if the res
21350 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
21360 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20 69             set i
21370 73 20 6e 6f 74 20 65 6d 70 74 79 2e 0a 2a 2a 0a  s not empty..**.
21380 2a 2a 20 20 20 20 20 53 52 54 5f 44 69 73 63 61  **     SRT_Disca
21390 72 64 20 20 20 20 20 54 68 72 6f 77 20 74 68 65  rd     Throw the
213a0 20 72 65 73 75 6c 74 73 20 61 77 61 79 2e 20 20   results away.  
213b0 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
213c0 53 45 4c 45 43 54 0a 2a 2a 20 20 20 20 20 20 20  SELECT.**       
213d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
213e0 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20  atements within 
213f0 74 72 69 67 67 65 72 73 20 77 68 6f 73 65 20 6f  triggers whose o
21400 6e 6c 79 20 70 75 72 70 6f 73 65 20 69 73 0a 2a  nly purpose is.*
21410 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
21420 20 20 20 20 20 20 74 68 65 20 73 69 64 65 2d 65        the side-e
21430 66 66 65 63 74 73 20 6f 66 20 66 75 6e 63 74 69  ffects of functi
21440 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
21450 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
21460 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
21470 72 6f 72 73 2e 20 20 49 66 20 61 6e 79 20 65 72  rors.  If any er
21480 72 6f 72 73 20 61 72 65 0a 2a 2a 20 65 6e 63 6f  rors are.** enco
21490 75 6e 74 65 72 65 64 2c 20 74 68 65 6e 20 61 6e  untered, then an
214a0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
214b0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
214c0 66 74 20 69 6e 0a 2a 2a 20 70 50 61 72 73 65 2d  ft in.** pParse-
214d0 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20  >zErrMsg..**.** 
214e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
214f0 73 20 4e 4f 54 20 66 72 65 65 20 74 68 65 20 53  s NOT free the S
21500 65 6c 65 63 74 20 73 74 72 75 63 74 75 72 65 20  elect structure 
21510 70 61 73 73 65 64 20 69 6e 2e 20 20 54 68 65 0a  passed in.  The.
21520 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  ** calling funct
21530 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20 64 6f 20  ion needs to do 
21540 74 68 61 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  that..*/.int sql
21550 69 74 65 33 53 65 6c 65 63 74 28 0a 20 20 50 61  ite3Select(.  Pa
21560 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
21570 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
21580 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
21590 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
215a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
215b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
215c0 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
215d0 20 53 65 6c 65 63 74 44 65 73 74 20 2a 70 44 65   SelectDest *pDe
215e0 73 74 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  st      /* What 
215f0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 71  to do with the q
21600 75 65 72 79 20 72 65 73 75 6c 74 73 20 2a 2f 0a  uery results */.
21610 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
21620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
21630 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
21640 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
21650 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 52 65 74 75  nfo;     /* Retu
21660 72 6e 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 57  rn from sqlite3W
21670 68 65 72 65 42 65 67 69 6e 28 29 20 2a 2f 0a 20  hereBegin() */. 
21680 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
21690 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
216a0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
216b0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
216c0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 41 67 67  n */.  int isAgg
216d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
216e0 20 54 72 75 65 20 66 6f 72 20 73 65 6c 65 63 74   True for select
216f0 20 6c 69 73 74 73 20 6c 69 6b 65 20 22 63 6f 75   lists like "cou
21700 6e 74 28 2a 29 22 20 2a 2f 0a 20 20 45 78 70 72  nt(*)" */.  Expr
21710 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
21720 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 63 6f     /* List of co
21730 6c 75 6d 6e 73 20 74 6f 20 65 78 74 72 61 63 74  lumns to extract
21740 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  . */.  SrcList *
21750 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 2f 2a  pTabList;     /*
21760 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
21770 74 6f 20 73 65 6c 65 63 74 20 66 72 6f 6d 20 2a  to select from *
21780 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
21790 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
217a0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
217b0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
217c0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
217d0 65 72 42 79 3b 20 20 20 20 2f 2a 20 54 68 65 20  erBy;    /* The 
217e0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
217f0 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
21800 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72  .  ExprList *pGr
21810 6f 75 70 42 79 3b 20 20 20 20 2f 2a 20 54 68 65  oupBy;    /* The
21820 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
21830 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  .  May be NULL *
21840 2f 0a 20 20 45 78 70 72 20 2a 70 48 61 76 69 6e  /.  Expr *pHavin
21850 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  g;         /* Th
21860 65 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 2e  e HAVING clause.
21870 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f    May be NULL */
21880 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 20 20  .  int rc = 1;  
21890 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
218a0 75 65 20 74 6f 20 72 65 74 75 72 6e 20 66 72 6f  ue to return fro
218b0 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
218c0 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 53 6f 72  */.  int addrSor
218d0 74 49 6e 64 65 78 3b 20 20 20 20 20 2f 2a 20 41  tIndex;     /* A
218e0 64 64 72 65 73 73 20 6f 66 20 61 6e 20 4f 50 5f  ddress of an OP_
218f0 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e  OpenEphemeral in
21900 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 44  struction */.  D
21910 69 73 74 69 6e 63 74 43 74 78 20 73 44 69 73 74  istinctCtx sDist
21920 69 6e 63 74 3b 20 2f 2a 20 49 6e 66 6f 20 6f 6e  inct; /* Info on
21930 20 68 6f 77 20 74 6f 20 63 6f 64 65 20 74 68 65   how to code the
21940 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
21950 64 20 2a 2f 0a 20 20 41 67 67 49 6e 66 6f 20 73  d */.  AggInfo s
21960 41 67 67 49 6e 66 6f 3b 20 20 20 20 20 20 2f 2a  AggInfo;      /*
21970 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65   Information use
21980 64 20 62 79 20 61 67 67 72 65 67 61 74 65 20 71  d by aggregate q
21990 75 65 72 69 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ueries */.  int 
219a0 69 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  iEnd;           
219b0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
219c0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
219d0 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
219e0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
219f0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
21a00 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
21a10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21a20 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 69  OMIT_EXPLAIN.  i
21a30 6e 74 20 69 52 65 73 74 6f 72 65 53 65 6c 65 63  nt iRestoreSelec
21a40 74 49 64 20 3d 20 70 50 61 72 73 65 2d 3e 69 53  tId = pParse->iS
21a50 65 6c 65 63 74 49 64 3b 0a 20 20 70 50 61 72 73  electId;.  pPars
21a60 65 2d 3e 69 53 65 6c 65 63 74 49 64 20 3d 20 70  e->iSelectId = p
21a70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53 65 6c 65  Parse->iNextSele
21a80 63 74 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ctId++;.#endif..
21a90 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
21aa0 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  b;.  if( p==0 ||
21ab0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
21ac0 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
21ad0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
21ae0 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  1;.  }.  if( sql
21af0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
21b00 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 45 4c  arse, SQLITE_SEL
21b10 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 20 29 20  ECT, 0, 0, 0) ) 
21b20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73  return 1;.  mems
21b30 65 74 28 26 73 41 67 67 49 6e 66 6f 2c 20 30 2c  et(&sAggInfo, 0,
21b40 20 73 69 7a 65 6f 66 28 73 41 67 67 49 6e 66 6f   sizeof(sAggInfo
21b50 29 29 3b 0a 0a 20 20 69 66 28 20 49 67 6e 6f 72  ));..  if( Ignor
21b60 61 62 6c 65 4f 72 64 65 72 62 79 28 70 44 65 73  ableOrderby(pDes
21b70 74 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  t) ){.    assert
21b80 28 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53  (pDest->eDest==S
21b90 52 54 5f 45 78 69 73 74 73 20 7c 7c 20 70 44 65  RT_Exists || pDe
21ba0 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54 5f 55  st->eDest==SRT_U
21bb0 6e 69 6f 6e 20 7c 7c 20 0a 20 20 20 20 20 20 20  nion || .       
21bc0 20 20 20 20 70 44 65 73 74 2d 3e 65 44 65 73 74      pDest->eDest
21bd0 3d 3d 53 52 54 5f 45 78 63 65 70 74 20 7c 7c 20  ==SRT_Except || 
21be0 70 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52  pDest->eDest==SR
21bf0 54 5f 44 69 73 63 61 72 64 29 3b 0a 20 20 20 20  T_Discard);.    
21c00 2f 2a 20 49 66 20 4f 52 44 45 52 20 42 59 20 6d  /* If ORDER BY m
21c10 61 6b 65 73 20 6e 6f 20 64 69 66 66 65 72 65 6e  akes no differen
21c20 63 65 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ce in the output
21c30 20 74 68 65 6e 20 6e 65 69 74 68 65 72 20 64 6f   then neither do
21c40 65 73 0a 20 20 20 20 2a 2a 20 44 49 53 54 49 4e  es.    ** DISTIN
21c50 43 54 20 73 6f 20 69 74 20 63 61 6e 20 62 65 20  CT so it can be 
21c60 72 65 6d 6f 76 65 64 20 74 6f 6f 2e 20 2a 2f 0a  removed too. */.
21c70 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
21c80 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  istDelete(db, p-
21c90 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
21ca0 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
21cb0 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
21cc0 20 26 3d 20 7e 53 46 5f 44 69 73 74 69 6e 63 74   &= ~SF_Distinct
21cd0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
21ce0 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
21cf0 2c 20 70 2c 20 30 29 3b 0a 20 20 70 4f 72 64 65  , p, 0);.  pOrde
21d00 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42  rBy = p->pOrderB
21d10 79 3b 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20  y;.  pTabList = 
21d20 70 2d 3e 70 53 72 63 3b 0a 20 20 70 45 4c 69 73  p->pSrc;.  pELis
21d30 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
21d40 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
21d50 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  r || db->mallocF
21d60 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
21d70 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
21d80 7d 0a 20 20 69 73 41 67 67 20 3d 20 28 70 2d 3e  }.  isAgg = (p->
21d90 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
21da0 67 72 65 67 61 74 65 29 21 3d 30 3b 0a 20 20 61  gregate)!=0;.  a
21db0 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
21dc0 20 29 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20   );..  /* Begin 
21dd0 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 64 65 2e  generating code.
21de0 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
21df0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
21e00 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  e);.  if( v==0 )
21e10 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e 64   goto select_end
21e20 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 72 69 74 69  ;..  /* If writi
21e30 6e 67 20 74 6f 20 6d 65 6d 6f 72 79 20 6f 72 20  ng to memory or 
21e40 67 65 6e 65 72 61 74 69 6e 67 20 61 20 73 65 74  generating a set
21e50 0a 20 20 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e  .  ** only a sin
21e60 67 6c 65 20 63 6f 6c 75 6d 6e 20 6d 61 79 20 62  gle column may b
21e70 65 20 6f 75 74 70 75 74 2e 0a 20 20 2a 2f 0a 23  e output..  */.#
21e80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21e90 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 69 66  IT_SUBQUERY.  if
21ea0 28 20 63 68 65 63 6b 46 6f 72 4d 75 6c 74 69 43  ( checkForMultiC
21eb0 6f 6c 75 6d 6e 53 65 6c 65 63 74 45 72 72 6f 72  olumnSelectError
21ec0 28 70 50 61 72 73 65 2c 20 70 44 65 73 74 2c 20  (pParse, pDest, 
21ed0 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  pEList->nExpr) )
21ee0 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6c 65 63  {.    goto selec
21ef0 74 5f 65 6e 64 3b 0a 20 20 7d 0a 23 65 6e 64 69  t_end;.  }.#endi
21f00 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
21f10 20 63 6f 64 65 20 66 6f 72 20 61 6c 6c 20 73 75   code for all su
21f20 62 2d 71 75 65 72 69 65 73 20 69 6e 20 74 68 65  b-queries in the
21f30 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20 20 2a   FROM clause.  *
21f40 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
21f50 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
21f60 45 52 59 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  ERY) || !defined
21f70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
21f80 57 29 0a 20 20 66 6f 72 28 69 3d 30 3b 20 21 70  W).  for(i=0; !p
21f90 2d 3e 70 50 72 69 6f 72 20 26 26 20 69 3c 70 54  ->pPrior && i<pT
21fa0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
21fb0 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
21fc0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
21fd0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
21fe0 61 5b 69 5d 3b 0a 20 20 20 20 53 65 6c 65 63 74  a[i];.    Select
21ff0 44 65 73 74 20 64 65 73 74 3b 0a 20 20 20 20 53  Dest dest;.    S
22000 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 49  elect *pSub = pI
22010 74 65 6d 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20  tem->pSelect;.  
22020 20 20 69 6e 74 20 69 73 41 67 67 53 75 62 3b 0a    int isAggSub;.
22030 0a 20 20 20 20 69 66 28 20 70 53 75 62 3d 3d 30  .    if( pSub==0
22040 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
22050 20 20 2f 2a 20 53 6f 6d 65 74 69 6d 65 73 20 74    /* Sometimes t
22060 68 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 75  he code for a su
22070 62 71 75 65 72 79 20 77 69 6c 6c 20 62 65 20 67  bquery will be g
22080 65 6e 65 72 61 74 65 64 20 6d 6f 72 65 20 74 68  enerated more th
22090 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 63 65 2c 20  an.    ** once, 
220a0 69 66 20 74 68 65 20 73 75 62 71 75 65 72 79 20  if the subquery 
220b0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 57  is part of the W
220c0 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 61  HERE clause in a
220d0 20 4c 45 46 54 20 4a 4f 49 4e 2c 0a 20 20 20 20   LEFT JOIN,.    
220e0 2a 2a 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  ** for example. 
220f0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 64   In that case, d
22100 6f 20 6e 6f 74 20 72 65 67 65 6e 65 72 61 74 65  o not regenerate
22110 20 74 68 65 20 63 6f 64 65 20 74 6f 20 6d 61 6e   the code to man
22120 69 66 65 73 74 0a 20 20 20 20 2a 2a 20 61 20 76  ifest.    ** a v
22130 69 65 77 20 6f 72 20 74 68 65 20 63 6f 2d 72 6f  iew or the co-ro
22140 75 74 69 6e 65 20 74 6f 20 69 6d 70 6c 65 6d 65  utine to impleme
22150 6e 74 20 61 20 76 69 65 77 2e 20 20 54 68 65 20  nt a view.  The 
22160 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 0a 20  first instance. 
22170 20 20 20 2a 2a 20 69 73 20 73 75 66 66 69 63 69     ** is suffici
22180 65 6e 74 2c 20 74 68 6f 75 67 68 20 74 68 65 20  ent, though the 
22190 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  subroutine to ma
221a0 6e 69 66 65 73 74 20 74 68 65 20 76 69 65 77 20  nifest the view 
221b0 64 6f 65 73 20 6e 65 65 64 0a 20 20 20 20 2a 2a  does need.    **
221c0 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 61   to be invoked a
221d0 67 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  gain. */.    if(
221e0 20 70 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c   pItem->addrFill
221f0 53 75 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Sub ){.      if(
22200 20 70 49 74 65 6d 2d 3e 76 69 61 43 6f 72 6f 75   pItem->viaCorou
22210 74 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tine==0 ){.     
22220 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
22230 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62  dOp2(v, OP_Gosub
22240 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75  , pItem->regRetu
22250 72 6e 2c 20 70 49 74 65 6d 2d 3e 61 64 64 72 46  rn, pItem->addrF
22260 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 20 20 7d  illSub);.      }
22270 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
22280 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
22290 6e 63 72 65 6d 65 6e 74 20 50 61 72 73 65 2e 6e  ncrement Parse.n
222a0 48 65 69 67 68 74 20 62 79 20 74 68 65 20 68 65  Height by the he
222b0 69 67 68 74 20 6f 66 20 74 68 65 20 6c 61 72 67  ight of the larg
222c0 65 73 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  est expression. 
222d0 20 20 20 2a 2a 20 74 72 65 65 20 72 65 66 65 72     ** tree refer
222e0 65 64 20 74 6f 20 62 79 20 74 68 69 73 2c 20 74  ed to by this, t
222f0 68 65 20 70 61 72 65 6e 74 20 73 65 6c 65 63 74  he parent select
22300 2e 20 54 68 65 20 63 68 69 6c 64 20 73 65 6c 65  . The child sele
22310 63 74 0a 20 20 20 20 2a 2a 20 6d 61 79 20 63 6f  ct.    ** may co
22320 6e 74 61 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ntain expression
22330 20 74 72 65 65 73 20 6f 66 20 61 74 20 6d 6f 73   trees of at mos
22340 74 0a 20 20 20 20 2a 2a 20 28 53 51 4c 49 54 45  t.    ** (SQLITE
22350 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2d  _MAX_EXPR_DEPTH-
22360 50 61 72 73 65 2e 6e 48 65 69 67 68 74 29 20 68  Parse.nHeight) h
22370 65 69 67 68 74 2e 20 54 68 69 73 20 69 73 20 61  eight. This is a
22380 20 62 69 74 0a 20 20 20 20 2a 2a 20 6d 6f 72 65   bit.    ** more
22390 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 74 68   conservative th
223a0 61 6e 20 6e 65 63 65 73 73 61 72 79 2c 20 62 75  an necessary, bu
223b0 74 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 68  t much easier th
223c0 61 6e 20 65 6e 66 6f 72 63 69 6e 67 0a 20 20 20  an enforcing.   
223d0 20 2a 2a 20 61 6e 20 65 78 61 63 74 20 6c 69 6d   ** an exact lim
223e0 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  it..    */.    p
223f0 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
22400 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  = sqlite3SelectE
22410 78 70 72 48 65 69 67 68 74 28 70 29 3b 0a 0a 20  xprHeight(p);.. 
22420 20 20 20 69 73 41 67 67 53 75 62 20 3d 20 28 70     isAggSub = (p
22430 53 75 62 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  Sub->selFlags & 
22440 53 46 5f 41 67 67 72 65 67 61 74 65 29 21 3d 30  SF_Aggregate)!=0
22450 3b 0a 20 20 20 20 69 66 28 20 66 6c 61 74 74 65  ;.    if( flatte
22460 6e 53 75 62 71 75 65 72 79 28 70 50 61 72 73 65  nSubquery(pParse
22470 2c 20 70 2c 20 69 2c 20 69 73 41 67 67 2c 20 69  , p, i, isAgg, i
22480 73 41 67 67 53 75 62 29 20 29 7b 0a 20 20 20 20  sAggSub) ){.    
22490 20 20 2f 2a 20 54 68 69 73 20 73 75 62 71 75 65    /* This subque
224a0 72 79 20 63 61 6e 20 62 65 20 61 62 73 6f 72 62  ry can be absorb
224b0 65 64 20 69 6e 74 6f 20 69 74 73 20 70 61 72 65  ed into its pare
224c0 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  nt. */.      if(
224d0 20 69 73 41 67 67 53 75 62 20 29 7b 0a 20 20 20   isAggSub ){.   
224e0 20 20 20 20 20 69 73 41 67 67 20 3d 20 31 3b 0a       isAgg = 1;.
224f0 20 20 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c          p->selFl
22500 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67  ags |= SF_Aggreg
22510 61 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ate;.      }.   
22520 20 20 20 69 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     i = -1;.    }
22530 65 6c 73 65 20 69 66 28 20 70 54 61 62 4c 69 73  else if( pTabLis
22540 74 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20 28 70  t->nSrc==1 && (p
22550 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
22560 4d 61 74 65 72 69 61 6c 69 7a 65 29 3d 3d 30 0a  Materialize)==0.
22570 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a        && Optimiz
22580 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c  ationEnabled(db,
22590 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f   SQLITE_SubqCoro
225a0 75 74 69 6e 65 29 0a 20 20 20 20 29 7b 0a 20 20  utine).    ){.  
225b0 20 20 20 20 2f 2a 20 49 6d 70 6c 65 6d 65 6e 74      /* Implement
225c0 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 20 74 68   a co-routine th
225d0 61 74 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  at will return a
225e0 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
225f0 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
22600 2a 2a 20 73 65 74 20 6f 6e 20 65 61 63 68 20 69  ** set on each i
22610 6e 76 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20  nvocation..     
22620 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
22630 64 72 54 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74  drTop;.      int
22640 20 61 64 64 72 45 6f 66 3b 0a 20 20 20 20 20 20   addrEof;.      
22650 70 49 74 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e  pItem->regReturn
22660 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22670 6d 3b 0a 20 20 20 20 20 20 61 64 64 72 45 6f 66  m;.      addrEof
22680 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
22690 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
226a0 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
226b0 5f 47 6f 74 6f 29 3b 0a 20 20 20 20 20 20 61 64  _Goto);.      ad
226c0 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  drTop = sqlite3V
226d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
226e0 4f 70 65 6e 50 73 65 75 64 6f 2c 20 70 49 74 65  OpenPseudo, pIte
226f0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
22700 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
22710 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20  angeP5(v, 1);.  
22720 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22730 28 76 2c 20 22 63 6f 72 6f 75 74 69 6e 65 20 66  (v, "coroutine f
22740 6f 72 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70  or %s", pItem->p
22750 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  Tab->zName));.  
22760 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64 72 46      pItem->addrF
22770 69 6c 6c 53 75 62 20 3d 20 61 64 64 72 54 6f 70  illSub = addrTop
22780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
22790 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
227a0 49 6e 74 65 67 65 72 2c 20 30 2c 20 61 64 64 72  Integer, 0, addr
227b0 45 6f 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Eof);.      sqli
227c0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
227d0 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  v, 1);.      sql
227e0 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
227f0 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
22800 72 6f 75 74 69 6e 65 2c 20 70 49 74 65 6d 2d 3e  routine, pItem->
22810 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20 20 20  regReturn);.    
22820 20 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65    explainSetInte
22830 67 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65  ger(pItem->iSele
22840 63 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65  ctId, (u8)pParse
22850 2d 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29  ->iNextSelectId)
22860 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
22870 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
22880 75 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ub, &dest);.    
22890 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e    pItem->pTab->n
228a0 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e  RowEst = (unsign
228b0 65 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74  ed)pSub->nSelect
228c0 52 6f 77 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  Row;.      pItem
228d0 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  ->viaCoroutine =
228e0 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
228f0 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
22900 20 61 64 64 72 54 6f 70 2c 20 64 65 73 74 2e 69   addrTop, dest.i
22910 53 64 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Sdst);.      sql
22920 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
22930 28 76 2c 20 61 64 64 72 54 6f 70 2c 20 64 65 73  (v, addrTop, des
22940 74 2e 6e 53 64 73 74 29 3b 0a 20 20 20 20 20 20  t.nSdst);.      
22950 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22960 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
22970 20 31 2c 20 61 64 64 72 45 6f 66 29 3b 0a 20 20   1, addrEof);.  
22980 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
22990 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c  ddOp1(v, OP_Yiel
229a0 64 2c 20 70 49 74 65 6d 2d 3e 72 65 67 52 65 74  d, pItem->regRet
229b0 75 72 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65  urn);.      Vdbe
229c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
229d0 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 70 54 61   %s", pItem->pTa
229e0 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  b->zName));.    
229f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
22a00 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
22a10 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
22a20 65 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61  e3ClearTempRegCa
22a30 63 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  che(pParse);.   
22a40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
22a50 20 47 65 6e 65 72 61 74 65 20 61 20 73 75 62 72   Generate a subr
22a60 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
22a70 20 66 69 6c 6c 20 61 6e 20 65 70 68 65 6d 65 72   fill an ephemer
22a80 61 6c 20 74 61 62 6c 65 20 77 69 74 68 0a 20 20  al table with.  
22a90 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65      ** the conte
22aa0 6e 74 20 6f 66 20 74 68 69 73 20 73 75 62 71 75  nt of this subqu
22ab0 65 72 79 2e 20 20 70 49 74 65 6d 2d 3e 61 64 64  ery.  pItem->add
22ac0 72 46 69 6c 6c 53 75 62 20 77 69 6c 6c 20 70 6f  rFillSub will po
22ad0 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  int.      ** to 
22ae0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
22af0 68 65 20 67 65 6e 65 72 61 74 65 64 20 73 75 62  he generated sub
22b00 72 6f 75 74 69 6e 65 2e 20 20 70 49 74 65 6d 2d  routine.  pItem-
22b10 3e 72 65 67 52 65 74 75 72 6e 0a 20 20 20 20 20  >regReturn.     
22b20 20 2a 2a 20 69 73 20 61 20 72 65 67 69 73 74 65   ** is a registe
22b30 72 20 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 68  r allocated to h
22b40 6f 6c 64 20 74 68 65 20 73 75 62 72 6f 75 74 69  old the subrouti
22b50 6e 65 20 72 65 74 75 72 6e 20 61 64 64 72 65 73  ne return addres
22b60 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  s.      */.     
22b70 20 69 6e 74 20 74 6f 70 41 64 64 72 3b 0a 20 20   int topAddr;.  
22b80 20 20 20 20 69 6e 74 20 6f 6e 63 65 41 64 64 72      int onceAddr
22b90 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
22ba0 72 65 74 41 64 64 72 3b 0a 20 20 20 20 20 20 61  retAddr;.      a
22bb0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 61 64  ssert( pItem->ad
22bc0 64 72 46 69 6c 6c 53 75 62 3d 3d 30 20 29 3b 0a  drFillSub==0 );.
22bd0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 72 65 67        pItem->reg
22be0 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73  Return = ++pPars
22bf0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 74  e->nMem;.      t
22c00 6f 70 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33  opAddr = sqlite3
22c10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
22c20 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 49 74  _Integer, 0, pIt
22c30 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a  em->regReturn);.
22c40 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 61 64 64        pItem->add
22c50 72 46 69 6c 6c 53 75 62 20 3d 20 74 6f 70 41 64  rFillSub = topAd
22c60 64 72 2b 31 3b 0a 20 20 20 20 20 20 56 64 62 65  dr+1;.      Vdbe
22c70 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  NoopComment((v, 
22c80 22 6d 61 74 65 72 69 61 6c 69 7a 65 20 25 73 22  "materialize %s"
22c90 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a  , pItem->pTab->z
22ca0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 69 66  Name));.      if
22cb0 28 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65  ( pItem->isCorre
22cc0 6c 61 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  lated==0 ){.    
22cd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
22ce0 62 71 75 65 72 79 20 69 73 20 6e 6f 20 63 6f 72  bquery is no cor
22cf0 72 65 6c 61 74 65 64 20 61 6e 64 20 69 66 20 77  related and if w
22d00 65 20 61 72 65 20 6e 6f 74 20 69 6e 73 69 64 65  e are not inside
22d10 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
22d20 20 74 72 69 67 67 65 72 2c 20 74 68 65 6e 20 77   trigger, then w
22d30 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 63  e only need to c
22d40 6f 6d 70 75 74 65 20 74 68 65 20 76 61 6c 75 65  ompute the value
22d50 20 6f 66 20 74 68 65 20 73 75 62 71 75 65 72 79   of the subquery
22d60 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 63 65  .        ** once
22d70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 6e 63  . */.        onc
22d80 65 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  eAddr = sqlite3C
22d90 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
22da0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
22db0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
22dc0 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
22dd0 45 70 68 65 6d 54 61 62 2c 20 70 49 74 65 6d 2d  EphemTab, pItem-
22de0 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  >iCursor);.     
22df0 20 65 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67   explainSetInteg
22e00 65 72 28 70 49 74 65 6d 2d 3e 69 53 65 6c 65 63  er(pItem->iSelec
22e10 74 49 64 2c 20 28 75 38 29 70 50 61 72 73 65 2d  tId, (u8)pParse-
22e20 3e 69 4e 65 78 74 53 65 6c 65 63 74 49 64 29 3b  >iNextSelectId);
22e30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
22e40 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 75  lect(pParse, pSu
22e50 62 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20  b, &dest);.     
22e60 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 6e 52   pItem->pTab->nR
22e70 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65  owEst = (unsigne
22e80 64 29 70 53 75 62 2d 3e 6e 53 65 6c 65 63 74 52  d)pSub->nSelectR
22e90 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ow;.      if( on
22ea0 63 65 41 64 64 72 20 29 20 73 71 6c 69 74 65 33  ceAddr ) sqlite3
22eb0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
22ec0 6f 6e 63 65 41 64 64 72 29 3b 0a 20 20 20 20 20  onceAddr);.     
22ed0 20 72 65 74 41 64 64 72 20 3d 20 73 71 6c 69 74   retAddr = sqlit
22ee0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
22ef0 4f 50 5f 52 65 74 75 72 6e 2c 20 70 49 74 65 6d  OP_Return, pItem
22f00 2d 3e 72 65 67 52 65 74 75 72 6e 29 3b 0a 20 20  ->regReturn);.  
22f10 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
22f20 28 76 2c 20 22 65 6e 64 20 25 73 22 2c 20 70 49  (v, "end %s", pI
22f30 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
22f40 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
22f50 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
22f60 20 74 6f 70 41 64 64 72 2c 20 72 65 74 41 64 64   topAddr, retAdd
22f70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
22f80 33 43 6c 65 61 72 54 65 6d 70 52 65 67 43 61 63  3ClearTempRegCac
22f90 68 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  he(pParse);.    
22fa0 7d 0a 20 20 20 20 69 66 28 20 2f 2a 70 50 61 72  }.    if( /*pPar
22fb0 73 65 2d 3e 6e 45 72 72 20 7c 7c 2a 2f 20 64 62  se->nErr ||*/ db
22fc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
22fd0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 6c  {.      goto sel
22fe0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20  ect_end;.    }. 
22ff0 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
23000 68 74 20 2d 3d 20 73 71 6c 69 74 65 33 53 65 6c  ht -= sqlite3Sel
23010 65 63 74 45 78 70 72 48 65 69 67 68 74 28 70 29  ectExprHeight(p)
23020 3b 0a 20 20 20 20 70 54 61 62 4c 69 73 74 20 3d  ;.    pTabList =
23030 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 69 66   p->pSrc;.    if
23040 28 20 21 49 67 6e 6f 72 61 62 6c 65 4f 72 64 65  ( !IgnorableOrde
23050 72 62 79 28 70 44 65 73 74 29 20 29 7b 0a 20 20  rby(pDest) ){.  
23060 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70      pOrderBy = p
23070 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
23080 7d 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  }.  }.  pEList =
23090 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 23 65 6e 64   p->pEList;.#end
230a0 69 66 0a 20 20 70 57 68 65 72 65 20 3d 20 70 2d  if.  pWhere = p-
230b0 3e 70 57 68 65 72 65 3b 0a 20 20 70 47 72 6f 75  >pWhere;.  pGrou
230c0 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42  pBy = p->pGroupB
230d0 79 3b 0a 20 20 70 48 61 76 69 6e 67 20 3d 20 70  y;.  pHaving = p
230e0 2d 3e 70 48 61 76 69 6e 67 3b 0a 20 20 73 44 69  ->pHaving;.  sDi
230f0 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3d 20  stinct.isTnct = 
23100 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
23110 46 5f 44 69 73 74 69 6e 63 74 29 21 3d 30 3b 0a  F_Distinct)!=0;.
23120 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
23130 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
23140 4c 45 43 54 0a 20 20 2f 2a 20 49 66 20 74 68 65  LECT.  /* If the
23150 72 65 20 69 73 20 61 72 65 20 61 20 73 65 71 75  re is are a sequ
23160 65 6e 63 65 20 6f 66 20 71 75 65 72 69 65 73 2c  ence of queries,
23170 20 64 6f 20 74 68 65 20 65 61 72 6c 69 65 72 20   do the earlier 
23180 6f 6e 65 73 20 66 69 72 73 74 2e 0a 20 20 2a 2f  ones first..  */
23190 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72  .  if( p->pPrior
231a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   ){.    if( p->p
231b0 52 69 67 68 74 6d 6f 73 74 3d 3d 30 20 29 7b 0a  Rightmost==0 ){.
231c0 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4c        Select *pL
231d0 6f 6f 70 2c 20 2a 70 52 69 67 68 74 20 3d 20 30  oop, *pRight = 0
231e0 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  ;.      int cnt 
231f0 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d  = 0;.      int m
23200 78 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 66  xSelect;.      f
23210 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
23220 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p; pLoop=pLoop->
23230 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a  pPrior, cnt++){.
23240 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70          pLoop->p
23250 52 69 67 68 74 6d 6f 73 74 20 3d 20 70 3b 0a 20  Rightmost = p;. 
23260 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e         pLoop->pN
23270 65 78 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ext = pRight;.  
23280 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
23290 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Loop;.      }.  
232a0 20 20 20 20 6d 78 53 65 6c 65 63 74 20 3d 20 64      mxSelect = d
232b0 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
232c0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
232d0 53 45 4c 45 43 54 5d 3b 0a 20 20 20 20 20 20 69  SELECT];.      i
232e0 66 28 20 6d 78 53 65 6c 65 63 74 20 26 26 20 63  f( mxSelect && c
232f0 6e 74 3e 6d 78 53 65 6c 65 63 74 20 29 7b 0a 20  nt>mxSelect ){. 
23300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
23310 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
23320 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
23330 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  n compound SELEC
23340 54 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  T");.        got
23350 6f 20 73 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20  o select_end;.  
23360 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23370 72 63 20 3d 20 6d 75 6c 74 69 53 65 6c 65 63 74  rc = multiSelect
23380 28 70 50 61 72 73 65 2c 20 70 2c 20 70 44 65 73  (pParse, p, pDes
23390 74 29 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 53  t);.    explainS
233a0 65 74 49 6e 74 65 67 65 72 28 70 50 61 72 73 65  etInteger(pParse
233b0 2d 3e 69 53 65 6c 65 63 74 49 64 2c 20 69 52 65  ->iSelectId, iRe
233c0 73 74 6f 72 65 53 65 6c 65 63 74 49 64 29 3b 0a  storeSelectId);.
233d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
233e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
233f0 49 66 20 74 68 65 72 65 20 69 73 20 62 6f 74 68  If there is both
23400 20 61 20 47 52 4f 55 50 20 42 59 20 61 6e 64 20   a GROUP BY and 
23410 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
23420 73 65 20 61 6e 64 20 74 68 65 79 20 61 72 65 0a  se and they are.
23430 20 20 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20    ** identical, 
23440 74 68 65 6e 20 64 69 73 61 62 6c 65 20 74 68 65  then disable the
23450 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
23460 20 73 69 6e 63 65 20 74 68 65 20 47 52 4f 55 50   since the GROUP
23470 20 42 59 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 61   BY.  ** will ca
23480 75 73 65 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20  use elements to 
23490 63 6f 6d 65 20 6f 75 74 20 69 6e 20 74 68 65 20  come out in the 
234a0 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 20 20  correct order.  
234b0 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 61 6e 20  This is.  ** an 
234c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 74  optimization - t
234d0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
234e0 72 20 73 68 6f 75 6c 64 20 72 65 73 75 6c 74 20  r should result 
234f0 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 2a 2a  regardless..  **
23500 20 55 73 65 20 74 68 65 20 53 51 4c 49 54 45 5f   Use the SQLITE_
23510 47 72 6f 75 70 42 79 4f 72 64 65 72 20 66 6c 61  GroupByOrder fla
23520 67 20 77 69 74 68 20 53 51 4c 49 54 45 5f 54 45  g with SQLITE_TE
23530 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 45 52  STCTRL_OPTIMIZER
23540 0a 20 20 2a 2a 20 74 6f 20 64 69 73 61 62 6c 65  .  ** to disable
23550 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
23560 6f 6e 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  on for testing p
23570 75 72 70 6f 73 65 73 2e 0a 20 20 2a 2f 0a 20 20  urposes..  */.  
23580 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c  if( sqlite3ExprL
23590 69 73 74 43 6f 6d 70 61 72 65 28 70 2d 3e 70 47  istCompare(p->pG
235a0 72 6f 75 70 42 79 2c 20 70 4f 72 64 65 72 42 79  roupBy, pOrderBy
235b0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
235c0 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61   OptimizationEna
235d0 62 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f  bled(db, SQLITE_
235e0 47 72 6f 75 70 42 79 4f 72 64 65 72 29 20 29 7b  GroupByOrder) ){
235f0 0a 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20  .    pOrderBy = 
23600 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  0;.  }..  /* If 
23610 74 68 65 20 71 75 65 72 79 20 69 73 20 44 49 53  the query is DIS
23620 54 49 4e 43 54 20 77 69 74 68 20 61 6e 20 4f 52  TINCT with an OR
23630 44 45 52 20 42 59 20 62 75 74 20 69 73 20 6e 6f  DER BY but is no
23640 74 20 61 6e 20 61 67 67 72 65 67 61 74 65 2c 20  t an aggregate, 
23650 61 6e 64 20 0a 20 20 2a 2a 20 69 66 20 74 68 65  and .  ** if the
23660 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 69 73 20   select-list is 
23670 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
23680 4f 52 44 45 52 20 42 59 20 6c 69 73 74 2c 20 74  ORDER BY list, t
23690 68 65 6e 20 74 68 69 73 20 71 75 65 72 79 0a 20  hen this query. 
236a0 20 2a 2a 20 63 61 6e 20 62 65 20 72 65 77 72 69   ** can be rewri
236b0 74 74 65 6e 20 61 73 20 61 20 47 52 4f 55 50 20  tten as a GROUP 
236c0 42 59 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  BY. In other wor
236d0 64 73 2c 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ds, this:.  **. 
236e0 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 44   **     SELECT D
236f0 49 53 54 49 4e 43 54 20 78 79 7a 20 46 52 4f 4d  ISTINCT xyz FROM
23700 20 2e 2e 2e 20 4f 52 44 45 52 20 42 59 20 78 79   ... ORDER BY xy
23710 7a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 74  z.  **.  ** is t
23720 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 3a 0a 20  ransformed to:. 
23730 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c   **.  **     SEL
23740 45 43 54 20 78 79 7a 20 46 52 4f 4d 20 2e 2e 2e  ECT xyz FROM ...
23750 20 47 52 4f 55 50 20 42 59 20 78 79 7a 0a 20 20   GROUP BY xyz.  
23760 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  **.  ** The seco
23770 6e 64 20 66 6f 72 6d 20 69 73 20 70 72 65 66 65  nd form is prefe
23780 72 72 65 64 20 61 73 20 61 20 73 69 6e 67 6c 65  rred as a single
23790 20 69 6e 64 65 78 20 28 6f 72 20 74 65 6d 70 2d   index (or temp-
237a0 74 61 62 6c 65 29 20 6d 61 79 20 62 65 20 0a 20  table) may be . 
237b0 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 62 6f 74   ** used for bot
237c0 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 61  h the ORDER BY a
237d0 6e 64 20 44 49 53 54 49 4e 43 54 20 70 72 6f 63  nd DISTINCT proc
237e0 65 73 73 69 6e 67 2e 20 41 73 20 6f 72 69 67 69  essing. As origi
237f0 6e 61 6c 6c 79 20 0a 20 20 2a 2a 20 77 72 69 74  nally .  ** writ
23800 74 65 6e 20 74 68 65 20 71 75 65 72 79 20 6d 75  ten the query mu
23810 73 74 20 75 73 65 20 61 20 74 65 6d 70 2d 74 61  st use a temp-ta
23820 62 6c 65 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ble for at least
23830 20 6f 6e 65 20 6f 66 20 74 68 65 20 4f 52 44 45   one of the ORDE
23840 52 20 0a 20 20 2a 2a 20 42 59 20 61 6e 64 20 44  R .  ** BY and D
23850 49 53 54 49 4e 43 54 2c 20 61 6e 64 20 61 6e 20  ISTINCT, and an 
23860 69 6e 64 65 78 20 6f 72 20 73 65 70 61 72 61 74  index or separat
23870 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 66 6f 72  e temp-table for
23880 20 74 68 65 20 6f 74 68 65 72 2e 0a 20 20 2a 2f   the other..  */
23890 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
238a0 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69 6e  ags & (SF_Distin
238b0 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65 29  ct|SF_Aggregate)
238c0 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 0a  )==SF_Distinct .
238d0 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
238e0 72 4c 69 73 74 43 6f 6d 70 61 72 65 28 70 4f 72  rListCompare(pOr
238f0 64 65 72 42 79 2c 20 70 2d 3e 70 45 4c 69 73 74  derBy, p->pEList
23900 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 2d  )==0.  ){.    p-
23910 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
23920 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 70  _Distinct;.    p
23930 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71 6c  ->pGroupBy = sql
23940 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
23950 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2c 20 30  db, p->pEList, 0
23960 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  );.    pGroupBy 
23970 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
23980 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b     pOrderBy = 0;
23990 0a 20 20 20 20 2f 2a 20 4e 6f 74 69 63 65 20 74  .    /* Notice t
239a0 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 74  hat even thought
239b0 20 53 46 5f 44 69 73 74 69 6e 63 74 20 68 61 73   SF_Distinct has
239c0 20 62 65 65 6e 20 63 6c 65 61 72 65 64 20 66 72   been cleared fr
239d0 6f 6d 20 70 2d 3e 73 65 6c 46 6c 61 67 73 2c 0a  om p->selFlags,.
239e0 20 20 20 20 2a 2a 20 74 68 65 20 73 44 69 73 74      ** the sDist
239f0 69 6e 63 74 2e 69 73 54 6e 63 74 20 69 73 20 73  inct.isTnct is s
23a00 74 69 6c 6c 20 73 65 74 2e 20 20 48 65 6e 63 65  till set.  Hence
23a10 2c 20 69 73 54 6e 63 74 20 72 65 70 72 65 73 65  , isTnct represe
23a20 6e 74 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  nts the.    ** o
23a30 72 69 67 69 6e 61 6c 20 73 65 74 74 69 6e 67 20  riginal setting 
23a40 6f 66 20 74 68 65 20 53 46 5f 44 69 73 74 69 6e  of the SF_Distin
23a50 63 74 20 66 6c 61 67 2c 20 6e 6f 74 20 74 68 65  ct flag, not the
23a60 20 63 75 72 72 65 6e 74 20 73 65 74 74 69 6e 67   current setting
23a70 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
23a80 73 44 69 73 74 69 6e 63 74 2e 69 73 54 6e 63 74  sDistinct.isTnct
23a90 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
23aa0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
23ab0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
23ac0 65 6e 20 74 68 69 73 20 73 6f 72 74 69 6e 67 0a  en this sorting.
23ad0 20 20 2a 2a 20 69 6e 64 65 78 20 6d 69 67 68 74    ** index might
23ae0 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 75 6e   end up being un
23af0 75 73 65 64 20 69 66 20 74 68 65 20 64 61 74 61  used if the data
23b00 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 65 78   can be .  ** ex
23b10 74 72 61 63 74 65 64 20 69 6e 20 70 72 65 2d 73  tracted in pre-s
23b20 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 49 66  orted order.  If
23b30 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
23b40 65 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a  e, then the.  **
23b50 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61   OP_OpenEphemera
23b60 6c 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69  l instruction wi
23b70 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ll be changed to
23b80 20 61 6e 20 4f 50 5f 4e 6f 6f 70 20 6f 6e 63 65   an OP_Noop once
23b90 0a 20 20 2a 2a 20 77 65 20 66 69 67 75 72 65 20  .  ** we figure 
23ba0 6f 75 74 20 74 68 61 74 20 74 68 65 20 73 6f 72  out that the sor
23bb0 74 69 6e 67 20 69 6e 64 65 78 20 69 73 20 6e 6f  ting index is no
23bc0 74 20 6e 65 65 64 65 64 2e 20 20 54 68 65 20 61  t needed.  The a
23bd0 64 64 72 53 6f 72 74 49 6e 64 65 78 0a 20 20 2a  ddrSortIndex.  *
23be0 2a 20 76 61 72 69 61 62 6c 65 20 69 73 20 75 73  * variable is us
23bf0 65 64 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  ed to facilitate
23c00 20 74 68 61 74 20 63 68 61 6e 67 65 2e 0a 20 20   that change..  
23c10 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
23c20 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  y ){.    KeyInfo
23c30 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20   *pKeyInfo;.    
23c40 70 4b 65 79 49 6e 66 6f 20 3d 20 6b 65 79 49 6e  pKeyInfo = keyIn
23c50 66 6f 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70  foFromExprList(p
23c60 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79 29  Parse, pOrderBy)
23c70 3b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  ;.    pOrderBy->
23c80 69 45 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73  iECursor = pPars
23c90 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 70  e->nTab++;.    p
23ca0 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b 32  ->addrOpenEphm[2
23cb0 5d 20 3d 20 61 64 64 72 53 6f 72 74 49 6e 64 65  ] = addrSortInde
23cc0 78 20 3d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x =.      sqlite
23cd0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
23ce0 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72 61 6c 2c  P_OpenEphemeral,
23cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23d00 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72 64              pOrd
23d10 65 72 42 79 2d 3e 69 45 43 75 72 73 6f 72 2c 20  erBy->iECursor, 
23d20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 2b  pOrderBy->nExpr+
23d30 32 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  2, 0,.          
23d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d50 20 28 63 68 61 72 2a 29 70 4b 65 79 49 6e 66 6f   (char*)pKeyInfo
23d60 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
23d70 44 4f 46 46 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  DOFF);.  }else{.
23d80 20 20 20 20 61 64 64 72 53 6f 72 74 49 6e 64 65      addrSortInde
23d90 78 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  x = -1;.  }..  /
23da0 2a 20 49 66 20 74 68 65 20 6f 75 74 70 75 74 20  * If the output 
23db0 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20  is destined for 
23dc0 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  a temporary tabl
23dd0 65 2c 20 6f 70 65 6e 20 74 68 61 74 20 74 61 62  e, open that tab
23de0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
23df0 44 65 73 74 2d 3e 65 44 65 73 74 3d 3d 53 52 54  Dest->eDest==SRT
23e00 5f 45 70 68 65 6d 54 61 62 20 29 7b 0a 20 20 20  _EphemTab ){.   
23e10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
23e20 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e 45 70 68  p2(v, OP_OpenEph
23e30 65 6d 65 72 61 6c 2c 20 70 44 65 73 74 2d 3e 69  emeral, pDest->i
23e40 53 44 50 61 72 6d 2c 20 70 45 4c 69 73 74 2d 3e  SDParm, pEList->
23e50 6e 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f  nExpr);.  }..  /
23e60 2a 20 53 65 74 20 74 68 65 20 6c 69 6d 69 74 65  * Set the limite
23e70 72 2e 0a 20 20 2a 2f 0a 20 20 69 45 6e 64 20 3d  r..  */.  iEnd =
23e80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
23e90 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 2d 3e 6e  Label(v);.  p->n
23ea0 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75  SelectRow = (dou
23eb0 62 6c 65 29 4c 41 52 47 45 53 54 5f 49 4e 54 36  ble)LARGEST_INT6
23ec0 34 3b 0a 20 20 63 6f 6d 70 75 74 65 4c 69 6d 69  4;.  computeLimi
23ed0 74 52 65 67 69 73 74 65 72 73 28 70 50 61 72 73  tRegisters(pPars
23ee0 65 2c 20 70 2c 20 69 45 6e 64 29 3b 0a 20 20 69  e, p, iEnd);.  i
23ef0 66 28 20 70 2d 3e 69 4c 69 6d 69 74 3d 3d 30 20  f( p->iLimit==0 
23f00 26 26 20 61 64 64 72 53 6f 72 74 49 6e 64 65 78  && addrSortIndex
23f10 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
23f20 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 61  e3VdbeGetOp(v, a
23f30 64 64 72 53 6f 72 74 49 6e 64 65 78 29 2d 3e 6f  ddrSortIndex)->o
23f40 70 63 6f 64 65 20 3d 20 4f 50 5f 53 6f 72 74 65  pcode = OP_Sorte
23f50 72 4f 70 65 6e 3b 0a 20 20 20 20 70 2d 3e 73 65  rOpen;.    p->se
23f60 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 55 73 65  lFlags |= SF_Use
23f70 53 6f 72 74 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  Sorter;.  }..  /
23f80 2a 20 4f 70 65 6e 20 61 20 76 69 72 74 75 61 6c  * Open a virtual
23f90 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
23fa0 72 20 74 68 65 20 64 69 73 74 69 6e 63 74 20 73  r the distinct s
23fb0 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
23fc0 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
23fd0 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20  Distinct ){.    
23fe0 73 44 69 73 74 69 6e 63 74 2e 74 61 62 54 6e 63  sDistinct.tabTnc
23ff0 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  t = pParse->nTab
24000 2b 2b 3b 0a 20 20 20 20 73 44 69 73 74 69 6e 63  ++;.    sDistinc
24010 74 2e 61 64 64 72 54 6e 63 74 20 3d 20 73 71 6c  t.addrTnct = sql
24020 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
24030 2c 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  , OP_OpenEphemer
24040 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 20 20 20 20 73 44 69 73 74 69 6e 63 74 2e 74 61      sDistinct.ta
24070 62 54 6e 63 74 2c 20 30 2c 20 30 2c 0a 20 20 20  bTnct, 0, 0,.   
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24090 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
240a0 61 72 2a 29 6b 65 79 49 6e 66 6f 46 72 6f 6d 45  ar*)keyInfoFromE
240b0 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  xprList(pParse, 
240c0 70 2d 3e 70 45 4c 69 73 74 29 2c 0a 20 20 20 20  p->pEList),.    
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240e0 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f 4b              P4_K
240f0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
24100 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
24110 43 68 61 6e 67 65 50 35 28 76 2c 20 42 54 52 45  ChangeP5(v, BTRE
24120 45 5f 55 4e 4f 52 44 45 52 45 44 29 3b 0a 20 20  E_UNORDERED);.  
24130 20 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63    sDistinct.eTnc
24140 74 54 79 70 65 20 3d 20 57 48 45 52 45 5f 44 49  tType = WHERE_DI
24150 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44  STINCT_UNORDERED
24160 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
24170 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54 79  Distinct.eTnctTy
24180 70 65 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49  pe = WHERE_DISTI
24190 4e 43 54 5f 4e 4f 4f 50 3b 0a 20 20 7d 0a 0a 20  NCT_NOOP;.  }.. 
241a0 20 69 66 28 20 21 69 73 41 67 67 20 26 26 20 70   if( !isAgg && p
241b0 47 72 6f 75 70 42 79 3d 3d 30 20 29 7b 0a 20 20  GroupBy==0 ){.  
241c0 20 20 2f 2a 20 4e 6f 20 61 67 67 72 65 67 61 74    /* No aggregat
241d0 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  e functions and 
241e0 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  no GROUP BY clau
241f0 73 65 20 2a 2f 0a 20 20 20 20 45 78 70 72 4c 69  se */.    ExprLi
24200 73 74 20 2a 70 44 69 73 74 20 3d 20 28 73 44 69  st *pDist = (sDi
24210 73 74 69 6e 63 74 2e 69 73 54 6e 63 74 20 3f 20  stinct.isTnct ? 
24220 70 2d 3e 70 45 4c 69 73 74 20 3a 20 30 29 3b 0a  p->pEList : 0);.
24230 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 74 68  .    /* Begin th
24240 65 20 64 61 74 61 62 61 73 65 20 73 63 61 6e 2e  e database scan.
24250 20 2a 2f 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d   */.    pWInfo =
24260 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
24270 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  in(pParse, pTabL
24280 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 4f 72  ist, pWhere, pOr
24290 64 65 72 42 79 2c 20 70 44 69 73 74 2c 20 30 2c  derBy, pDist, 0,
242a0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  0);.    if( pWIn
242b0 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
242c0 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28  ect_end;.    if(
242d0 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
242e0 20 3c 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   < p->nSelectRow
242f0 20 29 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77   ) p->nSelectRow
24300 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f   = pWInfo->nRowO
24310 75 74 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  ut;.    if( pWIn
24320 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 29 20  fo->eDistinct ) 
24330 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74 54  sDistinct.eTnctT
24340 79 70 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 65 44  ype = pWInfo->eD
24350 69 73 74 69 6e 63 74 3b 0a 20 20 20 20 69 66 28  istinct;.    if(
24360 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 57 49   pOrderBy && pWI
24370 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 4f 72  nfo->nOBSat==pOr
24380 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 20 70  derBy->nExpr ) p
24390 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20  OrderBy = 0;..  
243a0 20 20 2f 2a 20 49 66 20 73 6f 72 74 69 6e 67 20    /* If sorting 
243b0 69 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 63  index that was c
243c0 72 65 61 74 65 64 20 62 79 20 61 20 70 72 69 6f  reated by a prio
243d0 72 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  r OP_OpenEphemer
243e0 61 6c 20 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72  al .    ** instr
243f0 75 63 74 69 6f 6e 20 65 6e 64 65 64 20 75 70 20  uction ended up 
24400 6e 6f 74 20 62 65 69 6e 67 20 6e 65 65 64 65 64  not being needed
24410 2c 20 74 68 65 6e 20 63 68 61 6e 67 65 20 74 68  , then change th
24420 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d 65 72  e OP_OpenEphemer
24430 61 6c 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 61  al.    ** into a
24440 6e 20 4f 50 5f 4e 6f 6f 70 2e 0a 20 20 20 20 2a  n OP_Noop..    *
24450 2f 0a 20 20 20 20 69 66 28 20 61 64 64 72 53 6f  /.    if( addrSo
24460 72 74 49 6e 64 65 78 3e 3d 30 20 26 26 20 70 4f  rtIndex>=0 && pO
24470 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20 20  rderBy==0 ){.   
24480 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
24490 61 6e 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 61 64  angeToNoop(v, ad
244a0 64 72 53 6f 72 74 49 6e 64 65 78 29 3b 0a 20 20  drSortIndex);.  
244b0 20 20 20 20 70 2d 3e 61 64 64 72 4f 70 65 6e 45      p->addrOpenE
244c0 70 68 6d 5b 32 5d 20 3d 20 2d 31 3b 0a 20 20 20  phm[2] = -1;.   
244d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74   }..    /* Use t
244e0 68 65 20 73 74 61 6e 64 61 72 64 20 69 6e 6e 65  he standard inne
244f0 72 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 73  r loop. */.    s
24500 65 6c 65 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70  electInnerLoop(p
24510 50 61 72 73 65 2c 20 70 2c 20 70 45 4c 69 73 74  Parse, p, pEList
24520 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
24530 2c 20 26 73 44 69 73 74 69 6e 63 74 2c 20 70 44  , &sDistinct, pD
24540 65 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  est,.           
24550 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d           pWInfo-
24560 3e 69 43 6f 6e 74 69 6e 75 65 2c 20 70 57 49 6e  >iContinue, pWIn
24570 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
24580 20 20 2f 2a 20 45 6e 64 20 74 68 65 20 64 61 74    /* End the dat
24590 61 62 61 73 65 20 73 63 61 6e 20 6c 6f 6f 70 2e  abase scan loop.
245a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
245b0 74 65 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e  te3WhereEnd(pWIn
245c0 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
245d0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 77    /* This case w
245e0 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 20  hen there exist 
245f0 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
24600 6f 6e 73 20 6f 72 20 61 20 47 52 4f 55 50 20 42  ons or a GROUP B
24610 59 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  Y clause.    ** 
24620 6f 72 20 62 6f 74 68 20 2a 2f 0a 20 20 20 20 4e  or both */.    N
24630 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
24640 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
24650 78 74 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  xt for processin
24660 67 20 61 67 67 72 65 67 61 74 65 20 69 6e 66 6f  g aggregate info
24670 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  rmation */.    i
24680 6e 74 20 69 41 4d 65 6d 3b 20 20 20 20 20 20 20  nt iAMem;       
24690 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20     /* First Mem 
246a0 61 64 64 72 65 73 73 20 66 6f 72 20 73 74 6f 72  address for stor
246b0 69 6e 67 20 63 75 72 72 65 6e 74 20 47 52 4f 55  ing current GROU
246c0 50 20 42 59 20 2a 2f 0a 20 20 20 20 69 6e 74 20  P BY */.    int 
246d0 69 42 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20  iBMem;          
246e0 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 61 64 64  /* First Mem add
246f0 72 65 73 73 20 66 6f 72 20 70 72 65 76 69 6f 75  ress for previou
24700 73 20 47 52 4f 55 50 20 42 59 20 2a 2f 0a 20 20  s GROUP BY */.  
24710 20 20 69 6e 74 20 69 55 73 65 46 6c 61 67 3b 20    int iUseFlag; 
24720 20 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64        /* Mem add
24730 72 65 73 73 20 68 6f 6c 64 69 6e 67 20 66 6c 61  ress holding fla
24740 67 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  g indicating tha
24750 74 20 61 74 20 6c 65 61 73 74 0a 20 20 20 20 20  t at least.     
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 2a 2a 20 6f 6e 65 20 72 6f 77 20 6f 66     ** one row of
24780 20 74 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   the input to th
24790 65 20 61 67 67 72 65 67 61 74 6f 72 20 68 61 73  e aggregator has
247a0 20 62 65 65 6e 0a 20 20 20 20 20 20 20 20 20 20   been.          
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
247c0 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20   processed */.  
247d0 20 20 69 6e 74 20 69 41 62 6f 72 74 46 6c 61 67    int iAbortFlag
247e0 3b 20 20 20 20 20 2f 2a 20 4d 65 6d 20 61 64 64  ;     /* Mem add
247f0 72 65 73 73 20 77 68 69 63 68 20 63 61 75 73 65  ress which cause
24800 73 20 71 75 65 72 79 20 61 62 6f 72 74 20 69 66  s query abort if
24810 20 70 6f 73 69 74 69 76 65 20 2a 2f 0a 20 20 20   positive */.   
24820 20 69 6e 74 20 67 72 6f 75 70 42 79 53 6f 72 74   int groupBySort
24830 3b 20 20 20 20 2f 2a 20 52 6f 77 73 20 63 6f 6d  ;    /* Rows com
24840 65 20 66 72 6f 6d 20 73 6f 75 72 63 65 20 69 6e  e from source in
24850 20 47 52 4f 55 50 20 42 59 20 6f 72 64 65 72 20   GROUP BY order 
24860 2a 2f 0a 20 20 20 20 69 6e 74 20 61 64 64 72 45  */.    int addrE
24870 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e  nd;        /* En
24880 64 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67 20  d of processing 
24890 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 20  for this SELECT 
248a0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 6f 72 74 50  */.    int sortP
248b0 54 61 62 20 3d 20 30 3b 20 20 20 2f 2a 20 50 73  Tab = 0;   /* Ps
248c0 65 75 64 6f 74 61 62 6c 65 20 75 73 65 64 20 74  eudotable used t
248d0 6f 20 64 65 63 6f 64 65 20 73 6f 72 74 69 6e 67  o decode sorting
248e0 20 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20   results */.    
248f0 69 6e 74 20 73 6f 72 74 4f 75 74 20 3d 20 30 3b  int sortOut = 0;
24900 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 72 65      /* Output re
24910 67 69 73 74 65 72 20 66 72 6f 6d 20 74 68 65 20  gister from the 
24920 73 6f 72 74 65 72 20 2a 2f 0a 0a 20 20 20 20 2f  sorter */..    /
24930 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 61 6e 64  * Remove any and
24940 20 61 6c 6c 20 61 6c 69 61 73 65 73 20 62 65 74   all aliases bet
24950 77 65 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  ween the result 
24960 73 65 74 20 61 6e 64 20 74 68 65 0a 20 20 20 20  set and the.    
24970 2a 2a 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  ** GROUP BY clau
24980 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
24990 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
249a0 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
249b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
249d0 65 72 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75  er */.      stru
249e0 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
249f0 20 2a 70 49 74 65 6d 3b 20 20 2f 2a 20 46 6f 72   *pItem;  /* For
24a00 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
24a10 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 20 6c 69  pression in a li
24a20 73 74 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  st */..      for
24a30 28 6b 3d 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  (k=p->pEList->nE
24a40 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 70 45  xpr, pItem=p->pE
24a50 4c 69 73 74 2d 3e 61 3b 20 6b 3e 30 3b 20 6b 2d  List->a; k>0; k-
24a60 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  -, pItem++){.   
24a70 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 41 6c 69       pItem->iAli
24a80 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  as = 0;.      }.
24a90 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 47 72 6f        for(k=pGro
24aa0 75 70 42 79 2d 3e 6e 45 78 70 72 2c 20 70 49 74  upBy->nExpr, pIt
24ab0 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
24ac0 6b 3e 30 3b 20 6b 2d 2d 2c 20 70 49 74 65 6d 2b  k>0; k--, pItem+
24ad0 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65  +){.        pIte
24ae0 6d 2d 3e 69 41 6c 69 61 73 20 3d 20 30 3b 0a 20  m->iAlias = 0;. 
24af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
24b00 20 70 2d 3e 6e 53 65 6c 65 63 74 52 6f 77 3e 28   p->nSelectRow>(
24b10 64 6f 75 62 6c 65 29 31 30 30 20 29 20 70 2d 3e  double)100 ) p->
24b20 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f  nSelectRow = (do
24b30 75 62 6c 65 29 31 30 30 3b 0a 20 20 20 20 7d 65  uble)100;.    }e
24b40 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 53  lse{.      p->nS
24b50 65 6c 65 63 74 52 6f 77 20 3d 20 28 64 6f 75 62  electRow = (doub
24b60 6c 65 29 31 3b 0a 20 20 20 20 7d 0a 0a 20 0a 20  le)1;.    }.. . 
24b70 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6c     /* Create a l
24b80 61 62 65 6c 20 74 6f 20 6a 75 6d 70 20 74 6f 20  abel to jump to 
24b90 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20  when we want to 
24ba0 61 62 6f 72 74 20 74 68 65 20 71 75 65 72 79 20  abort the query 
24bb0 2a 2f 0a 20 20 20 20 61 64 64 72 45 6e 64 20 3d  */.    addrEnd =
24bc0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
24bd0 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f  Label(v);..    /
24be0 2a 20 43 6f 6e 76 65 72 74 20 54 4b 5f 43 4f 4c  * Convert TK_COL
24bf0 55 4d 4e 20 6e 6f 64 65 73 20 69 6e 74 6f 20 54  UMN nodes into T
24c00 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 61 6e 64  K_AGG_COLUMN and
24c10 20 6d 61 6b 65 20 65 6e 74 72 69 65 73 20 69 6e   make entries in
24c20 0a 20 20 20 20 2a 2a 20 73 41 67 67 49 6e 66 6f  .    ** sAggInfo
24c30 20 66 6f 72 20 61 6c 6c 20 54 4b 5f 41 47 47 5f   for all TK_AGG_
24c40 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 73 20 69  FUNCTION nodes i
24c50 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  n expressions of
24c60 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 45 4c 45   the.    ** SELE
24c70 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  CT statement..  
24c80 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
24c90 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
24ca0 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
24cb0 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
24cc0 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
24cd0 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 20   = pTabList;.   
24ce0 20 73 4e 43 2e 70 41 67 67 49 6e 66 6f 20 3d 20   sNC.pAggInfo = 
24cf0 26 73 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 73  &sAggInfo;.    s
24d00 41 67 67 49 6e 66 6f 2e 6e 53 6f 72 74 69 6e 67  AggInfo.nSorting
24d10 43 6f 6c 75 6d 6e 20 3d 20 70 47 72 6f 75 70 42  Column = pGroupB
24d20 79 20 3f 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y ? pGroupBy->nE
24d30 78 70 72 2b 31 20 3a 20 30 3b 0a 20 20 20 20 73  xpr+1 : 0;.    s
24d40 41 67 67 49 6e 66 6f 2e 70 47 72 6f 75 70 42 79  AggInfo.pGroupBy
24d50 20 3d 20 70 47 72 6f 75 70 42 79 3b 0a 20 20 20   = pGroupBy;.   
24d60 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
24d70 79 7a 65 41 67 67 4c 69 73 74 28 26 73 4e 43 2c  yzeAggList(&sNC,
24d80 20 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 73 71   pEList);.    sq
24d90 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
24da0 41 67 67 4c 69 73 74 28 26 73 4e 43 2c 20 70 4f  AggList(&sNC, pO
24db0 72 64 65 72 42 79 29 3b 0a 20 20 20 20 69 66 28  rderBy);.    if(
24dc0 20 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20   pHaving ){.    
24dd0 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61    sqlite3ExprAna
24de0 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 26  lyzeAggregates(&
24df0 73 4e 43 2c 20 70 48 61 76 69 6e 67 29 3b 0a 20  sNC, pHaving);. 
24e00 20 20 20 7d 0a 20 20 20 20 73 41 67 67 49 6e 66     }.    sAggInf
24e10 6f 2e 6e 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d  o.nAccumulator =
24e20 20 73 41 67 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d   sAggInfo.nColum
24e30 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  n;.    for(i=0; 
24e40 69 3c 73 41 67 67 49 6e 66 6f 2e 6e 46 75 6e 63  i<sAggInfo.nFunc
24e50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
24e60 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
24e70 6f 70 65 72 74 79 28 73 41 67 67 49 6e 66 6f 2e  operty(sAggInfo.
24e80 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70 72 2c 20  aFunc[i].pExpr, 
24e90 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
24ea0 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
24eb0 67 73 20 7c 3d 20 4e 43 5f 49 6e 41 67 67 46 75  gs |= NC_InAggFu
24ec0 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
24ed0 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 4c  3ExprAnalyzeAggL
24ee0 69 73 74 28 26 73 4e 43 2c 20 73 41 67 67 49 6e  ist(&sNC, sAggIn
24ef0 66 6f 2e 61 46 75 6e 63 5b 69 5d 2e 70 45 78 70  fo.aFunc[i].pExp
24f00 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20  r->x.pList);.   
24f10 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
24f20 3d 20 7e 4e 43 5f 49 6e 41 67 67 46 75 6e 63 3b  = ~NC_InAggFunc;
24f30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
24f40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
24f50 29 20 67 6f 74 6f 20 73 65 6c 65 63 74 5f 65 6e  ) goto select_en
24f60 64 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  d;..    /* Proce
24f70 73 73 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  ssing for aggreg
24f80 61 74 65 73 20 77 69 74 68 20 47 52 4f 55 50 20  ates with GROUP 
24f90 42 59 20 69 73 20 76 65 72 79 20 64 69 66 66 65  BY is very diffe
24fa0 72 65 6e 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  rent and.    ** 
24fb0 6d 75 63 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  much more comple
24fc0 78 20 74 68 61 6e 20 61 67 67 72 65 67 61 74 65  x than aggregate
24fd0 73 20 77 69 74 68 6f 75 74 20 61 20 47 52 4f 55  s without a GROU
24fe0 50 20 42 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  P BY..    */.   
24ff0 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
25000 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
25010 70 4b 65 79 49 6e 66 6f 3b 20 20 2f 2a 20 4b 65  pKeyInfo;  /* Ke
25020 79 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ying information
25030 20 66 6f 72 20 74 68 65 20 67 72 6f 75 70 20 62   for the group b
25040 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  y clause */.    
25050 20 20 69 6e 74 20 6a 31 3b 20 20 20 20 20 20 20    int j1;       
25060 20 20 20 20 20 20 2f 2a 20 41 2d 76 73 2d 42 20        /* A-vs-B 
25070 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6a 75 6d 70  comparision jump
25080 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
25090 64 72 4f 75 74 70 75 74 52 6f 77 3b 20 20 2f 2a  drOutputRow;  /*
250a0 20 53 74 61 72 74 20 6f 66 20 73 75 62 72 6f 75   Start of subrou
250b0 74 69 6e 65 20 74 68 61 74 20 6f 75 74 70 75 74  tine that output
250c0 73 20 61 20 72 65 73 75 6c 74 20 72 6f 77 20 2a  s a result row *
250d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 4f  /.      int regO
250e0 75 74 70 75 74 52 6f 77 3b 20 20 20 2f 2a 20 52  utputRow;   /* R
250f0 65 74 75 72 6e 20 61 64 64 72 65 73 73 20 72 65  eturn address re
25100 67 69 73 74 65 72 20 66 6f 72 20 6f 75 74 70 75  gister for outpu
25110 74 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  t subroutine */.
25120 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 53 65        int addrSe
25130 74 41 62 6f 72 74 3b 20 20 20 2f 2a 20 53 65 74  tAbort;   /* Set
25140 20 74 68 65 20 61 62 6f 72 74 20 66 6c 61 67 20   the abort flag 
25150 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20  and return */.  
25160 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70 4f      int addrTopO
25170 66 4c 6f 6f 70 3b 20 20 2f 2a 20 54 6f 70 20 6f  fLoop;  /* Top o
25180 66 20 74 68 65 20 69 6e 70 75 74 20 6c 6f 6f 70  f the input loop
25190 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
251a0 64 72 53 6f 72 74 69 6e 67 49 64 78 3b 20 2f 2a  drSortingIdx; /*
251b0 20 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65   The OP_OpenEphe
251c0 6d 65 72 61 6c 20 66 6f 72 20 74 68 65 20 73 6f  meral for the so
251d0 72 74 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  rting index */. 
251e0 20 20 20 20 20 69 6e 74 20 61 64 64 72 52 65 73       int addrRes
251f0 65 74 3b 20 20 20 20 20 20 2f 2a 20 53 75 62 72  et;      /* Subr
25200 6f 75 74 69 6e 65 20 66 6f 72 20 72 65 73 65 74  outine for reset
25210 74 69 6e 67 20 74 68 65 20 61 63 63 75 6d 75 6c  ting the accumul
25220 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ator */.      in
25230 74 20 72 65 67 52 65 73 65 74 3b 20 20 20 20 20  t regReset;     
25240 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 64 64 72    /* Return addr
25250 65 73 73 20 72 65 67 69 73 74 65 72 20 66 6f 72  ess register for
25260 20 72 65 73 65 74 20 73 75 62 72 6f 75 74 69 6e   reset subroutin
25270 65 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49  e */..      /* I
25280 66 20 74 68 65 72 65 20 69 73 20 61 20 47 52 4f  f there is a GRO
25290 55 50 20 42 59 20 63 6c 61 75 73 65 20 77 65 20  UP BY clause we 
252a0 6d 69 67 68 74 20 6e 65 65 64 20 61 20 73 6f 72  might need a sor
252b0 74 69 6e 67 20 69 6e 64 65 78 20 74 6f 0a 20 20  ting index to.  
252c0 20 20 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74      ** implement
252d0 20 69 74 2e 20 20 41 6c 6c 6f 63 61 74 65 20 74   it.  Allocate t
252e0 68 61 74 20 73 6f 72 74 69 6e 67 20 69 6e 64 65  hat sorting inde
252f0 78 20 6e 6f 77 2e 20 20 49 66 20 69 74 20 74 75  x now.  If it tu
25300 72 6e 73 20 6f 75 74 0a 20 20 20 20 20 20 2a 2a  rns out.      **
25310 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
25320 6e 65 65 64 20 69 74 20 61 66 74 65 72 20 61 6c  need it after al
25330 6c 2c 20 74 68 65 20 4f 50 5f 53 6f 72 74 65 72  l, the OP_Sorter
25340 4f 70 65 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  Open instruction
25350 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62  .      ** will b
25360 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
25370 20 61 20 4e 6f 6f 70 2e 20 20 0a 20 20 20 20 20   a Noop.  .     
25380 20 2a 2f 0a 20 20 20 20 20 20 73 41 67 67 49 6e   */.      sAggIn
25390 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 20 3d 20  fo.sortingIdx = 
253a0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
253b0 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d        pKeyInfo =
253c0 20 6b 65 79 49 6e 66 6f 46 72 6f 6d 45 78 70 72   keyInfoFromExpr
253d0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 47 72  List(pParse, pGr
253e0 6f 75 70 42 79 29 3b 0a 20 20 20 20 20 20 61 64  oupBy);.      ad
253f0 64 72 53 6f 72 74 69 6e 67 49 64 78 20 3d 20 73  drSortingIdx = s
25400 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
25410 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
25420 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 41  n, .          sA
25430 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64  ggInfo.sortingId
25440 78 2c 20 73 41 67 67 49 6e 66 6f 2e 6e 53 6f 72  x, sAggInfo.nSor
25450 74 69 6e 67 43 6f 6c 75 6d 6e 2c 20 0a 20 20 20  tingColumn, .   
25460 20 20 20 20 20 20 20 30 2c 20 28 63 68 61 72 2a         0, (char*
25470 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45  )pKeyInfo, P4_KE
25480 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
25490 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
254a0 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  lize memory loca
254b0 74 69 6f 6e 73 20 75 73 65 64 20 62 79 20 47 52  tions used by GR
254c0 4f 55 50 20 42 59 20 61 67 67 72 65 67 61 74 65  OUP BY aggregate
254d0 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
254e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 55 73 65 46    */.      iUseF
254f0 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  lag = ++pParse->
25500 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 69 41 62 6f  nMem;.      iAbo
25510 72 74 46 6c 61 67 20 3d 20 2b 2b 70 50 61 72 73  rtFlag = ++pPars
25520 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
25530 65 67 4f 75 74 70 75 74 52 6f 77 20 3d 20 2b 2b  egOutputRow = ++
25540 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
25550 20 20 20 20 61 64 64 72 4f 75 74 70 75 74 52 6f      addrOutputRo
25560 77 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  w = sqlite3VdbeM
25570 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
25580 20 20 20 72 65 67 52 65 73 65 74 20 3d 20 2b 2b     regReset = ++
25590 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
255a0 20 20 20 20 61 64 64 72 52 65 73 65 74 20 3d 20      addrReset = 
255b0 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
255c0 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
255d0 41 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  AMem = pParse->n
255e0 4d 65 6d 20 2b 20 31 3b 0a 20 20 20 20 20 20 70  Mem + 1;.      p
255f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70  Parse->nMem += p
25600 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 0a  GroupBy->nExpr;.
25610 20 20 20 20 20 20 69 42 4d 65 6d 20 3d 20 70 50        iBMem = pP
25620 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a  arse->nMem + 1;.
25630 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d        pParse->nM
25640 65 6d 20 2b 3d 20 70 47 72 6f 75 70 42 79 2d 3e  em += pGroupBy->
25650 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  nExpr;.      sql
25660 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
25670 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
25680 20 69 41 62 6f 72 74 46 6c 61 67 29 3b 0a 20 20   iAbortFlag);.  
25690 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
256a0 28 76 2c 20 22 63 6c 65 61 72 20 61 62 6f 72 74  (v, "clear abort
256b0 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20 20   flag"));.      
256c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
256d0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
256e0 20 30 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a 20   0, iUseFlag);. 
256f0 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
25700 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20 61  ((v, "indicate a
25710 63 63 75 6d 75 6c 61 74 6f 72 20 65 6d 70 74 79  ccumulator empty
25720 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
25730 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
25740 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 41 4d 65  OP_Null, 0, iAMe
25750 6d 2c 20 69 41 4d 65 6d 2b 70 47 72 6f 75 70 42  m, iAMem+pGroupB
25760 79 2d 3e 6e 45 78 70 72 2d 31 29 3b 0a 0a 20 20  y->nExpr-1);..  
25770 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 6c      /* Begin a l
25780 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 65 78  oop that will ex
25790 74 72 61 63 74 20 61 6c 6c 20 73 6f 75 72 63 65  tract all source
257a0 20 72 6f 77 73 20 69 6e 20 47 52 4f 55 50 20 42   rows in GROUP B
257b0 59 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  Y order..      *
257c0 2a 20 54 68 69 73 20 6d 69 67 68 74 20 69 6e 76  * This might inv
257d0 6f 6c 76 65 20 74 77 6f 20 73 65 70 61 72 61 74  olve two separat
257e0 65 20 6c 6f 6f 70 73 20 77 69 74 68 20 61 6e 20  e loops with an 
257f0 4f 50 5f 53 6f 72 74 20 69 6e 20 62 65 74 77 65  OP_Sort in betwe
25800 65 6e 2c 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  en, or.      ** 
25810 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 73 69  it might be a si
25820 6e 67 6c 65 20 6c 6f 6f 70 20 74 68 61 74 20 75  ngle loop that u
25830 73 65 73 20 61 6e 20 69 6e 64 65 78 20 74 6f 20  ses an index to 
25840 65 78 74 72 61 63 74 20 69 6e 66 6f 72 6d 61 74  extract informat
25850 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20  ion.      ** in 
25860 74 68 65 20 72 69 67 68 74 20 6f 72 64 65 72 20  the right order 
25870 74 6f 20 62 65 67 69 6e 20 77 69 74 68 2e 0a 20  to begin with.. 
25880 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
25890 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
258a0 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67  v, OP_Gosub, reg
258b0 52 65 73 65 74 2c 20 61 64 64 72 52 65 73 65 74  Reset, addrReset
258c0 29 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 20  );.      pWInfo 
258d0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  = sqlite3WhereBe
258e0 67 69 6e 28 70 50 61 72 73 65 2c 20 70 54 61 62  gin(pParse, pTab
258f0 4c 69 73 74 2c 20 70 57 68 65 72 65 2c 20 70 47  List, pWhere, pG
25900 72 6f 75 70 42 79 2c 20 30 2c 20 30 2c 20 30 29  roupBy, 0, 0, 0)
25910 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49 6e  ;.      if( pWIn
25920 66 6f 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 6c  fo==0 ) goto sel
25930 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20 20 69  ect_end;.      i
25940 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  f( pWInfo->nOBSa
25950 74 3d 3d 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78  t==pGroupBy->nEx
25960 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  pr ){.        /*
25970 20 54 68 65 20 6f 70 74 69 6d 69 7a 65 72 20 69   The optimizer i
25980 73 20 61 62 6c 65 20 74 6f 20 64 65 6c 69 76 65  s able to delive
25990 72 20 72 6f 77 73 20 69 6e 20 67 72 6f 75 70 20  r rows in group 
259a0 62 79 20 6f 72 64 65 72 20 73 6f 0a 20 20 20 20  by order so.    
259b0 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 6e 6f 74      ** we do not
259c0 20 68 61 76 65 20 74 6f 20 73 6f 72 74 2e 20 20   have to sort.  
259d0 54 68 65 20 4f 50 5f 4f 70 65 6e 45 70 68 65 6d  The OP_OpenEphem
259e0 65 72 61 6c 20 74 61 62 6c 65 20 77 69 6c 6c 20  eral table will 
259f0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61  be.        ** ca
25a00 6e 63 65 6c 6c 65 64 20 6c 61 74 65 72 20 62 65  ncelled later be
25a10 63 61 75 73 65 20 77 65 20 73 74 69 6c 6c 20 6e  cause we still n
25a20 65 65 64 20 74 6f 20 75 73 65 20 74 68 65 20 70  eed to use the p
25a30 4b 65 79 49 6e 66 6f 0a 20 20 20 20 20 20 20 20  KeyInfo.        
25a40 2a 2f 0a 20 20 20 20 20 20 20 20 67 72 6f 75 70  */.        group
25a50 42 79 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20  BySort = 0;.    
25a60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25a70 20 2f 2a 20 52 6f 77 73 20 61 72 65 20 63 6f 6d   /* Rows are com
25a80 69 6e 67 20 6f 75 74 20 69 6e 20 75 6e 64 65 74  ing out in undet
25a90 65 72 6d 69 6e 65 64 20 6f 72 64 65 72 2e 20 20  ermined order.  
25aa0 57 65 20 68 61 76 65 20 74 6f 20 70 75 73 68 0a  We have to push.
25ab0 20 20 20 20 20 20 20 20 2a 2a 20 65 61 63 68 20          ** each 
25ac0 72 6f 77 20 69 6e 74 6f 20 61 20 73 6f 72 74 69  row into a sorti
25ad0 6e 67 20 69 6e 64 65 78 2c 20 74 65 72 6d 69 6e  ng index, termin
25ae0 61 74 65 20 74 68 65 20 66 69 72 73 74 20 6c 6f  ate the first lo
25af0 6f 70 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  op,.        ** t
25b00 68 65 6e 20 6c 6f 6f 70 20 6f 76 65 72 20 74 68  hen loop over th
25b10 65 20 73 6f 72 74 69 6e 67 20 69 6e 64 65 78 20  e sorting index 
25b20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
25b30 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 20  the output.     
25b40 20 20 20 2a 2a 20 69 6e 20 73 6f 72 74 65 64 20     ** in sorted 
25b50 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2f  order.        */
25b60 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 67  .        int reg
25b70 42 61 73 65 3b 0a 20 20 20 20 20 20 20 20 69 6e  Base;.        in
25b80 74 20 72 65 67 52 65 63 6f 72 64 3b 0a 20 20 20  t regRecord;.   
25b90 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20       int nCol;. 
25ba0 20 20 20 20 20 20 20 69 6e 74 20 6e 47 72 6f 75         int nGrou
25bb0 70 42 79 3b 0a 0a 20 20 20 20 20 20 20 20 65 78  pBy;..        ex
25bc0 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c 65 28 70  plainTempTable(p
25bd0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
25be0 20 20 20 20 28 73 44 69 73 74 69 6e 63 74 2e 69      (sDistinct.i
25bf0 73 54 6e 63 74 20 26 26 20 28 70 2d 3e 73 65 6c  sTnct && (p->sel
25c00 46 6c 61 67 73 26 53 46 5f 44 69 73 74 69 6e 63  Flags&SF_Distinc
25c10 74 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  t)==0) ?.       
25c20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 44 49               "DI
25c30 53 54 49 4e 43 54 22 20 3a 20 22 47 52 4f 55 50  STINCT" : "GROUP
25c40 20 42 59 22 29 3b 0a 0a 20 20 20 20 20 20 20 20   BY");..        
25c50 67 72 6f 75 70 42 79 53 6f 72 74 20 3d 20 31 3b  groupBySort = 1;
25c60 0a 20 20 20 20 20 20 20 20 6e 47 72 6f 75 70 42  .        nGroupB
25c70 79 20 3d 20 70 47 72 6f 75 70 42 79 2d 3e 6e 45  y = pGroupBy->nE
25c80 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f  xpr;.        nCo
25c90 6c 20 3d 20 6e 47 72 6f 75 70 42 79 20 2b 20 31  l = nGroupBy + 1
25ca0 3b 0a 20 20 20 20 20 20 20 20 6a 20 3d 20 6e 47  ;.        j = nG
25cb0 72 6f 75 70 42 79 2b 31 3b 0a 20 20 20 20 20 20  roupBy+1;.      
25cc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67    for(i=0; i<sAg
25cd0 67 49 6e 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69  gInfo.nColumn; i
25ce0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
25cf0 66 28 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c  f( sAggInfo.aCol
25d00 5b 69 5d 2e 69 53 6f 72 74 65 72 43 6f 6c 75 6d  [i].iSorterColum
25d10 6e 3e 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=j ){.        
25d20 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
25d30 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
25d40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25d50 20 7d 0a 20 20 20 20 20 20 20 20 72 65 67 42 61   }.        regBa
25d60 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  se = sqlite3GetT
25d70 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
25d80 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   nCol);.        
25d90 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
25da0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
25db0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
25dc0 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70  prCodeExprList(p
25dd0 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42 79 2c  Parse, pGroupBy,
25de0 20 72 65 67 42 61 73 65 2c 20 30 29 3b 0a 20 20   regBase, 0);.  
25df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25e00 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
25e10 71 75 65 6e 63 65 2c 20 73 41 67 67 49 6e 66 6f  quence, sAggInfo
25e20 2e 73 6f 72 74 69 6e 67 49 64 78 2c 72 65 67 42  .sortingIdx,regB
25e30 61 73 65 2b 6e 47 72 6f 75 70 42 79 29 3b 0a 20  ase+nGroupBy);. 
25e40 20 20 20 20 20 20 20 6a 20 3d 20 6e 47 72 6f 75         j = nGrou
25e50 70 42 79 2b 31 3b 0a 20 20 20 20 20 20 20 20 66  pBy+1;.        f
25e60 6f 72 28 69 3d 30 3b 20 69 3c 73 41 67 67 49 6e  or(i=0; i<sAggIn
25e70 66 6f 2e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  fo.nColumn; i++)
25e80 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  {.          stru
25e90 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a  ct AggInfo_col *
25ea0 70 43 6f 6c 20 3d 20 26 73 41 67 67 49 6e 66 6f  pCol = &sAggInfo
25eb0 2e 61 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  .aCol[i];.      
25ec0 20 20 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69 53      if( pCol->iS
25ed0 6f 72 74 65 72 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  orterColumn>=j )
25ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
25ef0 74 20 72 31 20 3d 20 6a 20 2b 20 72 65 67 42 61  t r1 = j + regBa
25f00 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se;.            
25f10 69 6e 74 20 72 32 3b 0a 0a 20 20 20 20 20 20 20  int r2;..       
25f20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
25f30 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
25f40 6d 6e 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  mn(pParse, .    
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
25f70 3e 70 54 61 62 2c 20 70 43 6f 6c 2d 3e 69 43 6f  >pTab, pCol->iCo
25f80 6c 75 6d 6e 2c 20 70 43 6f 6c 2d 3e 69 54 61 62  lumn, pCol->iTab
25f90 6c 65 2c 20 72 31 2c 20 30 29 3b 0a 20 20 20 20  le, r1, 0);.    
25fa0 20 20 20 20 20 20 20 20 69 66 28 20 72 31 21 3d          if( r1!=
25fb0 72 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r2 ){.          
25fc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
25fd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70  ddOp2(v, OP_SCop
25fe0 79 2c 20 72 32 2c 20 72 31 29 3b 0a 20 20 20 20  y, r2, r1);.    
25ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26000 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
26010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26020 0a 20 20 20 20 20 20 20 20 72 65 67 52 65 63 6f  .        regReco
26030 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
26040 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
26050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
26060 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
26070 4d 61 6b 65 52 65 63 6f 72 64 2c 20 72 65 67 42  MakeRecord, regB
26080 61 73 65 2c 20 6e 43 6f 6c 2c 20 72 65 67 52 65  ase, nCol, regRe
26090 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73  cord);.        s
260a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
260b0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73  (v, OP_SorterIns
260c0 65 72 74 2c 20 73 41 67 67 49 6e 66 6f 2e 73 6f  ert, sAggInfo.so
260d0 72 74 69 6e 67 49 64 78 2c 20 72 65 67 52 65 63  rtingIdx, regRec
260e0 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ord);.        sq
260f0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
26100 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
26110 65 63 6f 72 64 29 3b 0a 20 20 20 20 20 20 20 20  ecord);.        
26120 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
26130 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20  mpRange(pParse, 
26140 72 65 67 42 61 73 65 2c 20 6e 43 6f 6c 29 3b 0a  regBase, nCol);.
26150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
26160 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
26170 0a 20 20 20 20 20 20 20 20 73 41 67 67 49 6e 66  .        sAggInf
26180 6f 2e 73 6f 72 74 69 6e 67 49 64 78 50 54 61 62  o.sortingIdxPTab
26190 20 3d 20 73 6f 72 74 50 54 61 62 20 3d 20 70 50   = sortPTab = pP
261a0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
261b0 20 20 20 20 20 20 73 6f 72 74 4f 75 74 20 3d 20        sortOut = 
261c0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
261d0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
261e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
261f0 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 50  dOp3(v, OP_OpenP
26200 73 65 75 64 6f 2c 20 73 6f 72 74 50 54 61 62 2c  seudo, sortPTab,
26210 20 73 6f 72 74 4f 75 74 2c 20 6e 43 6f 6c 29 3b   sortOut, nCol);
26220 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26230 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
26240 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20 73 41 67  _SorterSort, sAg
26250 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78  gInfo.sortingIdx
26260 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20 20 20 20  , addrEnd);.    
26270 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
26280 28 76 2c 20 22 47 52 4f 55 50 20 42 59 20 73 6f  (v, "GROUP BY so
26290 72 74 22 29 29 3b 0a 20 20 20 20 20 20 20 20 73  rt"));.        s
262a0 41 67 67 49 6e 66 6f 2e 75 73 65 53 6f 72 74 69  AggInfo.useSorti
262b0 6e 67 49 64 78 20 3d 20 31 3b 0a 20 20 20 20 20  ngIdx = 1;.     
262c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
262d0 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29  cheClear(pParse)
262e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
262f0 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
26300 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50 20 42   current GROUP B
26310 59 20 74 65 72 6d 73 20 61 6e 64 20 73 74 6f 72  Y terms and stor
26320 65 20 69 6e 20 62 30 2c 20 62 31 2c 20 62 32 2e  e in b0, b1, b2.
26330 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 28 62 30 20  ...      ** (b0 
26340 69 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  is memory locati
26350 6f 6e 20 69 42 4d 65 6d 2b 30 2c 20 62 31 20 69  on iBMem+0, b1 i
26360 73 20 69 42 4d 65 6d 2b 31 2c 20 61 6e 64 20 73  s iBMem+1, and s
26370 6f 20 66 6f 72 74 68 29 0a 20 20 20 20 20 20 2a  o forth).      *
26380 2a 20 54 68 65 6e 20 63 6f 6d 70 61 72 65 20 74  * Then compare t
26390 68 65 20 63 75 72 72 65 6e 74 20 47 52 4f 55 50  he current GROUP
263a0 20 42 59 20 74 65 72 6d 73 20 61 67 61 69 6e 73   BY terms agains
263b0 74 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 74  t the GROUP BY t
263c0 65 72 6d 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  erms.      ** fr
263d0 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
263e0 72 6f 77 20 63 75 72 72 65 6e 74 6c 79 20 73 74  row currently st
263f0 6f 72 65 64 20 69 6e 20 61 30 2c 20 61 31 2c 20  ored in a0, a1, 
26400 61 32 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  a2....      */. 
26410 20 20 20 20 20 61 64 64 72 54 6f 70 4f 66 4c 6f       addrTopOfLo
26420 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
26430 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
26440 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26450 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61 72  rCacheClear(pPar
26460 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 67  se);.      if( g
26470 72 6f 75 70 42 79 53 6f 72 74 20 29 7b 0a 20 20  roupBySort ){.  
26480 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26490 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
264a0 72 74 65 72 44 61 74 61 2c 20 73 41 67 67 49 6e  rterData, sAggIn
264b0 66 6f 2e 73 6f 72 74 69 6e 67 49 64 78 2c 20 73  fo.sortingIdx, s
264c0 6f 72 74 4f 75 74 29 3b 0a 20 20 20 20 20 20 7d  ortOut);.      }
264d0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
264e0 6a 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  j<pGroupBy->nExp
264f0 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
26500 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
26510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
26520 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
26530 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 73 6f  v, OP_Column, so
26540 72 74 50 54 61 62 2c 20 6a 2c 20 69 42 4d 65 6d  rtPTab, j, iBMem
26550 2b 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  +j);.          i
26560 66 28 20 6a 3d 3d 30 20 29 20 73 71 6c 69 74 65  f( j==0 ) sqlite
26570 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
26580 20 4f 50 46 4c 41 47 5f 43 4c 45 41 52 43 41 43   OPFLAG_CLEARCAC
26590 48 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  HE);.        }el
265a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 41  se{.          sA
265b0 67 67 49 6e 66 6f 2e 64 69 72 65 63 74 4d 6f 64  ggInfo.directMod
265c0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  e = 1;.         
265d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
265e0 28 70 50 61 72 73 65 2c 20 70 47 72 6f 75 70 42  (pParse, pGroupB
265f0 79 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 69  y->a[j].pExpr, i
26600 42 4d 65 6d 2b 6a 29 3b 0a 20 20 20 20 20 20 20  BMem+j);.       
26610 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
26620 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26630 70 34 28 76 2c 20 4f 50 5f 43 6f 6d 70 61 72 65  p4(v, OP_Compare
26640 2c 20 69 41 4d 65 6d 2c 20 69 42 4d 65 6d 2c 20  , iAMem, iBMem, 
26650 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 2c  pGroupBy->nExpr,
26660 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26670 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
26680 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34 5f 4b  *)pKeyInfo, P4_K
26690 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 6a  EYINFO);.      j
266a0 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
266b0 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
266c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
266d0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4a 75 6d  AddOp3(v, OP_Jum
266e0 70 2c 20 6a 31 2b 31 2c 20 30 2c 20 6a 31 2b 31  p, j1+1, 0, j1+1
266f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
26700 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
26710 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
26720 65 20 47 52 4f 55 50 20 42 59 20 63 68 61 6e 67  e GROUP BY chang
26730 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 61  es..      ** Cha
26740 6e 67 65 73 20 69 6e 20 74 68 65 20 47 52 4f 55  nges in the GROU
26750 50 20 42 59 20 61 72 65 20 64 65 74 65 63 74 65  P BY are detecte
26760 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
26770 73 20 63 6f 64 65 0a 20 20 20 20 20 20 2a 2a 20  s code.      ** 
26780 62 6c 6f 63 6b 2e 20 20 49 66 20 74 68 65 72 65  block.  If there
26790 20 77 65 72 65 20 6e 6f 20 63 68 61 6e 67 65 73   were no changes
267a0 2c 20 74 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  , this block is 
267b0 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  skipped..      *
267c0 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
267d0 63 6f 64 65 20 63 6f 70 69 65 73 20 63 75 72 72  code copies curr
267e0 65 6e 74 20 67 72 6f 75 70 20 62 79 20 74 65 72  ent group by ter
267f0 6d 73 20 69 6e 20 62 30 2c 62 31 2c 62 32 2c 2e  ms in b0,b1,b2,.
26800 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  ...      ** over
26810 20 74 6f 20 61 30 2c 61 31 2c 61 32 2e 20 20 49   to a0,a1,a2.  I
26820 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 65  t then calls the
26830 20 6f 75 74 70 75 74 20 73 75 62 72 6f 75 74 69   output subrouti
26840 6e 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ne.      ** and 
26850 72 65 73 65 74 73 20 74 68 65 20 61 67 67 72 65  resets the aggre
26860 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f 72  gate accumulator
26870 20 72 65 67 69 73 74 65 72 73 20 69 6e 20 70 72   registers in pr
26880 65 70 61 72 61 74 69 6f 6e 0a 20 20 20 20 20 20  eparation.      
26890 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  ** for the next 
268a0 47 52 4f 55 50 20 42 59 20 62 61 74 63 68 2e 0a  GROUP BY batch..
268b0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
268c0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 4d 6f  qlite3ExprCodeMo
268d0 76 65 28 70 50 61 72 73 65 2c 20 69 42 4d 65 6d  ve(pParse, iBMem
268e0 2c 20 69 41 4d 65 6d 2c 20 70 47 72 6f 75 70 42  , iAMem, pGroupB
268f0 79 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  y->nExpr);.     
26900 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26910 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
26920 72 65 67 4f 75 74 70 75 74 52 6f 77 2c 20 61 64  regOutputRow, ad
26930 64 72 4f 75 74 70 75 74 52 6f 77 29 3b 0a 20 20  drOutputRow);.  
26940 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
26950 28 76 2c 20 22 6f 75 74 70 75 74 20 6f 6e 65 20  (v, "output one 
26960 72 6f 77 22 29 29 3b 0a 20 20 20 20 20 20 73 71  row"));.      sq
26970 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
26980 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 69 41 62  v, OP_IfPos, iAb
26990 6f 72 74 46 6c 61 67 2c 20 61 64 64 72 45 6e 64  ortFlag, addrEnd
269a0 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
269b0 6d 65 6e 74 28 28 76 2c 20 22 63 68 65 63 6b 20  ment((v, "check 
269c0 61 62 6f 72 74 20 66 6c 61 67 22 29 29 3b 0a 20  abort flag"));. 
269d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
269e0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73  AddOp2(v, OP_Gos
269f0 75 62 2c 20 72 65 67 52 65 73 65 74 2c 20 61 64  ub, regReset, ad
26a00 64 72 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20  drReset);.      
26a10 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
26a20 22 72 65 73 65 74 20 61 63 63 75 6d 75 6c 61 74  "reset accumulat
26a30 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  or"));..      /*
26a40 20 55 70 64 61 74 65 20 74 68 65 20 61 67 67 72   Update the aggr
26a50 65 67 61 74 65 20 61 63 63 75 6d 75 6c 61 74 6f  egate accumulato
26a60 72 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  rs based on the 
26a70 63 6f 6e 74 65 6e 74 20 6f 66 0a 20 20 20 20 20  content of.     
26a80 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
26a90 72 6f 77 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  row.      */.   
26aa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
26ab0 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20  mpHere(v, j1);. 
26ac0 20 20 20 20 20 75 70 64 61 74 65 41 63 63 75 6d       updateAccum
26ad0 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20 26  ulator(pParse, &
26ae0 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20  sAggInfo);.     
26af0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26b00 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
26b10 2c 20 31 2c 20 69 55 73 65 46 6c 61 67 29 3b 0a  , 1, iUseFlag);.
26b20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
26b30 74 28 28 76 2c 20 22 69 6e 64 69 63 61 74 65 20  t((v, "indicate 
26b40 64 61 74 61 20 69 6e 20 61 63 63 75 6d 75 6c 61  data in accumula
26b50 74 6f 72 22 29 29 3b 0a 0a 20 20 20 20 20 20 2f  tor"));..      /
26b60 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
26b70 70 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  p.      */.     
26b80 20 69 66 28 20 67 72 6f 75 70 42 79 53 6f 72 74   if( groupBySort
26b90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
26ba0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
26bb0 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20   OP_SorterNext, 
26bc0 73 41 67 67 49 6e 66 6f 2e 73 6f 72 74 69 6e 67  sAggInfo.sorting
26bd0 49 64 78 2c 20 61 64 64 72 54 6f 70 4f 66 4c 6f  Idx, addrTopOfLo
26be0 6f 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  op);.      }else
26bf0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
26c00 33 57 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f  3WhereEnd(pWInfo
26c10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26c20 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f  e3VdbeChangeToNo
26c30 6f 70 28 76 2c 20 61 64 64 72 53 6f 72 74 69 6e  op(v, addrSortin
26c40 67 49 64 78 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  gIdx);.      }..
26c50 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
26c60 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 20 6f 66  the final row of
26c70 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2f   result.      */
26c80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
26c90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
26ca0 6f 73 75 62 2c 20 72 65 67 4f 75 74 70 75 74 52  osub, regOutputR
26cb0 6f 77 2c 20 61 64 64 72 4f 75 74 70 75 74 52 6f  ow, addrOutputRo
26cc0 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  w);.      VdbeCo
26cd0 6d 6d 65 6e 74 28 28 76 2c 20 22 6f 75 74 70 75  mment((v, "outpu
26ce0 74 20 66 69 6e 61 6c 20 72 6f 77 22 29 29 3b 0a  t final row"));.
26cf0 0a 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f  .      /* Jump o
26d00 76 65 72 20 74 68 65 20 73 75 62 72 6f 75 74 69  ver the subrouti
26d10 6e 65 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nes.      */.   
26d20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
26d30 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
26d40 20 30 2c 20 61 64 64 72 45 6e 64 29 3b 0a 0a 20   0, addrEnd);.. 
26d50 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
26d60 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
26d70 61 74 20 6f 75 74 70 75 74 73 20 61 20 73 69 6e  at outputs a sin
26d80 67 6c 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  gle row of the r
26d90 65 73 75 6c 74 0a 20 20 20 20 20 20 2a 2a 20 73  esult.      ** s
26da0 65 74 2e 20 20 54 68 69 73 20 73 75 62 72 6f 75  et.  This subrou
26db0 74 69 6e 65 20 66 69 72 73 74 20 6c 6f 6f 6b 73  tine first looks
26dc0 20 61 74 20 74 68 65 20 69 55 73 65 46 6c 61 67   at the iUseFlag
26dd0 2e 20 20 49 66 20 69 55 73 65 46 6c 61 67 0a 20  .  If iUseFlag. 
26de0 20 20 20 20 20 2a 2a 20 69 73 20 6c 65 73 73 20       ** is less 
26df0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
26e00 20 7a 65 72 6f 2c 20 74 68 65 20 73 75 62 72 6f   zero, the subro
26e10 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
26e20 2e 20 20 49 66 0a 20 20 20 20 20 20 2a 2a 20 74  .  If.      ** t
26e30 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 63 61  he processing ca
26e40 6c 6c 73 20 66 6f 72 20 74 68 65 20 71 75 65 72  lls for the quer
26e50 79 20 74 6f 20 61 62 6f 72 74 2c 20 74 68 69 73  y to abort, this
26e60 20 73 75 62 72 6f 75 74 69 6e 65 0a 20 20 20 20   subroutine.    
26e70 20 20 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 73 20    ** increments 
26e80 74 68 65 20 69 41 62 6f 72 74 46 6c 61 67 20 6d  the iAbortFlag m
26e90 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 62  emory location b
26ea0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
26eb0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  in.      ** orde
26ec0 72 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 65 20  r to signal the 
26ed0 63 61 6c 6c 65 72 20 74 6f 20 61 62 6f 72 74 2e  caller to abort.
26ee0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
26ef0 61 64 64 72 53 65 74 41 62 6f 72 74 20 3d 20 73  addrSetAbort = s
26f00 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
26f10 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
26f20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
26f30 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
26f40 20 31 2c 20 69 41 62 6f 72 74 46 6c 61 67 29 3b   1, iAbortFlag);
26f50 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
26f60 6e 74 28 28 76 2c 20 22 73 65 74 20 61 62 6f 72  nt((v, "set abor
26f70 74 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 20  t flag"));.     
26f80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26f90 70 31 28 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c  p1(v, OP_Return,
26fa0 20 72 65 67 4f 75 74 70 75 74 52 6f 77 29 3b 0a   regOutputRow);.
26fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
26fc0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
26fd0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 29 3b   addrOutputRow);
26fe0 0a 20 20 20 20 20 20 61 64 64 72 4f 75 74 70 75  .      addrOutpu
26ff0 74 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 56 64  tRow = sqlite3Vd
27000 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
27010 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
27020 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
27030 49 66 50 6f 73 2c 20 69 55 73 65 46 6c 61 67 2c  IfPos, iUseFlag,
27040 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 32   addrOutputRow+2
27050 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
27060 6d 65 6e 74 28 28 76 2c 20 22 47 72 6f 75 70 62  ment((v, "Groupb
27070 79 20 72 65 73 75 6c 74 20 67 65 6e 65 72 61 74  y result generat
27080 6f 72 20 65 6e 74 72 79 20 70 6f 69 6e 74 22 29  or entry point")
27090 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
270a0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
270b0 5f 52 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70  _Return, regOutp
270c0 75 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 66 69  utRow);.      fi
270d0 6e 61 6c 69 7a 65 41 67 67 46 75 6e 63 74 69 6f  nalizeAggFunctio
270e0 6e 73 28 70 50 61 72 73 65 2c 20 26 73 41 67 67  ns(pParse, &sAgg
270f0 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c  Info);.      sql
27100 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
27110 70 50 61 72 73 65 2c 20 70 48 61 76 69 6e 67 2c  pParse, pHaving,
27120 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
27130 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
27140 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
27150 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
27160 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
27170 2c 20 30 2c 20 30 2c 20 70 4f 72 64 65 72 42 79  , 0, 0, pOrderBy
27180 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27190 20 20 20 20 20 20 20 20 26 73 44 69 73 74 69 6e          &sDistin
271a0 63 74 2c 20 70 44 65 73 74 2c 0a 20 20 20 20 20  ct, pDest,.     
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271c0 20 61 64 64 72 4f 75 74 70 75 74 52 6f 77 2b 31   addrOutputRow+1
271d0 2c 20 61 64 64 72 53 65 74 41 62 6f 72 74 29 3b  , addrSetAbort);
271e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
271f0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 52  beAddOp1(v, OP_R
27200 65 74 75 72 6e 2c 20 72 65 67 4f 75 74 70 75 74  eturn, regOutput
27210 52 6f 77 29 3b 0a 20 20 20 20 20 20 56 64 62 65  Row);.      Vdbe
27220 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
27230 20 67 72 6f 75 70 62 79 20 72 65 73 75 6c 74 20   groupby result 
27240 67 65 6e 65 72 61 74 6f 72 22 29 29 3b 0a 0a 20  generator"));.. 
27250 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
27260 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68   a subroutine th
27270 61 74 20 77 69 6c 6c 20 72 65 73 65 74 20 74 68  at will reset th
27280 65 20 67 72 6f 75 70 2d 62 79 20 61 63 63 75 6d  e group-by accum
27290 75 6c 61 74 6f 72 0a 20 20 20 20 20 20 2a 2f 0a  ulator.      */.
272a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
272b0 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
272c0 20 61 64 64 72 52 65 73 65 74 29 3b 0a 20 20 20   addrReset);.   
272d0 20 20 20 72 65 73 65 74 41 63 63 75 6d 75 6c 61     resetAccumula
272e0 74 6f 72 28 70 50 61 72 73 65 2c 20 26 73 41 67  tor(pParse, &sAg
272f0 67 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  gInfo);.      sq
27300 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
27310 76 2c 20 4f 50 5f 52 65 74 75 72 6e 2c 20 72 65  v, OP_Return, re
27320 67 52 65 73 65 74 29 3b 0a 20 20 20 20 20 0a 20  gReset);.     . 
27330 20 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 47     } /* endif pG
27340 72 6f 75 70 42 79 2e 20 20 42 65 67 69 6e 20 61  roupBy.  Begin a
27350 67 67 72 65 67 61 74 65 20 71 75 65 72 69 65 73  ggregate queries
27360 20 77 69 74 68 6f 75 74 20 47 52 4f 55 50 20 42   without GROUP B
27370 59 3a 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 7b  Y: */.    else {
27380 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
27390 2a 70 44 65 6c 20 3d 20 30 3b 0a 23 69 66 6e 64  *pDel = 0;.#ifnd
273a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
273b0 54 52 45 45 43 4f 55 4e 54 0a 20 20 20 20 20 20  TREECOUNT.      
273c0 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20  Table *pTab;.   
273d0 20 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 69     if( (pTab = i
273e0 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 70 2c 20  sSimpleCount(p, 
273f0 26 73 41 67 67 49 6e 66 6f 29 29 21 3d 30 20 29  &sAggInfo))!=0 )
27400 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
27410 69 73 53 69 6d 70 6c 65 43 6f 75 6e 74 28 29 20  isSimpleCount() 
27420 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
27430 72 20 74 6f 20 61 20 54 61 62 6c 65 20 73 74 72  r to a Table str
27440 75 63 74 75 72 65 2c 20 74 68 65 6e 0a 20 20 20  ucture, then.   
27450 20 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 20       ** the SQL 
27460 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 66 20  statement is of 
27470 74 68 65 20 66 6f 72 6d 3a 0a 20 20 20 20 20 20  the form:.      
27480 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
27490 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
274a0 29 20 46 52 4f 4d 20 3c 74 62 6c 3e 0a 20 20 20  ) FROM <tbl>.   
274b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
274c0 2a 2a 20 77 68 65 72 65 20 74 68 65 20 54 61 62  ** where the Tab
274d0 6c 65 20 73 74 72 75 63 74 75 72 65 20 72 65 74  le structure ret
274e0 75 72 6e 65 64 20 72 65 70 72 65 73 65 6e 74 73  urned represents
274f0 20 74 61 62 6c 65 20 3c 74 62 6c 3e 2e 0a 20 20   table <tbl>..  
27500 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
27510 20 2a 2a 20 54 68 69 73 20 73 74 61 74 65 6d 65   ** This stateme
27520 6e 74 20 69 73 20 73 6f 20 63 6f 6d 6d 6f 6e 20  nt is so common 
27530 74 68 61 74 20 69 74 20 69 73 20 6f 70 74 69 6d  that it is optim
27540 69 7a 65 64 20 73 70 65 63 69 61 6c 6c 79 2e 20  ized specially. 
27550 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  The.        ** O
27560 50 5f 43 6f 75 6e 74 20 69 6e 73 74 72 75 63 74  P_Count instruct
27570 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64 20  ion is executed 
27580 65 69 74 68 65 72 20 6f 6e 20 74 68 65 20 69 6e  either on the in
27590 74 6b 65 79 20 74 61 62 6c 65 20 74 68 61 74 0a  tkey table that.
275a0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
275b0 69 6e 73 20 74 68 65 20 64 61 74 61 20 66 6f 72  ins the data for
275c0 20 74 61 62 6c 65 20 3c 74 62 6c 3e 20 6f 72 20   table <tbl> or 
275d0 6f 6e 20 6f 6e 65 20 6f 66 20 69 74 73 20 69 6e  on one of its in
275e0 64 65 78 65 73 2e 20 49 74 0a 20 20 20 20 20 20  dexes. It.      
275f0 20 20 2a 2a 20 69 73 20 62 65 74 74 65 72 20 74    ** is better t
27600 6f 20 65 78 65 63 75 74 65 20 74 68 65 20 6f 70  o execute the op
27610 20 6f 6e 20 61 6e 20 69 6e 64 65 78 2c 20 61 73   on an index, as
27620 20 69 6e 64 65 78 65 73 20 61 72 65 20 61 6c 6d   indexes are alm
27630 6f 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ost.        ** a
27640 6c 77 61 79 73 20 73 70 72 65 61 64 20 61 63 72  lways spread acr
27650 6f 73 73 20 6c 65 73 73 20 70 61 67 65 73 20 74  oss less pages t
27660 68 61 6e 20 74 68 65 69 72 20 63 6f 72 72 65 73  han their corres
27670 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 73 2e 0a  ponding tables..
27680 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27690 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 44 62     const int iDb
276a0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
276b0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
276c0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
276d0 61 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  a);.        cons
276e0 74 20 69 6e 74 20 69 43 73 72 20 3d 20 70 50 61  t int iCsr = pPa
276f0 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
27700 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 73 63   /* Cursor to sc
27710 61 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 20  an b-tree */.   
27720 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
27730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
27750 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a  rator variable *
27760 2f 0a 20 20 20 20 20 20 20 20 4b 65 79 49 6e 66  /.        KeyInf
27770 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  o *pKeyInfo = 0;
27780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27790 2a 20 4b 65 79 69 6e 66 6f 20 66 6f 72 20 73 63  * Keyinfo for sc
277a0 61 6e 6e 65 64 20 69 6e 64 65 78 20 2a 2f 0a 20  anned index */. 
277b0 20 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 42         Index *pB
277c0 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  est = 0;        
277d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
277e0 65 73 74 20 69 6e 64 65 78 20 66 6f 75 6e 64 20  est index found 
277f0 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20 20  so far */.      
27800 20 20 69 6e 74 20 69 52 6f 6f 74 20 3d 20 70 54    int iRoot = pT
27810 61 62 2d 3e 74 6e 75 6d 3b 20 20 20 20 20 20 20  ab->tnum;       
27820 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
27830 61 67 65 20 6f 66 20 73 63 61 6e 6e 65 64 20 62  age of scanned b
27840 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20 20 20 20  -tree */..      
27850 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
27860 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
27870 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20  , iDb);.        
27880 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
27890 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
278a0 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
278b0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
278c0 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
278d0 72 20 74 68 65 20 69 6e 64 65 78 20 74 68 61 74  r the index that
278e0 20 68 61 73 20 74 68 65 20 6c 65 61 73 74 20 61   has the least a
278f0 6d 6f 75 6e 74 20 6f 66 20 63 6f 6c 75 6d 6e 73  mount of columns
27900 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  . If.        ** 
27910 74 68 65 72 65 20 69 73 20 73 75 63 68 20 61 6e  there is such an
27920 20 69 6e 64 65 78 2c 20 61 6e 64 20 69 74 20 68   index, and it h
27930 61 73 20 6c 65 73 73 20 63 6f 6c 75 6d 6e 73 20  as less columns 
27940 74 68 61 6e 20 74 68 65 20 74 61 62 6c 65 0a 20  than the table. 
27950 20 20 20 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20         ** does, 
27960 74 68 65 6e 20 77 65 20 63 61 6e 20 61 73 73 75  then we can assu
27970 6d 65 20 74 68 61 74 20 69 74 20 63 6f 6e 73 75  me that it consu
27980 6d 65 73 20 6c 65 73 73 20 73 70 61 63 65 20 6f  mes less space o
27990 6e 20 64 69 73 6b 20 61 6e 64 0a 20 20 20 20 20  n disk and.     
279a0 20 20 20 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65     ** will there
279b0 66 6f 72 65 20 62 65 20 63 68 65 61 70 65 72 20  fore be cheaper 
279c0 74 6f 20 73 63 61 6e 20 74 6f 20 64 65 74 65 72  to scan to deter
279d0 6d 69 6e 65 20 74 68 65 20 71 75 65 72 79 20 72  mine the query r
279e0 65 73 75 6c 74 2e 0a 20 20 20 20 20 20 20 20 2a  esult..        *
279f0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73  * In this case s
27a00 65 74 20 69 52 6f 6f 74 20 74 6f 20 74 68 65 20  et iRoot to the 
27a10 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
27a20 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 62 2d   of the index b-
27a30 74 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  tree.        ** 
27a40 61 6e 64 20 70 4b 65 79 49 6e 66 6f 20 74 6f 20  and pKeyInfo to 
27a50 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  the KeyInfo stru
27a60 63 74 75 72 65 20 72 65 71 75 69 72 65 64 20 74  cture required t
27a70 6f 20 6e 61 76 69 67 61 74 65 20 74 68 65 0a 20  o navigate the. 
27a80 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 2e         ** index.
27a90 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
27aa0 20 20 20 20 2a 2a 20 28 32 30 31 31 2d 30 34 2d      ** (2011-04-
27ab0 31 35 29 20 44 6f 20 6e 6f 74 20 64 6f 20 61 20  15) Do not do a 
27ac0 66 75 6c 6c 20 73 63 61 6e 20 6f 66 20 61 6e 20  full scan of an 
27ad0 75 6e 6f 72 64 65 72 65 64 20 69 6e 64 65 78 2e  unordered index.
27ae0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
27af0 20 20 20 20 2a 2a 20 49 6e 20 70 72 61 63 74 69      ** In practi
27b00 63 65 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 73  ce the KeyInfo s
27b10 74 72 75 63 74 75 72 65 20 77 69 6c 6c 20 6e 6f  tructure will no
27b20 74 20 62 65 20 75 73 65 64 2e 20 49 74 20 69 73  t be used. It is
27b30 20 6f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 2a   only .        *
27b40 2a 20 70 61 73 73 65 64 20 74 6f 20 6b 65 65 70  * passed to keep
27b50 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 68 61 70   OP_OpenRead hap
27b60 70 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  py..        */. 
27b70 20 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d         for(pIdx=
27b80 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
27b90 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
27ba0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
27bb0 20 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72   if( pIdx->bUnor
27bc0 64 65 72 65 64 3d 3d 30 20 26 26 20 28 21 70 42  dered==0 && (!pB
27bd0 65 73 74 20 7c 7c 20 70 49 64 78 2d 3e 6e 43 6f  est || pIdx->nCo
27be0 6c 75 6d 6e 3c 70 42 65 73 74 2d 3e 6e 43 6f 6c  lumn<pBest->nCol
27bf0 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  umn) ){.        
27c00 20 20 20 20 70 42 65 73 74 20 3d 20 70 49 64 78      pBest = pIdx
27c10 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27c30 69 66 28 20 70 42 65 73 74 20 26 26 20 70 42 65  if( pBest && pBe
27c40 73 74 2d 3e 6e 43 6f 6c 75 6d 6e 3c 70 54 61 62  st->nColumn<pTab
27c50 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
27c60 20 20 20 20 69 52 6f 6f 74 20 3d 20 70 42 65 73      iRoot = pBes
27c70 74 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t->tnum;.       
27c80 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71     pKeyInfo = sq
27c90 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
27ca0 6f 28 70 50 61 72 73 65 2c 20 70 42 65 73 74 29  o(pParse, pBest)
27cb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
27cc0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61 20 72       /* Open a r
27cd0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
27ce0 20 65 78 65 63 75 74 65 20 74 68 65 20 4f 50 5f   execute the OP_
27cf0 43 6f 75 6e 74 2c 20 63 6c 6f 73 65 20 74 68 65  Count, close the
27d00 20 63 75 72 73 6f 72 2e 20 2a 2f 0a 20 20 20 20   cursor. */.    
27d10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
27d20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
27d30 52 65 61 64 2c 20 69 43 73 72 2c 20 69 52 6f 6f  Read, iCsr, iRoo
27d40 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  t, iDb);.       
27d50 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b   if( pKeyInfo ){
27d60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
27d70 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
27d80 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 70 4b  , -1, (char *)pK
27d90 65 79 49 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e  eyInfo, P4_KEYIN
27da0 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20  FO_HANDOFF);.   
27db0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
27dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
27dd0 28 76 2c 20 4f 50 5f 43 6f 75 6e 74 2c 20 69 43  (v, OP_Count, iC
27de0 73 72 2c 20 73 41 67 67 49 6e 66 6f 2e 61 46 75  sr, sAggInfo.aFu
27df0 6e 63 5b 30 5d 2e 69 4d 65 6d 29 3b 0a 20 20 20  nc[0].iMem);.   
27e00 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
27e10 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
27e20 73 65 2c 20 69 43 73 72 29 3b 0a 20 20 20 20 20  se, iCsr);.     
27e30 20 20 20 65 78 70 6c 61 69 6e 53 69 6d 70 6c 65     explainSimple
27e40 43 6f 75 6e 74 28 70 50 61 72 73 65 2c 20 70 54  Count(pParse, pT
27e50 61 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20  ab, pBest);.    
27e60 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
27e70 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54  * SQLITE_OMIT_BT
27e80 52 45 45 43 4f 55 4e 54 20 2a 2f 0a 20 20 20 20  REECOUNT */.    
27e90 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43    {.        /* C
27ea0 68 65 63 6b 20 69 66 20 74 68 65 20 71 75 65 72  heck if the quer
27eb0 79 20 69 73 20 6f 66 20 6f 6e 65 20 6f 66 20 74  y is of one of t
27ec0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
27ed0 6d 73 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ms:.        **. 
27ee0 20 20 20 20 20 20 20 2a 2a 20 20 20 53 45 4c 45         **   SELE
27ef0 43 54 20 6d 69 6e 28 78 29 20 46 52 4f 4d 20 2e  CT min(x) FROM .
27f00 2e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ...        **   
27f10 53 45 4c 45 43 54 20 6d 61 78 28 78 29 20 46 52  SELECT max(x) FR
27f20 4f 4d 20 2e 2e 2e 0a 20 20 20 20 20 20 20 20 2a  OM ....        *
27f30 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  *.        ** If 
27f40 69 74 20 69 73 2c 20 74 68 65 6e 20 61 73 6b 20  it is, then ask 
27f50 74 68 65 20 63 6f 64 65 20 69 6e 20 77 68 65 72  the code in wher
27f60 65 2e 63 20 74 6f 20 61 74 74 65 6d 70 74 20 74  e.c to attempt t
27f70 6f 20 73 6f 72 74 20 72 65 73 75 6c 74 73 0a 20  o sort results. 
27f80 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20         ** as if 
27f90 74 68 65 72 65 20 77 61 73 20 61 6e 20 22 4f 52  there was an "OR
27fa0 44 45 52 20 4f 4e 20 78 22 20 6f 72 20 22 4f 52  DER ON x" or "OR
27fb0 44 45 52 20 4f 4e 20 78 20 44 45 53 43 22 20 63  DER ON x DESC" c
27fc0 6c 61 75 73 65 2e 20 0a 20 20 20 20 20 20 20 20  lause. .        
27fd0 2a 2a 20 49 66 20 77 68 65 72 65 2e 63 20 69 73  ** If where.c is
27fe0 20 61 62 6c 65 20 74 6f 20 70 72 6f 64 75 63 65   able to produce
27ff0 20 72 65 73 75 6c 74 73 20 73 6f 72 74 65 64 20   results sorted 
28000 69 6e 20 74 68 69 73 20 6f 72 64 65 72 2c 20 74  in this order, t
28010 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
28020 64 64 20 76 64 62 65 20 63 6f 64 65 20 74 6f 20  dd vdbe code to 
28030 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
28040 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 6f 70   processing loop
28050 20 61 66 74 65 72 20 74 68 65 20 0a 20 20 20 20   after the .    
28060 20 20 20 20 2a 2a 20 66 69 72 73 74 20 69 74 65      ** first ite
28070 72 61 74 69 6f 6e 20 28 73 69 6e 63 65 20 74 68  ration (since th
28080 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
28090 6e 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 73  n of the loop is
280a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 61   .        ** gua
280b0 72 61 6e 74 65 65 64 20 74 6f 20 6f 70 65 72 61  ranteed to opera
280c0 74 65 20 6f 6e 20 74 68 65 20 72 6f 77 20 77 69  te on the row wi
280d0 74 68 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 6f  th the minimum o
280e0 72 20 6d 61 78 69 6d 75 6d 20 0a 20 20 20 20 20  r maximum .     
280f0 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 78     ** value of x
28100 2c 20 74 68 65 20 6f 6e 6c 79 20 72 6f 77 20 72  , the only row r
28110 65 71 75 69 72 65 64 29 2e 0a 20 20 20 20 20 20  equired)..      
28120 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
28130 41 20 73 70 65 63 69 61 6c 20 66 6c 61 67 20 6d  A special flag m
28140 75 73 74 20 62 65 20 70 61 73 73 65 64 20 74 6f  ust be passed to
28150 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
28160 69 6e 28 29 20 74 6f 20 73 6c 69 67 68 74 6c 79  in() to slightly
28170 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69  .        ** modi
28180 66 79 20 62 65 68 61 76 69 6f 75 72 20 61 73 20  fy behaviour as 
28190 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 20 20 20  follows:.       
281a0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
281b0 20 2b 20 49 66 20 74 68 65 20 71 75 65 72 79 20   + If the query 
281c0 69 73 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e  is a "SELECT min
281d0 28 78 29 22 2c 20 74 68 65 6e 20 74 68 65 20 6c  (x)", then the l
281e0 6f 6f 70 20 63 6f 64 65 64 20 62 79 0a 20 20 20  oop coded by.   
281f0 20 20 20 20 20 2a 2a 20 20 20 20 20 77 68 65 72       **     wher
28200 65 2e 63 20 73 68 6f 75 6c 64 20 6e 6f 74 20 69  e.c should not i
28210 74 65 72 61 74 65 20 6f 76 65 72 20 61 6e 79 20  terate over any 
28220 76 61 6c 75 65 73 20 77 69 74 68 20 61 20 4e 55  values with a NU
28230 4c 4c 20 76 61 6c 75 65 0a 20 20 20 20 20 20 20  LL value.       
28240 20 2a 2a 20 20 20 20 20 66 6f 72 20 78 2e 0a 20   **     for x.. 
28250 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28260 20 20 2a 2a 20 20 20 2b 20 54 68 65 20 6f 70 74    **   + The opt
28270 69 6d 69 7a 65 72 20 63 6f 64 65 20 69 6e 20 77  imizer code in w
28280 68 65 72 65 2e 63 20 28 74 68 65 20 74 68 69 6e  here.c (the thin
28290 67 20 74 68 61 74 20 64 65 63 69 64 65 73 20 77  g that decides w
282a0 68 69 63 68 0a 20 20 20 20 20 20 20 20 2a 2a 20  hich.        ** 
282b0 20 20 20 20 69 6e 64 65 78 20 6f 72 20 69 6e 64      index or ind
282c0 69 63 65 73 20 74 6f 20 75 73 65 29 20 73 68 6f  ices to use) sho
282d0 75 6c 64 20 70 6c 61 63 65 20 61 20 64 69 66 66  uld place a diff
282e0 65 72 65 6e 74 20 70 72 69 6f 72 69 74 79 20 6f  erent priority o
282f0 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  n .        **   
28300 20 20 73 61 74 69 73 66 79 69 6e 67 20 74 68 65    satisfying the
28310 20 27 4f 52 44 45 52 20 42 59 27 20 63 6c 61 75   'ORDER BY' clau
28320 73 65 20 74 68 61 6e 20 69 74 20 64 6f 65 73 20  se than it does 
28330 69 6e 20 6f 74 68 65 72 20 63 61 73 65 73 2e 0a  in other cases..
28340 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 52          **     R
28350 65 66 65 72 20 74 6f 20 63 6f 64 65 20 61 6e 64  efer to code and
28360 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 77 68 65   comments in whe
28370 72 65 2e 63 20 66 6f 72 20 64 65 74 61 69 6c 73  re.c for details
28380 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
28390 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
283a0 4d 69 6e 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20  MinMax = 0;.    
283b0 20 20 20 20 75 38 20 66 6c 61 67 20 3d 20 6d 69      u8 flag = mi
283c0 6e 4d 61 78 51 75 65 72 79 28 70 29 3b 0a 20 20  nMaxQuery(p);.  
283d0 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 20 29        if( flag )
283e0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
283f0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
28400 65 72 74 79 28 70 2d 3e 70 45 4c 69 73 74 2d 3e  erty(p->pEList->
28410 61 5b 30 5d 2e 70 45 78 70 72 2c 20 45 50 5f 78  a[0].pExpr, EP_x
28420 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
28430 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
28440 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
28450 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
28460 45 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20  Expr==1 );.     
28470 20 20 20 20 20 70 4d 69 6e 4d 61 78 20 3d 20 73       pMinMax = s
28480 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
28490 70 28 64 62 2c 20 70 2d 3e 70 45 4c 69 73 74 2d  p(db, p->pEList-
284a0 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 78 2e 70  >a[0].pExpr->x.p
284b0 4c 69 73 74 2c 30 29 3b 0a 20 20 20 20 20 20 20  List,0);.       
284c0 20 20 20 70 44 65 6c 20 3d 20 70 4d 69 6e 4d 61     pDel = pMinMa
284d0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
284e0 20 70 4d 69 6e 4d 61 78 20 26 26 20 21 64 62 2d   pMinMax && !db-
284f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
28500 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 69  .            pMi
28510 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  nMax->a[0].sortO
28520 72 64 65 72 20 3d 20 66 6c 61 67 21 3d 57 48 45  rder = flag!=WHE
28530 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 3f  RE_ORDERBY_MIN ?
28540 31 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1:0;.           
28550 20 70 4d 69 6e 4d 61 78 2d 3e 61 5b 30 5d 2e 70   pMinMax->a[0].p
28560 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
28570 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  LUMN;.          
28580 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20  }.        }.  . 
28590 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
285a0 61 73 65 20 72 75 6e 73 20 69 66 20 74 68 65 20  ase runs if the 
285b0 61 67 67 72 65 67 61 74 65 20 68 61 73 20 6e 6f  aggregate has no
285c0 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
285d0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
285e0 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  * processing is 
285f0 6d 75 63 68 20 73 69 6d 70 6c 65 72 20 73 69 6e  much simpler sin
28600 63 65 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79  ce there is only
28610 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20   a single row.  
28620 20 20 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70        ** of outp
28630 75 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ut..        */. 
28640 20 20 20 20 20 20 20 72 65 73 65 74 41 63 63 75         resetAccu
28650 6d 75 6c 61 74 6f 72 28 70 50 61 72 73 65 2c 20  mulator(pParse, 
28660 26 73 41 67 67 49 6e 66 6f 29 3b 0a 20 20 20 20  &sAggInfo);.    
28670 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c      pWInfo = sql
28680 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 70  ite3WhereBegin(p
28690 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
286a0 20 70 57 68 65 72 65 2c 20 70 4d 69 6e 4d 61 78   pWhere, pMinMax
286b0 2c 30 2c 66 6c 61 67 2c 30 29 3b 0a 20 20 20 20  ,0,flag,0);.    
286c0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 3d 3d      if( pWInfo==
286d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
286e0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
286f0 6c 65 74 65 28 64 62 2c 20 70 44 65 6c 29 3b 0a  lete(db, pDel);.
28700 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
28710 65 6c 65 63 74 5f 65 6e 64 3b 0a 20 20 20 20 20  elect_end;.     
28720 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 70 64     }.        upd
28730 61 74 65 41 63 63 75 6d 75 6c 61 74 6f 72 28 70  ateAccumulator(p
28740 50 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f  Parse, &sAggInfo
28750 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
28760 74 28 20 70 4d 69 6e 4d 61 78 3d 3d 30 20 7c 7c  t( pMinMax==0 ||
28770 20 70 4d 69 6e 4d 61 78 2d 3e 6e 45 78 70 72 3d   pMinMax->nExpr=
28780 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =1 );.        if
28790 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74  ( pWInfo->nOBSat
287a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
287b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
287c0 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
287d0 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29   pWInfo->iBreak)
287e0 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
287f0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 25 73 28  Comment((v, "%s(
28800 29 20 62 79 20 69 6e 64 65 78 22 2c 0a 20 20 20  ) by index",.   
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 28 66 6c               (fl
28820 61 67 3d 3d 57 48 45 52 45 5f 4f 52 44 45 52 42  ag==WHERE_ORDERB
28830 59 5f 4d 49 4e 3f 22 6d 69 6e 22 3a 22 6d 61 78  Y_MIN?"min":"max
28840 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ")));.        }.
28850 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
28860 68 65 72 65 45 6e 64 28 70 57 49 6e 66 6f 29 3b  hereEnd(pWInfo);
28870 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 69 7a  .        finaliz
28880 65 41 67 67 46 75 6e 63 74 69 6f 6e 73 28 70 50  eAggFunctions(pP
28890 61 72 73 65 2c 20 26 73 41 67 67 49 6e 66 6f 29  arse, &sAggInfo)
288a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
288b0 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   pOrderBy = 0;. 
288c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
288d0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
288e0 70 48 61 76 69 6e 67 2c 20 61 64 64 72 45 6e 64  pHaving, addrEnd
288f0 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
28900 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 65 6c 65  ULL);.      sele
28910 63 74 49 6e 6e 65 72 4c 6f 6f 70 28 70 50 61 72  ctInnerLoop(pPar
28920 73 65 2c 20 70 2c 20 70 2d 3e 70 45 4c 69 73 74  se, p, p->pEList
28930 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 0a 20  , 0, 0, 0, 0, . 
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28950 20 20 20 20 20 70 44 65 73 74 2c 20 61 64 64 72       pDest, addr
28960 45 6e 64 2c 20 61 64 64 72 45 6e 64 29 3b 0a 20  End, addrEnd);. 
28970 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
28980 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
28990 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Del);.    }.    
289a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
289b0 76 65 4c 61 62 65 6c 28 76 2c 20 61 64 64 72 45  veLabel(v, addrE
289c0 6e 64 29 3b 0a 20 20 20 20 0a 20 20 7d 20 2f 2a  nd);.    .  } /*
289d0 20 65 6e 64 69 66 20 61 67 67 72 65 67 61 74 65   endif aggregate
289e0 20 71 75 65 72 79 20 2a 2f 0a 0a 20 20 69 66 28   query */..  if(
289f0 20 73 44 69 73 74 69 6e 63 74 2e 65 54 6e 63 74   sDistinct.eTnct
28a00 54 79 70 65 3d 3d 57 48 45 52 45 5f 44 49 53 54  Type==WHERE_DIST
28a10 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45 44 20 29  INCT_UNORDERED )
28a20 7b 0a 20 20 20 20 65 78 70 6c 61 69 6e 54 65 6d  {.    explainTem
28a30 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 22  pTable(pParse, "
28a40 44 49 53 54 49 4e 43 54 22 29 3b 0a 20 20 7d 0a  DISTINCT");.  }.
28a50 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
28a60 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c  s an ORDER BY cl
28a70 61 75 73 65 2c 20 74 68 65 6e 20 77 65 20 6e 65  ause, then we ne
28a80 65 64 20 74 6f 20 73 6f 72 74 20 74 68 65 20 72  ed to sort the r
28a90 65 73 75 6c 74 73 0a 20 20 2a 2a 20 61 6e 64 20  esults.  ** and 
28aa0 73 65 6e 64 20 74 68 65 6d 20 74 6f 20 74 68 65  send them to the
28ab0 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 65 20 62 79   callback one by
28ac0 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   one..  */.  if(
28ad0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
28ae0 20 65 78 70 6c 61 69 6e 54 65 6d 70 54 61 62 6c   explainTempTabl
28af0 65 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45 52  e(pParse, "ORDER
28b00 20 42 59 22 29 3b 0a 20 20 20 20 67 65 6e 65 72   BY");.    gener
28b10 61 74 65 53 6f 72 74 54 61 69 6c 28 70 50 61 72  ateSortTail(pPar
28b20 73 65 2c 20 70 2c 20 76 2c 20 70 45 4c 69 73 74  se, p, v, pEList
28b30 2d 3e 6e 45 78 70 72 2c 20 70 44 65 73 74 29 3b  ->nExpr, pDest);
28b40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  .  }..  /* Jump 
28b50 68 65 72 65 20 74 6f 20 73 6b 69 70 20 74 68 69  here to skip thi
28b60 73 20 71 75 65 72 79 0a 20 20 2a 2f 0a 20 20 73  s query.  */.  s
28b70 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
28b80 65 4c 61 62 65 6c 28 76 2c 20 69 45 6e 64 29 3b  eLabel(v, iEnd);
28b90 0a 0a 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43  ..  /* The SELEC
28ba0 54 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  T was successful
28bb0 6c 79 20 63 6f 64 65 64 2e 20 20 20 53 65 74 20  ly coded.   Set 
28bc0 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
28bd0 74 6f 20 30 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  to 0.  ** to ind
28be0 69 63 61 74 65 20 6e 6f 20 65 72 72 6f 72 73 2e  icate no errors.
28bf0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 30 3b 0a  .  */.  rc = 0;.
28c00 0a 20 20 2f 2a 20 43 6f 6e 74 72 6f 6c 20 6a 75  .  /* Control ju
28c10 6d 70 73 20 74 6f 20 68 65 72 65 20 69 66 20 61  mps to here if a
28c20 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
28c30 6e 74 65 72 65 64 20 61 62 6f 76 65 2c 20 6f 72  ntered above, or
28c40 20 75 70 6f 6e 0a 20 20 2a 2a 20 73 75 63 63 65   upon.  ** succe
28c50 73 73 66 75 6c 20 63 6f 64 69 6e 67 20 6f 66 20  ssful coding of 
28c60 74 68 65 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2f  the SELECT..  */
28c70 0a 73 65 6c 65 63 74 5f 65 6e 64 3a 0a 20 20 65  .select_end:.  e
28c80 78 70 6c 61 69 6e 53 65 74 49 6e 74 65 67 65 72  xplainSetInteger
28c90 28 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74  (pParse->iSelect
28ca0 49 64 2c 20 69 52 65 73 74 6f 72 65 53 65 6c 65  Id, iRestoreSele
28cb0 63 74 49 64 29 3b 0a 0a 20 20 2f 2a 20 49 64 65  ctId);..  /* Ide
28cc0 6e 74 69 66 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ntify column nam
28cd0 65 73 20 69 66 20 72 65 73 75 6c 74 73 20 6f 66  es if results of
28ce0 20 74 68 65 20 53 45 4c 45 43 54 20 61 72 65 20   the SELECT are 
28cf0 74 6f 20 62 65 20 6f 75 74 70 75 74 2e 0a 20 20  to be output..  
28d00 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
28d10 49 54 45 5f 4f 4b 20 26 26 20 70 44 65 73 74 2d  ITE_OK && pDest-
28d20 3e 65 44 65 73 74 3d 3d 53 52 54 5f 4f 75 74 70  >eDest==SRT_Outp
28d30 75 74 20 29 7b 0a 20 20 20 20 67 65 6e 65 72 61  ut ){.    genera
28d40 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  teColumnNames(pP
28d50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
28d60 70 45 4c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  pEList);.  }..  
28d70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
28d80 2c 20 73 41 67 67 49 6e 66 6f 2e 61 43 6f 6c 29  , sAggInfo.aCol)
28d90 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
28da0 65 28 64 62 2c 20 73 41 67 67 49 6e 66 6f 2e 61  e(db, sAggInfo.a
28db0 46 75 6e 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  Func);.  return 
28dc0 72 63 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  rc;.}..#if defin
28dd0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
28de0 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 2f  _TREE_EXPLAIN)./
28df0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
28e00 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 64  human-readable d
28e10 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20  escription of a 
28e20 74 68 65 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  the Select objec
28e30 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
28e40 64 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c 65  d explainOneSele
28e50 63 74 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20  ct(Vdbe *pVdbe, 
28e60 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 73 71  Select *p){.  sq
28e70 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
28e80 74 66 28 70 56 64 62 65 2c 20 22 53 45 4c 45 43  tf(pVdbe, "SELEC
28e90 54 20 22 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  T ");.  if( p->s
28ea0 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f 44 69  elFlags & (SF_Di
28eb0 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72 65 67  stinct|SF_Aggreg
28ec0 61 74 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20  ate) ){.    if( 
28ed0 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
28ee0 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a 20 20 20  _Distinct ){.   
28ef0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
28f00 6e 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22  nPrintf(pVdbe, "
28f10 44 49 53 54 49 4e 43 54 20 22 29 3b 0a 20 20 20  DISTINCT ");.   
28f20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65   }.    if( p->se
28f30 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72  lFlags & SF_Aggr
28f40 65 67 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  egate ){.      s
28f50 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
28f60 6e 74 66 28 70 56 64 62 65 2c 20 22 61 67 67 5f  ntf(pVdbe, "agg_
28f70 66 6c 61 67 20 22 29 3b 0a 20 20 20 20 7d 0a 20  flag ");.    }. 
28f80 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
28f90 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 20 20  nNL(pVdbe);.    
28fa0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
28fb0 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 20 20  intf(pVdbe, "   
28fc0 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ");.  }.  sqlite
28fd0 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
28fe0 28 70 56 64 62 65 2c 20 70 2d 3e 70 45 4c 69 73  (pVdbe, p->pELis
28ff0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
29000 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
29010 20 69 66 28 20 70 2d 3e 70 53 72 63 20 26 26 20   if( p->pSrc && 
29020 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b  p->pSrc->nSrc ){
29030 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
29040 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
29050 69 6e 74 66 28 70 56 64 62 65 2c 20 22 46 52 4f  intf(pVdbe, "FRO
29060 4d 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  M ");.    sqlite
29070 33 45 78 70 6c 61 69 6e 50 75 73 68 28 70 56 64  3ExplainPush(pVd
29080 62 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  be);.    for(i=0
29090 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ; i<p->pSrc->nSr
290a0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
290b0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
290c0 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
290d0 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
290e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
290f0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 7b  Printf(pVdbe, "{
29100 25 64 2c 2a 7d 20 3d 20 22 2c 20 70 49 74 65 6d  %d,*} = ", pItem
29110 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  ->iCursor);.    
29120 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
29130 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
29140 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65  sqlite3ExplainSe
29150 6c 65 63 74 28 70 56 64 62 65 2c 20 70 49 74 65  lect(pVdbe, pIte
29160 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
29170 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
29180 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20  pTab ){.        
29190 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
291a0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
291b0 28 74 61 62 6e 61 6d 65 3d 25 73 29 22 2c 20 70  (tabname=%s)", p
291c0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
291d0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
291e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49      }else if( pI
291f0 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  tem->zName ){.  
29200 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
29210 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62 65  lainPrintf(pVdbe
29220 2c 20 22 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a  , "%s", pItem->z
29230 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
29240 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
29250 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
29260 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
29270 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20  Printf(pVdbe, " 
29280 28 41 53 20 25 73 29 22 2c 20 70 49 74 65 6d 2d  (AS %s)", pItem-
29290 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20  >zAlias);.      
292a0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  }.      if( pIte
292b0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  m->jointype & JT
292c0 5f 4c 45 46 54 20 29 7b 0a 20 20 20 20 20 20 20  _LEFT ){.       
292d0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
292e0 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 20 4c  rintf(pVdbe, " L
292f0 45 46 54 2d 4a 4f 49 4e 22 29 3b 0a 20 20 20 20  EFT-JOIN");.    
29300 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
29310 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
29320 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
29330 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28 70  ite3ExplainPop(p
29340 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Vdbe);.  }.  if(
29350 20 70 2d 3e 70 57 68 65 72 65 20 29 7b 0a 20 20   p->pWhere ){.  
29360 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
29370 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 57  Printf(pVdbe, "W
29380 48 45 52 45 20 22 29 3b 0a 20 20 20 20 73 71 6c  HERE ");.    sql
29390 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28  ite3ExplainExpr(
293a0 70 56 64 62 65 2c 20 70 2d 3e 70 57 68 65 72 65  pVdbe, p->pWhere
293b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
293c0 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a  plainNL(pVdbe);.
293d0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 47 72    }.  if( p->pGr
293e0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 73 71 6c  oupBy ){.    sql
293f0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
29400 66 28 70 56 64 62 65 2c 20 22 47 52 4f 55 50 42  f(pVdbe, "GROUPB
29410 59 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Y ");.    sqlite
29420 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
29430 28 70 56 64 62 65 2c 20 70 2d 3e 70 47 72 6f 75  (pVdbe, p->pGrou
29440 70 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBy);.    sqlite
29450 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65  3ExplainNL(pVdbe
29460 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
29470 70 48 61 76 69 6e 67 20 29 7b 0a 20 20 20 20 73  pHaving ){.    s
29480 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
29490 6e 74 66 28 70 56 64 62 65 2c 20 22 48 41 56 49  ntf(pVdbe, "HAVI
294a0 4e 47 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  NG ");.    sqlit
294b0 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70 56  e3ExplainExpr(pV
294c0 64 62 65 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  dbe, p->pHaving)
294d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
294e0 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29 3b 0a 20  lainNL(pVdbe);. 
294f0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4f 72 64   }.  if( p->pOrd
29500 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  erBy ){.    sqli
29510 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
29520 28 70 56 64 62 65 2c 20 22 4f 52 44 45 52 42 59  (pVdbe, "ORDERBY
29530 20 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   ");.    sqlite3
29540 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74 28  ExplainExprList(
29550 70 56 64 62 65 2c 20 70 2d 3e 70 4f 72 64 65 72  pVdbe, p->pOrder
29560 42 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  By);.    sqlite3
29570 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62 65 29  ExplainNL(pVdbe)
29580 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
29590 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  Limit ){.    sql
295a0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
295b0 66 28 70 56 64 62 65 2c 20 22 4c 49 4d 49 54 20  f(pVdbe, "LIMIT 
295c0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ");.    sqlite3E
295d0 78 70 6c 61 69 6e 45 78 70 72 28 70 56 64 62 65  xplainExpr(pVdbe
295e0 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20 20  , p->pLimit);.  
295f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
29600 4e 4c 28 70 56 64 62 65 29 3b 0a 20 20 7d 0a 20  NL(pVdbe);.  }. 
29610 20 69 66 28 20 70 2d 3e 70 4f 66 66 73 65 74 20   if( p->pOffset 
29620 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
29630 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64 62  plainPrintf(pVdb
29640 65 2c 20 22 4f 46 46 53 45 54 20 22 29 3b 0a 20  e, "OFFSET ");. 
29650 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
29660 6e 45 78 70 72 28 70 56 64 62 65 2c 20 70 2d 3e  nExpr(pVdbe, p->
29670 70 4f 66 66 73 65 74 29 3b 0a 20 20 20 20 73 71  pOffset);.    sq
29680 6c 69 74 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70  lite3ExplainNL(p
29690 56 64 62 65 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  Vdbe);.  }.}.voi
296a0 64 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e  d sqlite3Explain
296b0 53 65 6c 65 63 74 28 56 64 62 65 20 2a 70 56 64  Select(Vdbe *pVd
296c0 62 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  be, Select *p){.
296d0 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
296e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
296f0 50 72 69 6e 74 66 28 70 56 64 62 65 2c 20 22 28  Printf(pVdbe, "(
29700 6e 75 6c 6c 2d 73 65 6c 65 63 74 29 22 29 3b 0a  null-select)");.
29710 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
29720 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 50 72 69    while( p->pPri
29730 6f 72 20 29 20 70 20 3d 20 70 2d 3e 70 50 72 69  or ) p = p->pPri
29740 6f 72 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  or;.  sqlite3Exp
29750 6c 61 69 6e 50 75 73 68 28 70 56 64 62 65 29 3b  lainPush(pVdbe);
29760 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
29770 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65 53 65 6c     explainOneSel
29780 65 63 74 28 70 56 64 62 65 2c 20 70 29 3b 0a 20  ect(pVdbe, p);. 
29790 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
297a0 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20  .    if( p==0 ) 
297b0 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74  break;.    sqlit
297c0 65 33 45 78 70 6c 61 69 6e 4e 4c 28 70 56 64 62  e3ExplainNL(pVdb
297d0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  e);.    sqlite3E
297e0 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
297f0 62 65 2c 20 22 25 73 5c 6e 22 2c 20 73 65 6c 65  be, "%s\n", sele
29800 63 74 4f 70 4e 61 6d 65 28 70 2d 3e 6f 70 29 29  ctOpName(p->op))
29810 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
29820 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 56 64  xplainPrintf(pVd
29830 62 65 2c 20 22 45 4e 44 22 29 3b 0a 20 20 73 71  be, "END");.  sq
29840 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70 28  lite3ExplainPop(
29850 70 56 64 62 65 29 3b 0a 7d 0a 0a 2f 2a 20 45 6e  pVdbe);.}../* En
29860 64 20 6f 66 20 74 68 65 20 73 74 72 75 63 74 75  d of the structu
29870 72 65 20 64 65 62 75 67 20 70 72 69 6e 74 69 6e  re debug printin
29880 67 20 63 6f 64 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g code.*********
29890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
298a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
298b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
298c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
298d0 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
298e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
298f0 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
29900 49 4e 29 20 2a 2f 0a                             IN) */.